本质上也是一个函数
是给现有的模块增添新的小功能 不修改原代码的前提下可以对原函数进行功能扩展
让我们可以在代码运行期间 动态地对指定函数增加一些功能(比如计算函数的运行时间、给函数添加调用日志、进行类型检查等等)
@+装饰器的名字
调用函数时相当于把函数当作一个参数传递到装饰器里面去
多个装饰器可以用在同一个函数上
带参数和不带参数的编译器 那么它们的调用顺序应该是自下而上依次执行
将目标函数进行打包,并返回一个加工后的新函数对象
def add(yyqx):
def inner():
x = yyqx()
return x + 1
return inner
def reduce(yyqx):
def inner():
x = yyqx()
return x + 1
return inner
def cube(yyqx):
def inner():
x = yyqx()
return x * x * x
return inner
def square(yyqx)
def inner():
x = yyqx()
return x * x
return inner
@add
@reduce
@cube
@squsre
def result():
return 2
print(test())
2.Lambda表达式
在使用函数时不需要给函数分配一个名称 该函数就是“匿名函数 在python中使用lambda表达式表示匿名函数
是对一个函数的引用
addYYQX = lamdba x:x + 1
addYYQX(1)
yyqx = [lambda x : x + 1,2,3]
yyqx[0](yyqx[1])
mapped = map(lambda x : ord(x) + 1,"yyqx")
list(mapped)
lambda 参数列表:lambda体
参数列表 类似函数中的形参 不同参数之间逗号隔开
可参考函数的参数那里对形参的讲解
lambda体 表达式的主要代码在此处编写 类似于函数体
不能是一个代码块,不能包含多条语句,只能包含一条语句
返回的lambda体运算式运算结果
与函数不同的是 不需要使用return语句返回
注意:参数列表可有可无,可以接收任意数量的参数,但只能返回一个值
lambda函数与def函数的异同点
a.lambda可以立即传递(无需变量),自行返回结果b.lambda在内部只能包含一行代码
c.lambda是一个为编写简单函数而设计的,而def用来处理更大的任务
d.lambda可以定义一个匿名函数,而def定义的函数必须有一个名字
e. 参数都是可选,也都会返回对象,用法基本一致
f. lambda是一个表达式而非语句,两者应用范围有不同
lambda函数优势:
a.对于单行函数且只有一个返回值,使用lambda表达式可以省去定义函数的过程,让代码更加简洁
b.对于不需要多次复用的函数,用lambda表达式可以在用完后立即释放,提高程序执行的性能。
c. lambda函数可以作为参数传递给其他函数也可 作为函数返回
d. lambda 是一个表达式 因此它可以用在常规函数不可能存在的地方
让函数退出之后还能保留状态 —— 闭包/使用全局变量/生成器
是一个迭代器 每次调用的时候提供一个数据 这样就不必创建完整的list,从⽽节省⼤量的空间 不走回头路
无法使用下标索引这种随机访问方式
和列表推导式的定义类似,生成器表达式使用 () 而不是 []
yyqx = (x for x in range(10))
for qxh in yyqx:
print(qzh)
Yield表达式代替return语句,调用该函数时会返回一个生成器
def yyqx()
qzh = 0
while qzh <= 5:
yeild qzh
qzh = qzh + 1
for qzh in yyqx()
print(qzh)
当我们使用 yield 时 在没有数据时 也会抛出 StopIteration 异常
a.调用该函数的时候不会立即执行代码,而是返回了一个生成器对象
b.当使用 next() (在 for 循环中会自动调用 next() ) 作用于返回的生成器对象时 函数 开始执行 在遇到 yield 的时候会停止 并返回当前的迭代值 当再次使用 next() 的时候 函数会从原来打断的地方继续执行 直到遇到 yield语 句 如果没有 yield 语句 则返回完所有元素后抛出异常
1、支持next函数
通过 next() 函数获得⽣成器的下⼀个返回值 每次调⽤ next(g) ,就计算出 g 的下⼀个元素的值,直到计算到最后⼀个元素,没有更多的 元素时,抛出 StopIteration 的异常。
def yyqx()
qzh = 0
while qzh <= 5:
yeild qzh
qzh = qzh + 1
qzh = yyqx()
next(qzh)
next(qzh)
next(qzh)
next(qzh)
next(qzh)
2、使用for循环/使用for-in循环
Next函数点一次出一次 需要不断调用 生成器是可迭代对象 可以使用for循环
def yyqx()
qzh = 0
while qzh <= 5:
yeild qzh
qzh = qzh + 1
for qzh in yyqx()
print(qzh)
(1)上次调⽤的所有局部变量都保持不变
(2)节约内存
(4)迭代到下⼀次的调⽤时 所使⽤的参数都是第⼀次所保留下的 在整个所有函数调⽤的参数都是第⼀次所调⽤时保留的 ⽽不是新创建的