【一】迭代器
1)概念
迭代器用来迭代去取值的工具,迭代是反复取值的过程
每一次迭代返回的结果是下一次开始的初始值
2)可迭代对象
内置有 iter()的方法的对象都是可迭代对象
num= [1,2,3]
print(num.__iter__())
#<list_iterator object at 0x000001F3C5589420>
- 可迭代对象
- 字符串、列表、字典、元组、集合
- 不可迭代对象
- 整数、浮点数、布尔
3)迭代器对象
内置有iter()和next()方法的对象
num = [1, 2, 3]
num_iter = iter(num)
print(next(num_iter)) #1
print(next(num_iter)) #2
- 迭代器对象
- 字符串、列表、字典、元组、集合
4)迭代器的优缺点
1.优点
- 不使用索引取值,字典不支持索引取值
- 取到这个值的时候就会保存到当前的状态,下一次从这个位置开始向取值
2.缺点
- 除非取尽,否则永远不知道终止索引在哪
- 只能取下一个值,无法返回开头
- 调用next取值的前提是已经生成并且得到了一个迭代器对象
- 迭代同一个对象只能重新创建
【二】生成器
1)概念
特殊的迭代器,可以在需要时生成数据,可逐个生成列表中的元素
2)生成器的创建方式
1.列表推导式
print([i for i in range(10)])
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 元组推导式 就是 生成器对象
print((i for i in range(10)))
# <generator object <genexpr> at 0x0000016EDEFDA4D0>
2.yield关键字
def add():
i = 0
while True:
i += 1
yield i
res = add()
print(next(res)) # 1
print(next(res)) # 2
print(next(res)) # 3
print(next(res)) # 4
3.yield关键字使用
def unm():
print('***')
while True:
numbers = yield
print(f'数字:{numbers}')
res = unm()
print(res) #<generator object unm at 0x0000023B843A9700>
print(next(res))
# ***
# none
print(next(res))
# 数字:None
# None
def unm():
print('***')
while True:
numbers = yield
print(f'数字:{numbers}')
res = unm()
next(res)
res.send(1)
res.send(2)
res.send(3)
# ***
# 数字:1
# 数字:2
# 数字:3
4.yield + next 搭配使用
def num_range(start, stop, step):
print('start')
while start < stop:
yield start
start += step
print('end')
res = num_range(0,3,1)
try:
while True:
print(next(res))
except:
...
# start
# 0
# 1
# 2
# end
标签:12,迭代,res,生成器,yield,next,num,print
From: https://www.cnblogs.com/Mist-/p/18152610