ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2022-04-16 11:02:21  阅读:168  来源: 互联网

标签:语句 15 generator 迭代 生成器 yield 函数


# 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()

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

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

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

 

标签:语句,15,generator,迭代,生成器,yield,函数
来源: https://www.cnblogs.com/gdbd/p/16152147.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有