博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
生成器 生成器函数
阅读量:6657 次
发布时间:2019-06-25

本文共 2215 字,大约阅读时间需要 7 分钟。

本质就是迭代器.

一个一个的创建对象
创建生成器的方式:
1. 生成器函数
2. 通过生成器表达式来获取生成器
3. 类型转换(看不到)

生成器函数 (重点)

生成器函数中包含 yield , 返回数据和return差不多.
return会立即结束这个函数的执行
yield 可以分段的执行一个函数

生成器函数在执行的时候返回生成器. 而不是直接执行此函数

能向下执行的两个条件:

__next__(), 执行到下一个yield
send(), 执行到下一个yield, 给上一个yield位置传值

所有的生成器都是迭代器都可以直接使用for循环

都可以使用list()函数来获取到生成器内所有的数据

生成器中记录的是代码而不是函数的运行

def func():
print("我的天哪 ")

yield "宝宝"

gen = func() # 创建生成器. 此时运行会把生成器函数中的代码记录在内存

当执行到__next__(), 运行此空间中的代码, 运行到yield结束.

优点: 节省内存, 生成器本身就是代码. 几乎不占用内存

特点: 惰性机制, 只能向前. 不能反复

# def func():#     print("我叫周润发")#     return "林志玲"   # return在函数中表示返回的意思### ret = func()# print("返回值是", ret)# 函数中包含了yield, 此函数就是生成器函数# 大坑: 生成器函数运行之后. 产生一个生成器. 而不是运行函数# def func():#     print("我叫周润发")#     yield "林志玲"   # yield表示返回. 不会终止函数的执行#     print("宝宝干嘛去了??")#     yield "宝宝回来了"#     print("宝宝你在干嘛?")#     # yield "没了"## ret = func() # 执行函数, 此时没有运行函数.# # # 此时我们拿到的是生成器# # print("返回值是", ret) # 
## # 执行到下一个yield# print(ret.__next__()) # 第一次执行__next__此时函数才开始执行# print(ret.__next__()) # 执行到下一个yield# print(ret.__next__()) # StopIteration# 买衣服, JACK JONES 10000# def buy():# lst = []# for i in range(10000):# lst.append("衣服%s" % i)# return lst## lst = buy()# print(lst)# def buy():# for i in range(10000):# yield "衣服%s" % i## gen = buy() # 生成器或者迭代器的好处: 节省内存# # print(gen.__next__())# # print(gen.__next__())# # print(gen.__next__())## # for yifu in gen: 迭代器. __next__()# # print(yifu)## lst = list(gen) # 内部使用的是for循环 -> __next__()# print(lst)# send() -> __next__()# send()可以给上一个yield位置传值# def func():# print("韭菜盒子")# a = yield "韭菜鸡蛋"# print("a", a)# b = yield "韭菜西红柿"# print("b", b)# c = yield "火烧"# print("c", c)## gen = func()## print(gen.__next__()) # 第一个位置用send没有任何意义# print(gen.send("篮球")) # 给上一个yield位置传值# print(gen.send("足球"))# def eat():# print("我吃什么啊")# a = yield "馒头"# print("a=",a)# b = yield "⼤饼"# print("b=",b)# c = yield "⾲菜盒⼦"# print("c=",c)# yield "GAME OVER"## gen = eat() # 获取⽣成器## ret1 = gen.__next__()# print(ret1)# ret2 = gen.send("胡辣汤")# print(ret2)# ret3 = gen.send("狗粮")# print(ret3)# ret4 = gen.send("猫粮")# print(ret4)

  

转载于:https://www.cnblogs.com/YangWenYu-6/p/10105564.html

你可能感兴趣的文章
Oracle 存储过程了解
查看>>
python 一致性hash
查看>>
jquery submit()不能提交表单的解决方法
查看>>
iOS:KVO/KVC 的概述与使用
查看>>
Ubuntu 12.04 LTS 下配置 apache支持SPDY, 使用wireshark 抓包分析SPDY 协议
查看>>
安卓开发_慕课网_百度地图_添加覆盖物
查看>>
RabbitMQ基本概念和使用
查看>>
JSP网站开发基础总结《十三》
查看>>
SQL Server 2005 安装图解教程(Windows)
查看>>
3.0+百度地图在地图初始化的时候就弹框展示一个信息框,而不是用户点击poi时才弹出...
查看>>
第一部分 mongodb 基础篇
查看>>
俯卧撑:男人体能健康的检测标准
查看>>
坚持的力量 第二篇
查看>>
silverlight 进行本地串口调用的一种可行的解决方法
查看>>
emacs之配置4,颜色插件
查看>>
emmet语法
查看>>
[效率提升]工作中的那些命令行
查看>>
citus 多租户应用开发(来自官方文档)
查看>>
java鼠标双击和右键事件处理
查看>>
hash算法
查看>>