Python生成器
生成器可以理解为一种数据类型,这种数据类型自动实现了迭代器协议;
生成器在Python中有两种表达方式 ;1. 生成器函数 2. 生成器表达式
生成器函数:
1. 没有return ,而是使用yield
2. yield每次返回一个结果,在每个结果中间挂起函数状态,等待下次重新执行它离开的地方继续执行。
def generator(): yield 1 g=generator() print(g) # <generator object generator at 0x01595300> value=g.__next__() # 获取生成器 yield返回的值 print(value)
表达式生成器:
1.表达式生成器使用列表推导式生成,但是必须使用 圆括号(),不能使用中括号[ ]
generator=( i for i in range(10)) print(generator) # <generator object <generator> at 0x02ED54C0> value1=generator.__next__() value2=generator.__next__()
生成器的实用价值一, (减少内存的消耗)
假如有一个元素比较大的列表,里面的元素有一千万个,实用生成器和不使用生成器的差异;
1. 不适用生成器
def show_memory(unit='KB', threshold=1): '''查看变量占用内存情况 :param unit: 显示的单位,可为`B`,`KB`,`MB`,`GB` :param threshold: 仅显示内存数值大于等于threshold的变量 ''' from sys import getsizeof scale = {'B': 1, 'KB': 1024, 'MB': 1048576, 'GB': 1073741824}[unit] for i in list(globals().keys()): memory = eval("getsizeof({})".format(i)) // scale if memory >= threshold: print(i, memory)
li = [i for i in range(10000)] show_memory() # 列表所占用的内存大小为 40764024KB
2. 使用生成器
li = (i for i in range(10000)) show_memory() # 列表所占用的内存大小为 56KB
生成器的实用价值二, ( 多并发 )