python之生成器的初识

1. 生成器的定义

生成器的本质就是迭代器.python社区生成器和迭代器是一种

2. 生成器和迭代器区别

迭代器:

​ 都是Python给你提供的已经写好的工具或者通过数据转化得来的

生成器:

​ 需要我们自己构建的工具

3. 生成器的产生方式

  • 生成器函数
  • 生成器表达式
  • python给你提供的一些内置函数,返回一个生成器

4. 生成器函数 (***)

迭代器的return换成yield就是生成器,但是这个时候正常执行的结果是一个生成器的地址 (***)

# 生成器格式:***
def func():
    print(111)
    yield 22
    yield 33
ret = func() 
print(next(ret)) # 执行一次next返回一个值
print(next(ret)) 
# 输出结果
111
22
33

# 如果执行的时候再加一个print(next(ret))是会报错的,原因是生成器一个一个地往下执行,而且会记录位置,不走回头路,再加一个找不到值,就会报错.也就是一个yield对应一个next,next超过yield数量,就会报错.(***)

以下为帮助理解

# 讲解方法
def func():
    print(111)
    yield 22
gent = func()
ret = gent.__next__() # 这里要加一个方法.__next__()
print(ret)


def func():
	print(111)
	yield 22
ret = func()
print(ret) # 正常迭代器如果是这样的形式的话,到这一步是要进行执行的,打印结果先打印111,return 返回22 ,而在生成器中打印的是生成器的地址

如果要执行生成器需加一个方法:
print(next(ret))
# 执行结果
111
22
# 有几个yield就需要有几个print(next(ret)),yield少print多的话就会报错,就是print找不到了

5. 生成器的例题

# 吃包子
def bun():
	for i in range(1,2001):
		yield f'{i}号包子'
ret = bun()

for i in range(200): # 这个相当于执行next(ret)的次数

	print(next(ret))
	
# 输出结果
1号包子
2号包子
3号包子
4号包子4
5号包子
...
200号包子

# 迭代器制作包子是一次性完成,会占用大量的空间,而生成器制作包子,是你需要一个包子我制作一个,非常节省内存

# 优点: 补全内容

6. yield(***)

用途

yield : 对应next给next返回值

只要函数中出现了yield那么他就不是函数,它是生成器函数

7. yield与return的区别(***)

return一般在函数中只设置一个,他的作用是终止函数,并且给函数的执行者返回值。

yield在生成器函数中可设置多个,他并不会终止函数,next会获取对应yield生成的元素。

8. yield from(***)

用途

以直接把可迭代对象中的每一个数据作为生成器的结果进行返回,代替for循环的作用

例题: 这个例题一看就会

def func():
    lst = ['卫龙','老冰棍','北冰洋','牛羊配']
    yield lst
g = func()
print(g)
print(next(g))

# 输出结果
<generator object func at 0x1095c95e8>
['卫龙', '老冰棍', '北冰洋', '牛羊配']

yield写两个列表同时运行也不会产生交替的效果

def func():
    lst1 = ['卫龙','老冰棍','北冰洋','牛羊配']
    lst2 = ['馒头','花卷','豆包','大饼']
    yield from lst1
    yield from lst2
    
g = func()
for i in g:
    print(i)
    
# 输出结果

8. yield和yield from对比(***)

Yield: 对应next给next返回一个值

Yield from: 省代码 提升效率 代替for循环

posted @ 2019-06-20 21:49  爱咋闹  阅读(309)  评论(0编辑  收藏  举报