闭包
前面我们学习了回调函数,就是把函数作为一个参数进行传递。回调函数比较常见。
闭包则是将函数作为返回值,闭包可以延长变量的作用时间和域。下面举个例子:
def say(word):
def name(name):
print(word, name)
return name
hi = say('hello') #赋值了word = 'hello',返回函数name
hi('jason')
匿名函数
python中声明匿名函数的关键字是lambda。所谓匿名函数是指调用一次或者几次后就不再需要的函数。属于“一次性”函数。下面举个例子。
fun = lambda x, y: x + y
print(fun(2,5))
关键字yield
yield可以将函数执行的中间结果返回但不结束程序。
下面举个例子吧。
def fun(n):
i = 0
while i < n:
yield i
i += 1
for i in fun(10):
print(i)
通过yield将i的每一次结果进行了输出,这相当于把一个函数变为了生成器。
使用yield可以获得可以迭代(iterable)的效果。
想想这和将 yield i 这行代码替换为 print(i)有什么不同呢?
def fun(n):
i = 0
while i < n:
print(i)
i += 1
fun(10)
可以发现这样写代码,执行就会有打印输出,代码的复用性比较差。因为fun()函数没有返回值,其他函数没法获得这个数列。
如果将其保存为一个list又如何呢? append()是基于某个数组装载数据的操作。
def fun(n):
L = []
i = 0
while i < n:
L.append(i)
i += 1
return L
for i in fun(10):
print(i)
同样可以看到问题,随着n的增大,函数运行会占用大量内存。最好的方式还是使用yield。
那么yield到底干了什么呢?
其实yield是把一个函数变成了生成器,具有yield的函数不再是一个普通函数。
直接运行fun(10)是不会执行fun函数的,而是返回一个可以迭代的对象。
因此执行for循环时,每次都会去运行fun函数的内部代码,执行到yield i 时fun函数则返回一个迭代值。
简而言之:通过循环函数和yield 可以构建一个生成器,现生成一些数据。