python 生成器函数.推导式.生成器表达式
一.生成器
什么是生成器,生成器的实质就是迭代器
在python中有三种方式来获取生成器:
1.通过生成器函数
2.通过各种推导式来实现生成器
3.通过数据的转换也可以获取生成器
1 def func()
2 print("111")
3 yield 222
4 ret = func()
5 print(ret)
6
7 结果:
8 <generator object func at 0x10567ff68>
send方法和__next__()
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(111)
yield 222
print(333)
yield 444
print(555)
yield 666
gen = func()
for i in gen:
print(i) 结果:
111
222
333
444
555
666
二.列表推导式,生成器表达式以及其他推导式
首先给出如下代码
lst = []
for i in range(1,15)
lst.append(i)
print(lst)
替换成列表推导式:
lst = [i for i in range(1,15)]
print(lst)
语法:
[结果 for 变量 in 可迭代对象 if 条件]
列表推导式可对结果进行筛选:
lst = [i for i in range(1,15) if i%2 ==0]
print(lst)
生成器表达式与列表推导式的语法是一致的,只是把[]替换成了()
gen = (i for i in range(1,15))
print(gen) 结果:
<generator object <genexpr> at 0x106768f10>
打印的结果是一个生成器,我们可以通过for循环来循环这个生成器:
gen = (i for i in range(10))
for i in gen:
print(i)
生成器表达式同样可以进行筛选:
#获取1-100内能被3整除的数
gen = (i for i in range(1,100) if i %3 == 0) for num in gen:
print(num)
生成器表达式和列表推导式的区别:
1.列表推导式比较耗内存,一次性加载,生成器表达式几乎不占用内存,使用的时候采配合使用内存
2.得到的值不一样,列表推导式得到的是一个列表,生成器表达式获取的是一个生成器.
生成器的惰性机制:
def func()
print("")
yield 222 g = func() #生成器g
g1 = (i for i in g) #生成器g1,但是生成器的数据来源于g
g2 = (i for i in g1) #生成器g2,来源于g1 print(list(g)) #获取g中的数据,这时func()才会被执行,打印,获取到222,g完毕
print(list(g1)) #获取g1中的数据,g1的数据来源于g,但是g已经取完,g1也没有数据
print(list(g2)) #与g1同理
字典推导式:
# 把字典中的key和value互换
dic = {'a': 1, 'b': ''}
new_dic = {dic[key]: key for key in dic}
print(new_dic) # 在以下list中. 从lst1中获取的数据和lst2中相对应的位置的数据组成一个新字典
lst1 = ['jay', 'jj', 'sylar']
lst2 = ['周杰伦', '林俊杰', '邱彦涛']
dic = {lst1[i]: lst2[i] for i in range(len(lst1))}
print(dic)
集合推导式:
集合推导式可以帮我们直接生成一个集合,集合的特点:无序,不重复,所以集合推导式自带去重功能
lst = [1, -1, 8, -8, 12]
# 绝对值去重
s = {abs(i) for i in lst}
print(s)
生成器表达式:
def add(a, b):
return a + b def test():
for r_i in range(4):
yield r_i
g = test() for n in [2, 10]:
g = (add(n, i) for i in g) print(list(g)) 结果:
[20,21,22,23]
生成器的惰性机制
python 生成器函数.推导式.生成器表达式的更多相关文章
- Python_Mix*生成器,生成器函数,推导式,生成器表达式
		
生成器: 生成器的本质就是迭代器 生成器一般由生成器函数或者生成器表达式来创建,其实就是手写的迭代器 def func(): print('abc') yield 222 #由于函数中有了yield ...
 - Day12--Python--生成器,生成器函数,推导式,生成器表达式
		
一.昨日内容回顾 惰性机制(只有执行__next__()才会取值)二.今日主要内容 1.生成器 生成器:本质是迭代器,写法和迭代器不一样.用法和迭代器一样. ※生成器记录的是代码 2.生成器函数 生成 ...
 - day13 python生成器函数 推导式 生成器
		
