python--生成器,生成器推导式, yield from
一.生成器
生成器的本质就是迭代器,它一个一个的创建对象.
在python中有三种方式获取生成器: 1.通过生成器函数 2.通过各种推导式来实现生成器 3.通过数据的类型转换也可以获取生成器
二.生成器函数
生成器函数中包含yield,返回数据和return差不多, return会立即结束这个函数的执行, yield 可以分段的执行一个函数
生成器函数在执行的时候返回生成器,而不是直接执行此函数
能向下执行的两个条件:
1. __next__(),执行到下一个yield
2. send(),执行到下一个yield,给上一个yield位置传值
注意:
所有的生成器都是迭代器都可以使用for循环
都可以使用list()函数来获取到生成器内所有的数据
生成器中记录的代码而不是函数的运行
优点: 节省内存, 生成器本身就是代码. 几乎不占用内存
特点: 惰性机制, 只能向前. 不能反复
def func():
print('')
yield 222 gen = func() # 创建生成器.此时运行会把生成器函数中的代码记录在内存当中
ret = gen.__next__() # 当执行到__next__(),运行此空间中的代码,运行到yield结束
print(ret) #结果:
111
222
由于函数中存在了yield,那么这个函数就是一个生成器函数.这个时候,再执行这个函数的时候,就不再是函数的执行了,而是获取这个生成器,直接使用__next__()来执行
从这里可以看到,yield和return的效果是一样的,区别是yield是分段来执行一个函数,而return是直接停止函数
def func():
print('')
yield 222
print('')
yield 444
gen = func()
ret = gen.__next__()
print(ret) ret2 = gen.__next__()
print(ret2) ret3 = gen.__next__() # 最后一个yield执行完毕.再次__next__()程序报错,也就是说,和return无关了
print(ret3) #结果:
111
Traceback (most recent call last):
File "D:/pyworkspace/练习.py", line 94, in <module>
222
ret3 = gen.__next__()
333
StopIteration
444
程序运行完最后一个yield,后面继续进行__next__() 程序会报错
接下来我们来看send方法, send和__next__()一样都可以让生成器执行到下一个yield.
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)
send和__next__()区别:
1. send和next()都是让生成器向下走一次
2. send可以给上一个yield的位置传递值, 不能给最后一个yield发送值. 在第一次执行生
成器代码的时候不能使用send()

