第十讲
程序员文章站
2022-05-28 13:37:34
...
函数(下)
高阶函数
- 接收函数作为参数
- 或者将函数作为返回值返回的函数就是⾼阶函数
list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
def fun1(n):
if n % 2 == 0:
return True
def fun(lst, fn):
new_list = []
for i in lst: #遍历list1
if fn(i): #调用函数fun1
new_list.append(i)
return new_list
print(fun(list1, fun1)) #将接收函数作为参数
闭包
- 将函数作为返回值也是⾼阶函数我们也称为闭包
- 闭包的好处
- 通过闭包可以创建⼀些只有当前函数能访问的变量
- 可以将⼀些私有数据藏到闭包中
- ⾏成闭包的条件:
- 函数嵌套
- 将内部函数作为返回值返回
- 内部函数必须要使⽤到外部函数的变量
def fun1(num1):
def fun2(num2):
res = num1 + num2
return res
return fun2
r = fun1(1) #fun1(1) = fun2
r(2) #fun1(1)() = fun2()
'''
3
'''
闭包里面的外部函数的变量可以保证不被销毁, 闭包要慎用
# 在闭包中修改外部函数的变量
def fun1(num1):
def fun2(num2):
nonlocal num1 # 告诉解释器,此处使用的不是本地的这个变量,而是外部变量
# global num1
num1 = 10
res = num1 + num2
return res
print(num1)
fun2(1)
print(num1)
return fun2
r = fun1(1) #fun1(1) = fun2
r(2) #fun1(1)() = fun2()
匿名函数
# 匿名函数的语法: (lambda 参数列表:运算)(实参) 用于做一些简单的运算, 而不用定义函数
res = (lambda a, b: a + b)(1, 2)
print(res)
'''
3
'''
c = 1
d = 2
dict1 = {
'key': (lambda a, b: a + b)(c, d)
}
装饰器
- 装饰器的引⼊:
- 我们可以直接通过修改函数中的代码来完成需求,但是会产⽣以下⼀些问题
- 如果修改的函数多,修改起来会⽐较麻烦
- 不⽅便后期的维护
- 这样做会违反开闭原则(ocp)
- 程序的设计,要求开发对程序的扩展,要关闭对程序的修改
- 装饰器的使⽤:
- 通过装饰器,可以在不修改原来函数的情况下来对函数进⾏扩展 在开发中,我们都是通过装饰器来扩展函数的功能的
def fun(c, d):
print('程序开始执行了')
print(mul(c, d))
print('程序执行结束了')
fun(1, 2)
#直接修改违反了ocp原则 o是开发对代码的拓展,c是关闭对代码的修改(开闭原则)
# 通用装饰器
def fun_out(old):
def fun_inner(*args, **kwargs): # 万能写法
print('程序开始执行了')
print(old(*args, **kwargs))
print('程序执行结束了')
return fun_inner
r = fun_out(old)
r()
@fun_out # @fun_out=fun_out(old) # 语法糖的写法 @fun_out
def fun1():
print('我是shq')
作业
import time
def get_time(fn):
def fun_inner():
begin = time.time()
fn()
end = time.time()
print('函数的执行时间为%s' % (end - begin))
return fun_inner
@get_time
def fun():
for i in range(10000):
print(i)
fun()
'''
9993
9994
9995
9996
9997
9998
9999
函数的执行时间为0.026936054229736328
'''
上一篇: 虚拟化使得中小企业进行大数据分析成为可能
下一篇: 机器人服务员亮相沈阳一餐厅当“跑堂”