Python迭代器和生成器

Python迭代器

1、可迭代对象和迭代器

  • 可迭代对象:

  实现了能返回迭代器的 iter 方法或者实现了 getitem 方法而且其参数是从零开始的索引的对象均为可迭代对象

  • 迭代器:

  迭代器是这样的对象:实现了无参数的 next 方法,返回下一个元素,如果没有元素了,那么抛出 StopIteration 异常;并且实现iter 方法,返回迭代器本身。

  字符串,列表或元组对象都可用于创建迭代器

  • 两者的关系:

  1)可迭代对象包含迭代器。
  2)如果一个对象拥有__iter__方法,其是可迭代对象;如果一个对象拥有next方法,其是迭代器。
  3)定义可迭代对象,必须实现__iter__方法;定义迭代器,必须实现__iter__和next方法。  

                           

 

2、代码示例(使用列表来创建迭代器)

(1)使用for循环遍历元素

list=[1,2,3,4]
it = iter(list)    # 创建迭代器对象
for x in it:
    print (x, end=" ")

结果:

1 2 3 4 

(2)使用next遍历元素

>>> list=[1,2,3,4]
>>> IT=iter(list)
>>> next(IT)
1
>>> next(IT)
2
>>> next(IT)
3
>>> next(IT)
4
>>> next(IT)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>>

3、创建迭代器

1)把一个类作为一个迭代器使用需要在类中实现两个方法 __iter__() 与 __next__() 

2)迭代器对象支持通过next取值,如果取值结束则自动抛出StopIteration

3)for循环内部在循环时,先执行__iter__方法,获取一个迭代器对象,然后不断执行next取值,有异常StopIteration时终止循环

# 创建迭代器类型
class IT(object):
    def __init__(self):
        self.counter = 0

    def __iter__(self):
        return self

    def __next__(self):
        self.counter += 1
        if self.counter == 3:
            raise StopIteration
        return self.counter

# 根据类实例化来创建一个迭代器
obj1 = IT()
v1 = next(obj1)
print(v1)
v2 = next(obj1)
print(v2)
v3 = next(obj1) # 抛出异常
print(v3)

obj2=IT()
for i in obj2: # 首先会执行迭代器对象的__iter__方法回去返回值,一直去返回的执行next对象
    print(i)

 Python生成器

1、生成器是一种使用普通函数语法定义的迭代器
2、包含yield语句的函数都被称为生成器
3、不使用return返回一个值,而是可以生成多个值,每次一个
4、每次使用yield生成一个值后,函数都将冻结,及再次停止执行
5、被重新唤醒后,函数将从停止的地方开始继续执行

l3 = [x * x for x in [1,2,3,4,5]] #列表推导式
结果:[1,4,9,16,25]
l4 = (x * x for x in [1,2,3,4,5])
>>> l4
结果:<generator object <genexpr> at 0x0000021CD228C7C8>
#generator就是生成器

使用 yield 实现斐波那契数列:

import sys

def fibonacci(n): # 生成器函数 - 斐波那契
    a, b, counter = 0, 1, 0
    while True:
        if (counter > n):
            return
        yield a
        a, b = b, a + b
        counter += 1
f = fibonacci(10) # f 是一个迭代器,由生成器返回生成

while True:
    try:
        print (next(f), end=" ")
    except :
        sys.exit()

 

posted @ 2021-12-29 21:31  钟胜一  阅读(939)  评论(0编辑  收藏  举报