030 迭代器 生成器

 

"""
目录: 
    一 迭代
    二 可迭代对象
    三 迭代器
    四 生成器
"""


一 迭代

'''
迭代: 一种操作,逐个获取数据过程。
    for...in...
'''

 

 

二 可迭代对象

# 判断可迭代对象
from collections.abc import Iterable
if __name__ == '__main__':
    type_1 = 123
    print(type(type_1), isinstance(type_1, Iterable))  # False

    type_2 = "abc"
    print(type(type_2), isinstance(type_2, Iterable))  # True

    type_3 = [1, 2, 3]
    print(type(type_3), isinstance(type_3, Iterable))  # True

    type_4 = (1, 2, 3)
    print(type(type_4), isinstance(type_4, Iterable))  # True

    type_5 = {"name": "Tome"}
    print(type(type_5), isinstance(type_5, Iterable))  # True

    type_6 = {"name", "Tome"}
    print(type(type_6), isinstance(type_6, Iterable))  # True

'''
<class 'int'> False
<class 'str'> True
<class 'list'> True
<class 'tuple'> True
<class 'dict'> True
<class 'set'> True
'''

 

if __name__ == '__main__':
    a = [1, 2, 3] # 可迭代对象

    print("__iter__" in dir(a))  # True
    print("__next__" in dir(a))  # False
    
    # list 是一个可迭代对象, 可以用for来遍历容器数据
    # for遍历
    for i in a:
        print(i, end=" ")    
'''
True
False
1 2 3
'''

 

三 迭代器

迭代器
标准: iter() 和 next()。
包含: __next__和 __iter__操作; 

 

# 迭代器: __iter__ __next__
if __name__ == '__main__':
    a = [1, 2, 3]

    it = iter(a)    # 创建迭代器对象
    print("__iter__" in dir(it))  # True
    print("__next__" in dir(it))  # False


    for i in it:    # for循环遍历
        print(i, end=" ")
        
    it = iter(a)
    while True:
        try:
            print(next(it), end=" ")    # 遍历下一个
        except StopIteration:           # 标识异常: 迭代完成
            sys.exit()
'''
True
True
1 2 3 1 2 3 
'''

 

 

# 自制迭代器  
class MyNumbers:
    def __iter__(self):
        self.a = 1
        return self
    def __next__(self):
        x = self.a
        self.a += 1
        return x

if __name__ == '__main__':
    myclass = MyNumbers()

    print("__iter__" in dir(myclass))   # True
    print("__next__" in dir(myclass))   # True

    myiter = iter(myclass)
    print(next(myiter)) # 1
    print(next(myiter)) # 2
    print(next(myiter)) # 3

 

四 生成器

'''
生成器:
    1 定义: 使用 yield 的函数被称为生成器。
    2 迭代: 生成器是一个返回迭代器的函数,具有迭代器的功能。
    2 作用: 每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值
'''

 

# 生成器函数
def f(n):
    i = 1
    while i <= n:
        yield i * 5 # 遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行
        i += 1

# 生成器函数
def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield b  # 遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行
        a = b
        b = a + b
        n = n + 1
    return 'done'


if __name__ == '__main__':
    f_it = f(6)
    for i in f(6):
        print(i, end=" ")
    
    # 生产器: 一定是迭代器;
    print()
    print("__iter__" in dir(f_it))  # True
    print("__next__" in dir(f_it))  # True

    for i in fib(6):
        print(i, end=" ")

 

posted @ 2022-07-10 02:43  火焰马  阅读(19)  评论(0编辑  收藏  举报