什么是生成器
可以理解为一种数据类型,自动实现了迭代器协议,所以生成器就是可迭代对象
#只要函数内部包含有yield关键字,那么函数名()的到的结果就是生成器,并且不会执行函数内部代码
生成器函数:常规函数定义,但是使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在这个结果中间挂起函数的状态,以便下次从它离开的地方继续执行
def test(): yield 1 yield 2 yield 3 g=test() print('来自函数',g)
生成器表达式: 类似于列表推导
三元表达式:
返回值在条件前面 'SB' if name == 'children' else '帅哥'
name='children' res= 'SB' if name == 'alex' else '帅哥' print(res)
运行结果
SB
列表解析:
一个正常的for循环函数
egg_list=[] for i in range(10): egg_list.append('鸡蛋%s' %i) print(egg_list)
但是这个函数可以一条语句写完,这个就是列表解析
egg=['鸡蛋%s' %i for i in range(10)] print(egg)
注意格式:输出内容在前,然后循环在后
列表解析也可以套用三元表达式
egg=['鸡蛋%s' %i for i in range(10) if i >5 ] print(egg)
输出i大于5 的
['鸡蛋6', '鸡蛋7', '鸡蛋8', '鸡蛋9']
列表解析如何和生成器结合起来?
把[]改为()即可
laomuji=('鸡蛋%s' %i for i in range(10))
这样就可以迭代了
这样的就叫生成器表达式
生成器只能遍历一次
总结:
把列表解析的[]换成()就是生成器表达式了
列表解析与生成器表达式都是一种遍历的编程方式,但是生成器表达式更节省内存
Python 不但使用迭代器协议,让for循环变得更加通用。大部分内置函数也是使用迭代器访问对象的。例如sum函数,map函数,reduce函数
print(sum(x**2 for x in range(4))) #不需要先生成列表,节省内存空间
而不用多次一句先构造一个列表
print(sum([x**2 for x in range(4)]))#因为先要生成列表,所以需要更大的内存