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

 

 

生成器的实用价值二, ( 多并发 )

 

posted @ 2020-09-21 15:45  leungqingyun  阅读(118)  评论(0)    收藏  举报