2022.04.15-python学习之生成器(generator)和迭代器(iterator)

# File : learning_013_generator_and_iterator.py
# Datetime : 2022/4/15 0015 17:44

import sys

# 生成器generator 和迭代器iterator
# 在Python中生成器函数与迭代器协议的概念联系在一起。包含yield语句的函数会被特地编译成生成器。
# 当函数被调用时,他们返回一个生成器对象,这个对象支持迭代器接口。
# 函数也许会有个return语句,但它的作用是用来yield产生值的。

# 生成器(generator):
# 生成器(generator)的两种创建方式
# 1. 列表 元组 字典推导式
# 类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表
# 如:

# lis = (x for x in range(10))

# 2. 使用yield函数
# 常规函数的定义,但是,使用yield语句而不是return语句返回结果。
# yield语句语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次从它离开的地方继续执行
# 如使用yield from生成一个斐波那契数列
# def fibonacci(max):  # 斐波那契列数生成器
#     a, b = 0, 1
#     while b < max:
#         yield b
#         a, b = b, a + b
#
#
# def fibonacci_wrapper(fun_iterable):  # 生成器包装
#     yield from fun_iterable
#
#
# warp = fibonacci_wrapper(fibonacci(99))  # 可迭代对象包装
# for i in warp:
#     print(i)

# 生成器(generator)的作用:
# 1、节省资源消耗,和声明序列不同的是生成器在不使用的时候几乎不占内存,也没有声明计算过程!
# 2、使用的时候,生成器是随用随生成,用完即刻释放,非常高效!
# 3、可在单线程下实现并发运算处理效果。

# 迭代器iterator
# 生成器都是迭代器,迭代器不一定是生成器
# python中可迭代的数据类型有:list/dict/tuple/string/set/bytes。
# 整形是不可迭代数据类型。可以通过collections模块的Iterable来进行判断。
# 可迭代对象:  有__iter__方法(),有__next__()方法
# 迭代器有两个基本的方法:iter() 和 next()。
lis = [1, 2, 3]
it = iter(lis)  # 创建迭代器对象
for i in it:
    print(i)

# 使用next()方法
lis2 = [1, 2, 3]
it2 = iter(lis2)  # 创建迭代器对象
while True:
    try:
        print (next(it2))
    # StopIteration 异常用于标识迭代的完成,StopIteration 异常来结束迭代。防止出现无限循环的情况
    except StopIteration:
        sys.exit()

#迭代器和生成器的区别
# 三、迭代器和生成器的异同

# 都可以节约内存和空间
# 随取随用的特点方便、灵活

# 生成器一定是迭代器,可以使用迭代器的方法遍历;但迭代器不一定生成器
# 生成器是断点保存的机制确保随取随用,而迭代器一般是将可迭代对象转变而成。

 

posted @ 2022-04-16 10:49  陈亦洺  阅读(71)  评论(0编辑  收藏  举报