day13 python 一.生成器 生成器的本质就是迭代器 生成器的特点和迭代器一样. 取值方式和迭代器一样(__next__()) 由生成器函数或生成器表达式来创建 ...
 - python全栈开发 生成器 :生成器函数,推导式及生成器表达式
		
python 全栈开发 1.生成器函数 2.推导式 3.生成器表达式 一.生成器函数 1.生成器: 生成器的本质就是迭代器 (1)生成器的特点和迭代器一样.取值方式和迭代器一样(__next__(), ...
 - python之生成器(~函数,列表推导式,生成器表达式)
		
一.生成器 概念:生成器的是实质就是迭代器 1.生成器的贴点和迭代器一样,取值方式也和迭代器一样. 2.生成器一般由生成器函数或者声称其表达式来创建,生成器其实就是手写的迭代器. 3.在python中 ...
 - Python生成器、推导式之前襟后裾
		
生成器 函数体内有yield选项的就是生成器,生成器的本质是迭代器,由于函数结构和生成器结构类似,可以通过调用来判断是函数还是生成器,如下: def fun(): yield "我是生成器& ...
 - python基础学习笔记——生成器与推导式
		
生成器 首先我们来看看什么是个生成器,生成器本质就是迭代器 在python中有三种方式来获取生成器 1.通过生成器函数 2.通过各种推到式来实现生成器 3.通过数据的转换也可以获取生成器 首先,我们先 ...
 - Learn day5 迭代器\生成器\高阶函数\推导式\内置函数\模块(math.time)
		
1.迭代器 # ### 迭代器 """能被next调用,并不断返回下一个值的对象""" """ 特征:迭代器会 ...
 - Python【day 12】生成器和推导式
		
一.生成器和生成器函数1.生成器和生成器函数的概念 1.生成器的本质是迭代器 2.函数中包含yield,就是生成器函数 2.生成器函数的写法 def func(): a =10 yield 20 ge ...
 
随机推荐
- Jenkins 的插件AnsiColor 多颜色
 - BZOJ 5106 [CodePlus2017]汀博尔
			
[题解] 二分答案.r要设好,不能随便设置为max(s,len),不然check的时候会爆long long #include<cstdio> #include<algorithm& ...
 - [bzoj1044][HAOI2008][木棍分割] (二分+贪心+dp+队列优化)
			
Description 有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连接处, 砍完后n根木棍被分成了很多段,要求满足总长度最大的一段长 ...
 - idea中找不到maven projects的集中解决办法
			
今天正常打开idea,却发现maven窗口找不到了:试了这些方法 首先idea自带了maven控件,不像Eclipse还需要下载控件,如果你以前有maven在右边,出于某种原因,消失找不到 了,你可以 ...
 - COJ 1156 Switching bulbs
			
一道模拟题目 对于所有0 还是 1 我们都可以想象做均为 0 的状态 v[i]表示原来的值 但是对于原来为1的要加上其所在的值作为初始值 然后转化后 a[i] = -v[i] , 如果原来为0 , ...
 - [luoguP2045] 方格取数加强版(最小费用最大流)
			
传送门 水题 ——代码 #include <queue> #include <cstdio> #include <cstring> #include <ios ...
 - mdbtools使用
			
1.导入数据库到mysql(将key.mdb导入MySQL的test数据库,此时只导入表结构) mdb-schema key.mdb mysql | mysql -u root -p test 2.将 ...
 - php获取代理服务器真实内网IP方法
			
功能:获取用户真实IP地址,代理服务器内网IP,防HTTP_CDN_FORWARDED_FOR注入 function getIP() { if (isset($_SERVER["HTTP_ ...
 - PHP rand()和mt_rand()的区别
			
rand()和mt_rand()作用都是产生一个随机整数,都有两种使用形式: 1.int rand(void) / int mt_rand(void) 2.int rand(int $min, int ...
 - Win32编程API  基础篇 -- 1.入门指南    根据英文教程翻译
			
入门指南 本教程是关于什么的 本教程的目的是向你介绍使用win32 API编写程序的基础知识(和通用的写法).使用的语言是C,但大多数C++编译器也能成功编译,事实上,教程中的绝大多数内容都适用于任何 ...