生成器可以使用for循环来循环获取内部的元素
def func():
print('')
yield 222
print('')
yield 444
print('')
yield 666 gen = func()
for i in gen:
print(i) #结果:
111
222
333
444
555
666
三.列表推导式,生成器表达式以及其他推导式
列表推导式:
1. 列表推导式是通过一行来构建你要的列列表, 列表推导式看起来代码简单. 但是出现错误之后很难排查.
列表推导式的常用写法:
[ 结果 for 变量 in 可迭代对象]
#给出一个列表,循环添加1到14
lst = []
for i in range(1, 15):
lst.append(i)
print(lst) 替换成列表推导式:
lst = [i for i in range(1, 15)]
print(lst)
2. 我们还可以对列表中的数据进行筛选
筛选模式:
[ 结果 for 变量 in 可迭代对象 if 条件 ]
# 获取1-100内所有的偶数
lst = [i for i in range(1, 100) if i % 2 == 0]
print(lst)
生成器表达式:
生成器表达式和列表推导式的语法基本上是⼀样的. 只是把[]替换成()
gen = (i for i in range(10))
print(gen)
结果:<generator object <genexpr> at 0x106768f10>
打印的结果就是⼀一个生成器. 我们可以使用for循环来循环这个⽣成器:
gen = ("麻花藤我第%s次爱你" % i for i in range(10))
for i in gen:
print(i)
四. yield from
yield from 是在Python3.3才出现的语法。所以这个特性在Python2中是没有的。
yield from 后面需要加的是可迭代对象,它可以是普通的可迭代对象,也可以是迭代器,甚至是生成器。
def func():
lst = ["衣服%s" % i for i in range(500)]
yield from lst # 可以把一个可迭代对象分别进行yield返回 lst1 = ["%s" % i for i in range(18)]
yield from lst1 gen = func()
print(gen.__next__())
print(gen.__next__())
python--生成器,生成器推导式, yield from的更多相关文章
- 巨蟒python全栈开发-第12天 生成器函数 各种推导式 yield from
一.今日主要内容总览(重点) 1.生成器(目的:帮助我们创建对象) (1)生成器的本质就是迭代器 (2)一个一个的创建对象 (3)创建生成器的方式: 1.生成器函数 2.通过生成器表达式来获取生成器 ...
- Python生成器、推导式之前襟后裾
生成器 函数体内有yield选项的就是生成器,生成器的本质是迭代器,由于函数结构和生成器结构类似,可以通过调用来判断是函数还是生成器,如下: def fun(): yield "我是生成器& ...
- python的各种推导式
python的各种推导式(列表推导式.字典推导式.集合推导式) 推导式comprehensions(又称解析式),是Python的一种独有特性.推导式是可以从一个数据序列构建另一个新的数据序列的结构体 ...
- 百万年薪python之路 -- 推导式
2.1列表推导式 首先我们先看一下这样的代码,给出一个列表,通过循环,想列表中添加1~10: li = [] for i in range(1,11): li.append(i) print(li) ...
- Python 入门之 推导式
Python 入门之 推导式 推导式就是构建比较有规律的列表,生成器,字典等一种简便的方式 1.推导式 (1)列表推导式 : <1> 普通循环: [变量 for循环] print([i f ...
- python基础——列表推导式
python基础--列表推导式 1 列表推导式定义 列表推导式能非常简洁的构造一个新列表:只用一条简洁的表达式即可对得到的元素进行转换变形 2 列表推导式语法 基本格式如下: [expr for va ...
- Python基础-列表推导式
python中列表推导式有三种数据类型可用:列表,字典,集合 列表推导式书写形式: [表达式 for 变量 in 列表] 或者 [表达式 for 变量 in 列表 if 条件] 1,列表推导式 ...
- python 3列表推导式的的一点理解!
python 3列表推导式的的一点理解! Python的列表推导式对于新手来说一般都难以理解,简单看个例子: [x * x for x in range(1,100)] 上面是一个很简单的列表推导式, ...
- python基础之 迭代器回顾,生成器,推导式
1.迭代器回顾 可迭代对象:Iterable 可以直接作用于for循环的对象统称为可迭代对象:Iterable.因为可迭代对象里面存在可迭代协议,所以才会被迭代 可迭代对象包括: 列表(list) 元 ...
- python note 12 生成器、推导式
1.生成器函数 # 函数中如果有yield 这个函数就是生成器函数. 生成器函数() 获取的是生成器. 这个时候不执行函数# yield: 相当于return 可以返回数据. 但是yield不会彻底中 ...
随机推荐
- Selenium Webdriver——Chrome调试Xpath
自己通过手写的Xpath要验证是否正确定位到元素,可以通过谷歌浏览器的Console功能(F12) 在console 输入:$x("") 定位去哪儿网的出发输入框: <inp ...
- 字符串转码 将文本转为PDF
@Test public void testBasic64Code() throws Exception { String strdata = new String("how are you ...
- 利用MemoryAnalyzer进行OutOfMemoryError的诊断分析
这篇帖子只介绍利用MemoryAnalyzer进行简单的JVM的堆的分析,至于JVM的内部结构是怎么样的,这里不进行分析.好吧,废话不多说:首先如果我们要分析JVM某个时刻的Heap的对象分配情况,我 ...
- java SSH框架
1整体流程: 1:hibernate流程: 2:hibernate使用流程: 2.1:建立用户jar包,导入hibernate相应的jar包 2.2 引入mysql的JDBC驱动包 2.3 在数据库中 ...
- Notepad++中的高级查找
准备以下字符串用来演示 abcdeab cdeabcde abcd eabcde 基于扩展的查找 基于扩展的查找不能算是真正的正则表达式搜索,因此这种查找方式仅是提供了支持转义字符.主要常用的 ...
- PatBlt
PatBlt 该函数使用当前选入指定设备环境中的刷子绘制给定的矩形区域.通过使用给出的光栅操作来对该刷子的像素和表面像素进行组合. 原型: BOOL PatBlt( HDC hdc, ...
- Git进阶--你可能不知道的很好用Git功能
一.刚提交的代码,发现需要微调一下 刚刚最新提交了一段代码,然后跟前端说,接口好了.过了2分钟,前端跟你说,哎,兄弟,那个金额能不能返回整数,不要小数点. 这个时候一般我们通常会修改一下之后,再提交一 ...
- SimpleReflection
[SimpleReflection] 取法线的x.y作为reflection-map的uv. Shader "Custom/SimpleReflection" { Properti ...
- Python_04-字符串操作
1 字符串的运算 字符串是程序中经常使用的元素,字符串的运算也很多,包括连接两个字符串,取一个字符串中的一部分,称为取子字符串,大小写转换,字符串与数值的转换等. 1.1 字符串的连接 ...
- php解决时间超过2038年
问题 超过2038年的时间 php怎么处理? echo date('Y-m-d',2147483647); //date函数能处理的最大整数2147483647 ->2038-01-19 就是2 ...