迭代

一、生成器:

'''
在 Python 中,使用了 yield 的函数被称为生成器(generator)
在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,
返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行
注意:生成器特别适合用于选历 一些大序列对象, 它无须将对象的所有元素都载入内存后才
 开始进行操 作,仅在迭代至某个元素时才会将该元素载入 内存
'''


def square(num):
    for i in range(1, num + 1):
        yield i * i
    print('over')
    # return  # 函数已经结束,不能继续调用。return可以省略


g = square(5)
print(next(g))
print(next(g))
print(next(g))
print(g.__next__())
print(g.__next__())  # next(g) 等价于 g.__next__()
# print(next(g)) 已经over了,继续迭代会抛出:StopIteration


for i in square(5):
    print(i, end=' ')
print()
g = lambda a, b: a + b
print(g(1, 2))
# ------------------------------------------------------------




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 是一个迭代器,由生成器返回生成

既然f是一个迭代器,那么就可以把f包装成一个list或tuple或set
l = list(f) # 确实可行

for i in f:
    print(i, end=' ')


# 也可以用下面的方法迭代
# import sys
# while True:
#     try:
#         print(next(f), end=" ")
#     except StopIteration:
#         sys.exit()


class MyNumbers:
    def __iter__(self):
        self.a = 1
        return self

    def __next__(self):
        if self.a <= 20:
            x = self.a
            self.a += 1
            return x
        else:
            raise StopIteration


myclass = MyNumbers()
myiter = iter(myclass)

for x in myiter:
    print(x)

二、迭代器:

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

class Test:
   def __init__(self):
        self.__a = 0  # 这里赋值是因为如果不用iter和for in,直接用next(Test()) 或者 Test().__next__() 时就不会调用__iter__ 方法。

    def __iter__(self):
        # 把对象装载进iter的时候或者for in 时会调用这个方法:it = iter(t)
     # 但是,如果用next(Test()) 或者 Test().__next__() 时就不会调用__iter__ 方法。,所以,需要在构造函数中给__a赋值。
        print('iter')
        self.__a = 1
        return self

    def __next__(self):
        # 循环迭代的时候,会调用这个方法。
        if self.__a < 10:
            self.__a += 1
            return self.__a
        else:
            raise StopIteration


t = Test()
# Test本来就是一个迭代器,可以直接for in了,不需要再用iter包装。
it = iter(t)
for i in it:
    print(i)

tt = Test()
print(next(tt))
print(next(tt))
print(next(tt))

 

posted @ 2020-11-10 06:09  老谭爱blog  阅读(114)  评论(0)    收藏  举报