一. 生成器
本质就是迭代器.
一个一个的创建对象
创建生成器的方式:
1. 生成器函数
2. 通过生成器表达式来获取生成器
3. 类型转换(看不到)

 

二. 生成器函数 (重点)
生成器函数中包含 yield , 返回数据和return差不多.
return会立即结束这个函数的执行
yield 可以分段的执行一个函数

生成器函数在执行的时候返回生成器. 而不是直接执行此函数

能向下执行的两个条件:
__next__(), 执行到下一个yield
send(), 执行到下一个yield, 给上一个yield位置传值

所有的生成器都是迭代器都可以直接使用for循环
都可以使用list()函数来获取到生成器内所有的数据

生成器中记录的是代码而不是函数的运行
def func():
print(\"我的天哪 \")

yield \"宝宝\"

gen = func() # 创建生成器. 此时运行会把生成器函数中的代码记录在内存
当执行到__next__(), 运行此空间中的代码, 运行到yield结束.

优点: 节省内存, 生成器本身就是代码. 几乎不占用内存
特点: 惰性机制, 只能向前. 不能反复

 1 def func():
 2     print(\'我叫周润发\')
 3     yield \'林志玲\'  # yield表示返回. 不会终止函数的执行
 4     print(\'我干嘛了?\')
 5     yield \'宝宝回来了\'
 6     print(\'宝宝你在干嘛\')
 7     yield \'没了\'
 8 ret = func()  # 执行函数,此时没有运行函数
 9 # 此时我们拿到的是生成器
10 print(\'返回值是\', ret)  #<generator生成器   func at 0x0000018DAC980EB8>
11 
12 # 执行到下一个yield
13 print(ret.__next__())  #第一次执行到__next__此时函数才开始执行
14 print(ret.__next__())  #执行到下一个yield
15 print(ret.__next__())  # StopIteration

 

.各种推导式 (诡异)

列表推导式 [结果 for循环 if]

1 lst = [\'python%s期\' % i for i in range(1, 19)]
2 print(lst)

字典推导式 {结果(k:v) for循环 if}

 

1 dic = {\"主食\": \"炒面\", \"副食\": \"小拌菜\", \"\": \"疙瘩汤\"}
2 dic1 = {v: k for k, v in dic.items()}
3 print(dic1)

集合推导式 {结果(k) for循环 if}

 

生成器表达式

 

 1 g = (i for i in range(10))  # 生成器表达式
 2 
 3 print(g)  # <generator   <genexpr> at 0x000001C354050EB8>
 4 
 5 print(g.__next__())  # 0
 6 print(g.__next__())  # 1
 7 print(g.__next__())  # 2
 8 print(g.__next__())  # 3
 9 print(g.__next__())  # 4
10 print(g.__next__())  # 5
11 print(g.__next__())  # 6
12 print(g.__next__())  # 7
13 print(g.__next__())  # 8
14 print(g.__next__())  # 9

 

 

四.yield from

def func():
    lst = [\'衣服%s\' %i for i in range(500)]
    yield from lst  # 可以吧一个可迭代对象

gen = func()
print(gen.__next__())
print(gen.__next__())
print(gen.__next__())

 

收藏 打印