Python 原创基础教程
3.2 与函数有关的重要关键字
3.2.1 lambda表达式
一种函数的简写形式,类似匿名函数
1 | func = lambda x:x+1 |
3.2.2 global关键字
在编写程序的时候,如果想为一个在函数外的变量重新赋值,并且这个变量会作用于许多函数中时,就需要告诉python这个变量的作用域是全局变量。此时用global语句就可以变成这个任务,也就是说没有用global语句的情况下,是不能修改全局变量的。
1 | # coding:utf-8 |
3.2.3 yield关键字(生成器)
迭代器和生成器的概念
1.迭代器协议
对象需要提供next方法,它要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代
可迭代对象就是:实现了迭代器协议的对象
协议是一种约定,可迭代对象实现迭代器协议,Python的内置工具(如for循环,sum,min,max函数等)使用迭代器协议访问对象
通过dir()查看是否实现__iter__即迭代器协议
2.生成器协议
生成器可以不立即返回全部结果,而是需要的适合逐个返回结果,因此生成器自动实现迭代器协议
生成器函数,通过在函数里添加yield代替return,yield一次返回一个结果
示例
1 | def g(N): |
生成器表达式,类似列表推导,返回一个迭代器,而不是全部结果
1 | squares1 = [x**2 for x in range(5)]#结果,一个列表 |
用yield改写函数
1 | def fab(max): |
1 | def fab(max): |
a.yield 的作用就是把一个函数变成一个generator,带有yield的函数不再是一个普通函数,Python解释器会将其视为一个generator,调用fab(5)不会执行 fab 函数,而是返回一个 iterable 对象!
b.在 for 循环执行时,每次循环都会执行 fab 函数内部的代码,执行到 yield b 时,fab 函数就返回一个迭代值,下次迭代时,代码从 yield b 的下一条语句继续执行,而函数的本地变量看起来和上次中断执行前是完全一样的,于是函数继续执行,直到再次遇到 yield。
c.改写fab函数如果通过返回List能满足复用性的要求,但是更有经验的开发者会指出,该函数在运行中占用的内存会随着参数max的增大而增大,如果要控制内存占用,最好不要用List来保存中间结果,而是通过 iterable 对象来迭代。