6.闭包+匿名函数+关键字yield -python入门到精通
闭包
前面我们学习了回调函数,就是把函数作为一个参数进行传递。回调函数比较常见。 闭包则是将函数作为返回值,闭包可以延长变量的作用时间和域。下面举个例子:
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 可以构建一个生成器,现生成一些数据。