12.迭代器 与 生成器

【一】迭代器

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
posted on 2024-04-23 12:21  晓雾-Mist  阅读(1)  评论(0编辑  收藏  举报