1.生成器
-
Generator
是一个用于创建迭代器的简单而强大的工具。 它们的写法类似标准的函数
- 生成器首先它是一个迭代器,和迭代器一样,生成器只能被遍历迭代一次,因为每次迭代的元素不是像列表元素一样,已经在内存中,每迭代一次,生成一个元素
- 生成器和迭代器的主要区别在于:
1、它们的创建方式不同
2、生成器有一些特殊方法是迭代器不具有的
2.创建生成器的两中方法
(一)yield 编写生成器函数,函数的返回值就是生成器
-
yield
的使用方法和return
类似。不同的是,return
可以返回有效的 Python 对象,而 yield
返回的是一个生成器,函数碰到 return
就直接返回了,而使用了 yield
的函数,到yield
返回一个元素,当再次迭代生成器时,会从 yield
后面继续执行,直到遇到下一个yield
或者函数结束退出
- 承接上文迭代器,还是用游戏中的英雄技能举例子
#!/usr/bin/python
def hero(*skills):
print('英雄的释放技能分别如下')
for release_skill in skills:
yield release_skill
skill = hero('一骑当千','单刀赴会','青龙偃月','刀锋铁骑')
for s in skill:
print(s)
-
hero
函数中传入英雄的1-4
技能
- 来看一下运行结果
# 微信搜索:伊洛的小屋
# 个人主页:https://yiluotalk.com/
(yiluo) ➜ Code python hero.py
英雄的释放技能分别如下
一骑当千
单刀赴会
青龙偃月
刀锋铁骑
- 这样使用比迭代器的好处是,生成器不会像迭代器放在内存中,是用户传入数值动态生成的
(二)生成器表达式
(yiluo) ➜ Code python3
Python 3.7.5 (default, Nov 29 2019, 14:32:46)
[Clang 9.0.0 (clang-900.0.39.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> s = (x+x for x in range(0,4))
>>> s
<generator object <genexpr> at 0x1058537d0>
>>> for x in s:
... print(x)
...
0
2
4
6
-
s
就是生成器,然后遍历查看结果
- 迭代完一次之后再迭代这个生成器,它不会打印元素,也不会报错
- 使用生成器有什么好处呢?因为生成器不是把所有元素存在内存,而是动态生成的,所以当你要迭代的对象有非常多的元素时,使用生成器能为你节约很多内存,这是一个内存友好的特性
网友评论