Python高级篇(08):生成器

一、生成器定义和作用

  1. 定义:Python中,一边循环一边计算 的机制,生成器对象也是迭代器对象,支持for循环、next()方法...等。
  2. 作用:循环的过程中不断推算出后续的元素 ,这样就不必创建完整的list ,从而节省大量的空间

二、生成器创建方法

1、简单生成器:将列表推导式的[ ]改为()

python 复制代码
# 列表生成式
_list = [i for i in range(10)]
print(type(_list))  # <class 'list'>
print(_list)  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 生成器
_generator = (i for i in range(10))
print(type(_generator))  # <class 'generator'>
print(_generator)  # <generator object <genexpr> at 0x7fbcd92c9ba0>
# 生成器对象取值
print(f"第一次迭代数据是:{_generator.__next__()}")  # 第一次迭代数据是:0
print(f"第二次迭代数据是:{next(_generator)}")  # 第二次迭代数据是:1
# 注意从第三个元素开始了!
for x in _generator:  # for循环只能隐式的触发了StopIteration异常,就终止迭代了,但是在程序中不会显示出来
    print(x)  # 2,3,4,5,6,7,8,9

2、函数对象生成器:函数中使用yield关键字,函数就变成了一个generator

  • yield和return语句使用方法类似,但是普通函数运行到return语句则直接返回代码不再执行;而生成器对象会运行到yield后返回,再下次调用next(),会从yield语句后继续执行。
python 复制代码
def gen_generator():
    yield "start"
    for i in range(2):
        yield i
    yield "end"


gen = gen_generator()
print(f"从gen对象取到的第一个值为:{next(gen)}")  # 从gen对象取到的第一个值为:start
print(f"从gen对象取到的第二个值为:{next(gen)}")  # 从gen对象取到的第二个值为:0
print(f"从gen对象取到的第三个值为:{next(gen)}")  # 从gen对象取到的第三个值为:1
print(f"从gen对象取到的第四个值为:{next(gen)}")  # 从gen对象取到的第四个值为:end
# print(f"从gen对象取到的第五个值为:{next(gen)}")  # 抛出StopIteration异常


# 等同于
gen2 = (i for i in ["start", 0, 1, "end"])
for v in gen2:
    print(v)

三、yield生成器高级应用

send()方法概念:暂时保留先不进行,等待需要时再进行。作用与next()作用相似。

send()使用方式:传递值给yield返回(可以指定yield想返回啥就返回啥),如果传None,则等同于next(generator)。

  • send()和next()区别:
    • send(value)可以传递value给yield。
    • next()不能传递特定的值,只能传递None进去。
python 复制代码
def genterator_test():
    while True:
        print("--1-")
        num = yield 100
        print("--2--", "num=", num)


g = genterator_test()
# 等同于next(generator)
print(g.send(None)) # --1-
                    # 100

# 传递值给yield返回
print(g.send(11))   # --2-- num= 11
                    # --1-
                    # 100

# 传递值给yield返回
print(g.send(22))   # --2-- num= 22
                    # --1-
                    # 100
相关推荐
2301_8038756115 分钟前
PHP 中处理会话数组时的类型错误解析与修复指南
jvm·数据库·python
m0_7436239216 分钟前
c++如何批量修改文件后缀名_std--filesystem--replace_extension【实战】
jvm·数据库·python
2401_8734794033 分钟前
如何利用IP查询定位识别电商刷单?4个关键指标+工具配置方案
开发语言·tcp/ip·php
我爱cope1 小时前
【从0开始学设计模式-10| 装饰模式】
java·开发语言·设计模式
2501_914245931 小时前
CSS如何处理CSS变量作用域冲突_利用特定类名重写变量值
jvm·数据库·python
菜鸟学Python1 小时前
Python生态在悄悄改变:FastAPI全面反超,Django和Flask还行吗?
开发语言·python·django·flask·fastapi
<-->1 小时前
Megatron(全称 Megatron-LM,由 NVIDIA 开发)和 DeepSpeed(由 Microsoft 开发)
人工智能·pytorch·python·深度学习·transformer
测试19982 小时前
2026最新软件测试面试八股文【附文档】
自动化测试·软件测试·python·测试工具·面试·职场和发展·测试用例
浪浪小洋2 小时前
c++ qt课设定制
开发语言·c++
charlie1145141912 小时前
嵌入式C++工程实践第16篇:第四次重构 —— LED模板,从通用GPIO到专用抽象
c语言·开发语言·c++·驱动开发·嵌入式硬件·重构