欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

【2020Python修炼记21】Python语法入门—生成器

程序员文章站 2022-09-04 22:26:30
【目录】 一 、生成器和yield 1、什么是生成器 2、为何要有生成器 3、如何使用生成器 二、yield表达式应用 三 、三元表达式、列表生成式、生成器表达式 3.1 三元表达式 3.2 列表生成式 3.3 生成器表达式 一、生成器(generator)和yield 1、yield关键字 有了y ......

【目录】

一 、生成器和yield

1、什么是生成器

2、为何要有生成器 

3、如何使用生成器

二、yield表达式应用

三 、三元表达式、列表生成式、生成器表达式

3.1 三元表达式

3.2 列表生成式

3.3 生成器表达式

 

一、生成器(generator)和yield

1、yield关键字

有了yield关键字,我们就有了一种自定义迭代器的实现方式

yield可以用于返回值,但不同于return,函数一旦遇到return就结束了,而yield可以保存函数的运行状态挂起函数,用来返回多次值

 

2、什么是生成器

 若函数体包含yield关键字,再调用函数,并不会执行函数体代码,得到的返回值即生成器对象

栗子:

>>> def my_range(start,stop,step=1):
...     print('start...')
...     while start < stop:
...         yield start
...         start+=step
...     print('end...')
... 
>>> g=my_range(0,3)
>>> g
<generator object my_range at 0x104105678>

生成器内置有__iter__和__next__方法,所以生成器本身就是一个迭代器

>>> g.__iter__
<method-wrapper '__iter__' of generator object at 0x1037d2af0>
>>> g.__next__
<method-wrapper '__next__' of generator object at 0x1037d2af0>

 

因而我们可以用next(生成器)触发生成器所对应函数的执行:

>>> next(g) # 触发函数执行直到遇到yield则停止,将yield后的值返回,并在当前位置挂起函数
start...
0
>>> next(g) # 再次调用next(g),函数从上次暂停的位置继续执行,直到重新遇到yield...
1
>>> next(g) # 周而复始...
2
>>> next(g) # 触发函数执行没有遇到yield则无值返回,即取值完毕抛出异常结束迭代
end...
traceback (most recent call last):
  file "<stdin>", line 1, in <module>
stopiteration

for循环迭代版:

>>> for i in countdown(3):
...     print(i)
... 
countdown start
3
2
1
done!

 

3、为何要有生成器 

 

4、如何使用生成器

 

二、yield表达式应用

 

三 、三元表达式、列表生成式、生成器表达式

1、三元表达式

 

2、列表生成式

 

3、生成器表达式