python 可迭代对象 / 迭代器 / 生成器

1. 可迭代对象

  集合, 元组, 列表, 字符串, 字典 都是可迭代对象,  但并不是迭代器

2. 迭代器

  iter() 函数用来生成迭代器。

a = [1,2,3,4,5]

print('对迭代器iter1进行for循环')
iter1 = iter(a)   # 返回一个迭代器对象
for i in iter1:
    print(i)

iter2 = iter(a)  # 返回一个迭代器对象
print('下面开始对迭代器iter2进行第一次for循环')
for j in iter2:
    print(j)
    break
print('下面开始对迭代器iter2进行第二次for循环')
for j in iter2:
    print(j)
print('下面开始对迭代器iter2进行第三次for循环')
for j in iter2:
    print(j)


# 打印结果:

对迭代器iter1进行for循环
1
2
3
4
5
下面开始对迭代器iter2进行第一次for循环
1
下面开始对迭代器iter2进行第二次for循环
2
3
4
5
下面开始对迭代器iter2进行第三次for循环

# 注释 : 对iter2进行第一次for循环时, 将iter2中对第一个元素迭代掉了, 所以对iter2进行第二次循环,迭代剩余元素, 迭代掉剩余元素后, 第三次迭代, 已经没有可迭代对元素了

 

3. 对迭代器对象 进行迭代 

  next() 函数返回迭代器的下一个项目,括号里面的元素必须是迭代器对象。所以 next() 函数要和生成迭代器的 iter() 函数一起使用。

  

a = [1,2,3,4,5]

iter1 = iter(a)

print(next(iter1))
print(next(iter1))
print(next(iter1))
print(next(iter1))
print(next(iter1))
print(next(iter1))


# 打印结果:

1
2
3
4
5
Traceback (most recent call last):
  File "E:\Avicii\练习\2023-20-10.py", line 10, in <module>
    print(next(iter1))
StopIteration

#注释  :  next()没有下一个元素则会触发 StopIteration 异常

 

a = [1,2,3,4,5]

iter1 = iter(a)
for i in iter1:
    print(next(i))

# 打印结果:

TypeError: 'int' object is not an iterator


# 注释 :  next() 使用对象是迭代器. 而不是可迭代对象

 

4.  生成器

  生成器yield是一种返回迭代器的函数,  生成器的调用方式与普通函数相同,只不过返回的是一个迭代器。

  yield  -->  只能用于函数中

  yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator. 调用函数时,不会执行函数, 而是返回一个迭代器

   Python中yield函数是一个生成器(generator),可用于迭代;在函数中yield类似于return,不同的是,yield返回一个return的值并且记住这个返回值的位置,下次迭代就从记住的这个位置开始,并且下一次迭代时,从上一次迭代遇到的yield后面的代码开始执行。

 

def a():
    print('aaa')

    p = yield '123'

    print('bbb')

    k = yield '234'


r = a()

print(next(r))

print(next(r))

# 打印结果:

aaa

123

bbb

234

  由以上代码以及运行结果不难发现,每一个next返回值,都会在执行到yield函数后暂停生成,下一次next返回值则会继续从上一个暂停的位置执行,这也是yield函数的特点与用法

posted @ 2023-02-12 00:15  Avicii_2018  阅读(50)  评论(0编辑  收藏  举报