python 迭代器、生成器

1、迭代器 Iterator

  可以通过next(it)函数取值的对象就是迭代器

 

  【1】迭代器是访问可迭代对象的工具

  【2】迭代器是指用iter(obj) 函数返回的对象(实例)。

  【3】迭代器可以用next(it) 函数获取可迭代对象的数据

2、迭代器协议

  迭代器协议是指对象能够使用next函数获取下一项数据,在没有下一项数据时触发一个StopIteration异常来终止迭代的约定

  迭代器协议实现方法:

     __next__(self) 方法来实现迭代器协议

3、可迭代对象

  【1】是指能用iter(obj) 函数返回迭代器的对象(实例)

  【2】可迭代对象内部需要定义__iter__(self) 方法来返回迭代器对象

 

4、迭代器函数

  【1】iter(iterable) 从可迭代对象中返回一个迭代器,iterable 必须是能提供一个迭代器的对象。即,用iter函数可以返回一个可迭代对象的迭代器

      第二种形式: iter(callable, sentinel) -> iterator

             后续补充

  【2】next(iterator[,default]) 从迭代器iterator中获取下一个元素。即,迭代器对象能用next函数获取下一个元素。

      如果没有default,则当无法获取下一个元素,触发StopIteration异常。

      如果有default,则当无法获取下一个元素时,不会触发StopIteration,而是返回default。     

 

  【3】迭代器只能向前取值,不会后退

In [7]: L = [2, 3, 5, 7]
   ...: for x in L:
   ...:     print(x)
   ...: else:
   ...:     print('循环结束')
   ...: print("---------------")
   ...: it = iter(L)  # 从L中获取一个迭代器
   ...: while True:
   ...:     try:
   ...:         x = next(it)
   ...:         print(x)
   ...:     except StopIteration:
   ...:         print("循环结束")
   ...:         break
   ...:
2
3
5
7
循环结束
---------------
2
3
5
7
循环结束
In [9]: L = [2, 3, 5, 7]
   ...: it = iter(L)  # 用L对象返回能访问L的迭代器, it绑定迭代器
   ...: next(it)  # 2
   ...: next(it)  # 3
   ...: next(it)  # 5
   ...: next(it)  # 7
   ...: next(it)  # StopIteration 通知(没有数据)
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
<ipython-input-9-b65817a9e736> in <module>
      5 next(it)  # 5
      6 next(it)  # 7
----> 7 next(it)  # StopIteration 通知(没有数据)

StopIteration:

In [10]:      

生成器 Generator

1、生成器

  生成器是能够动态提供数据的对象,生成器对象也是可迭代对象(实例)

  【1】生成器函数

  【2】生成器表达式

2、生成器函数                                                                                                  

  【1】生成器函数定义

      含有yield语句的函数是生成器函数,此函数被调用将返回一个生成器对象   

          ① 生成器函数的调用将返回一个生成器对象,生成器对象是一个可迭代对象

      ② 在生成器函数调用return 会触发一个StopIteration异常

  【2】yiled 语句

    yield 表达式

    ① yield 用于 def 语句定义的函数中,目的是将此函数作用生成器函数使用

    ② yield 用来生成数据,供迭代器的next(it) 函数使用   

In [66]: def myyield():
    ...:     yield 2
    ...:     yield 3
    ...:     yield 5
    ...:     yield 7
    ...:     print("生成结束")
    ...:
    ...:
    ...: for x in myyield():
    ...:     print(x)
    ...:
2
3
5
7
生成结束
In [67]: def myyield():
    ...:     print("即将生成2")
    ...:     yield 2
    ...:     print("即将生成3")
    ...:     yield 3
    ...:     print("即将生成5")
    ...:     yield 5
    ...:     print("即将生成7")
    ...:     yield 7
    ...:     print("生成结束")
    ...:
    ...: gen = myyield()  # gen 绑定一个生成器对象
    ...: it = iter(gen)  # 用生成器返回一个迭代器
    ...:
    ...: # 从迭代器获取一个数据(此时生成器函数才开始执行)
    ...: print(next(it))
即将生成2
2

In [68]: print(next(it))
即将生成3
3

In [69]: print(next(it))
即将生成5
5

In [70]: print(next(it))
即将生成7
7

In [71]: print(next(it))
生成结束
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
<ipython-input-71-4d0222393be1> in <module>
----> 1 print(next(it))

StopIteration:

In [72]:
# 用生成器函数生成一定范围内的自然数
def myinteger(n):
    i = 0  # 自然数从0开始
    while i < n:
        yield i
        i += 1

for x in myinteger(3):
    print(x)

3、生成器表达式

  (表达式 for 变量 in 可迭代对象 [if 真值表达式 ])

  if 语句可以省略。

  用推导式的形式创建一个新的生成器。

In [21]: gen = (x ** 2 for x in range(1, 5))
    ...: it = iter(gen)
    ...: next(it)  # 1
Out[21]: 1

In [22]: next(it)
Out[22]: 4

In [23]: next(it)
Out[23]: 9

In [24]: next(it)
Out[24]: 16

In [25]: next(it)
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
<ipython-input-25-bc1ab118995a> in <module>
----> 1 next(it)

StopIteration:

 

 

 

 

posted @ 2020-12-23 16:16  昱成  阅读(95)  评论(0编辑  收藏  举报