1.迭代器总结(迭代取值和索引取值的对比)
1.1定义
迭代器主要就是一个迭代的取值,另外一种取值方式就是(索引)向下取值。
1.2分类
迭代取值:1.不依赖索引取值的一种取值方式。
2.不能一直取值只能从左到右依次取值。
索引取值:1.他能够做到重复取值。
2.他需要容器类型。
2.生成器
2.1背景
通过列表式生成式,我们可以创建一个列表,但是受到内存的限制,列表的容量是有限的,且列表里的元素我们访问的很少,所以大部分就占据了空间形成了浪费。所以就需要一种算法来推算他就可以节省很多空间。而这种一边推算一边使用的算法我们叫做生成器他是自定义迭代器中的一种。
2.2生成器如何使用
关键字:yield
当函数中出现了yield时,函数在没被调用时依然是普通函数,但是只要一调用函数,那么函数就不是普通的函数了从而变成的生成器。
def index():
print('from index')
print('from index')
print('from index')
yield 123,234,345 # 以元组的方式返回
print('second')
print('second')
print('second')
print('second')
yield 'hello'
print('three')
yield
res=index() # res.__iter__()
print(res) # <generator object index at 0x000002CDB20BEA50>
## 生成器其实就是一个自定义的迭代器
# res.__next__() # 只要你调用next方法,代码就会走到函数中第一个yield关键字所在的位置停住
# res.__next__() # 代码从上一次yield停住的地方继续往下执行,走到遇到下一个yield停住
print(res.__next__()) # None 123
print(res.__next__()) # None 123
print(res.__next__()) # None 123
3.生成器yield的其它用法
def eater(name):
print('%s:正在吃...' % name)
while True:
food = yield
print('%s正在吃%s' % (name, food))
'''eater就变成了生成器'''
res=eater('jerry') # 生成器对象:generator object
print(res) # <generator object eater at 0x0000021869489B30>
res.__next__()
# res.__next__()
# send做了两件事情:1. 传值给yield、2. 执行__next__
res.send('包子')
res.send('水果')
res.send('水果')
res.send('水果')
res.send('水果')
res.send('水果')
res.send('水果')
res.send('水果')
res.send('水果')
4.生成器的表达式
4.1定义
把迭代器和生成器看成一个工厂,什么时候需要数据了什么时候他们才开始动,目的就是为了节省空间。且你不给他们数据他们也不会生成数据。
4.2表达式
res = [name for name in names_list]
print(res) # 就是一个列表
res1 = (name for name in names_list)
print(res1)
names_list = ['kevin', 'jerry', 'tony', 'oscar']
res1 = (name for name in names_list)
print(res1) # <generator object <genexpr> at 0x00000218F4569CF0>
print(res1.__next__())
print(res1.__next__())
print(res1.__next__())
print(res1.__next__())
5.yield和return的对比
5.1yield
1.代码遇到yield不是终止而是停住
2.yield也支持返回值但是可以支持多个,以元组的方式返回
3.yield可以把一个函数变为生成器,且用next取值
5.2return
1.代码遇到return就会停止
2.return可以返回多个值且以元组的方式返回