day13 python
一.生成器
生成器的本质就是迭代器
生成器的特点和迭代器一样. 取值方式和迭代器一样(__next__())
由生成器函数或生成器表达式来创建
其实就是手写的迭代器
二.生成器函数
函数中如果有yield, 那么这个函数就是生成器函数. 调用生成器函数: 函数名(), 得到的是生成器, 这个时候不执行
yield: 相当于return可以返回数据, 但是不会结束函数, 会往下走, 分段执行函数,
rst.__next__() 执行函数, 执行到下一个yield
rst.__next__() 继续执行函数, 执行到下一个yield
#普通函数
def func():
return 1
print(func())
#生成器函数
def func():
print('bajie')
yield 1 #只需要把return改成yield, 此时不会执行你的函数, 得到的是生成器
print('八戒')
yield 2
print(func())
rst = func() #获取的是生成器, 这个时候不执行
print(rst.__next__()) #本质是迭代器, 可以用 __next__ 方法, 此时会执行到下一个yield
print(rst.__next__()) #若没有下一个yield, 会在函数的结束前报错: StopIteration
生成器函数的应用
#普通函数, 占内存
def order():
lst = []
for i in range(1, 10001):
lst.append('clouse %s' % i)
return lst
print(order())
#生成器函数
def order():
for i in range(1, 10001):
yield 'clouse %s' % i
rst = order() #获取生成器(相当于老母鸡)
print(rst.__next__()) #几乎不占资源, 需要的时候生成
print(rst.__next__()) #惰性机制
print(rst.__next__()) #只能向前
send()方法
和__next_()一样, 可以执行到下一个yield, 同时还有另外一个功能, 可以给上一个yield位置传值
def func():
print('one line')
a = yield 123 #执行第一个__next__, 会在生成器中找到yield, 然后暂停, a = 这个没有执行, 如何解决 a 无值的问题?
print(a)
print('two line')
b = yield 456
print(b)
print('stree line')
c = yield 789
print(c)
print('four line')
d = yield 666
g = func()
print(g.__next__())
print(g.send('---------')) #给上一个yield结束的位置发送一个值
print(g.send('---------'))
print(g.send('---------'))
生成器可以用for循环
def func():
yield 1
yield 33
yield 222
yield 4444
for i in func(): #for的内部一定有__next__()方法
print(i)
print(list(func())) #这种也可以拿到生成器的值, 内部也有__next__()方法
三.推导式
循环装数据
lst = []
for i in range(1, 16):
lst.append('python %s' % i)
print(lst)
列表推导式, 用一句话来生成一个列表
lst = ['python %s' % i for i in range(1, 16, 2)] # [ 前面是结果(列表中元素的格式) 空格 用for来产生i的值 ]
lst = ['python %s' % i for i in range(1, 16) if i%2 ==1] #完整语法 [结果 for循环 判断]
print(lst)
names = [['bajie','wukong'],['bajie', 'datanog'],['ooaa','bajiebajie']] #找到名字中用两个字母a的名字
lst = [name for ll in names for name in ll if name.count('a') == 2] #标点全用空格代替
print(lst)
字典推导式
lst = [11,22,33,44]
dic = {i:v for i,v in enumerate(lst) if i < 2} #语法和列表推导式类似
print(dic)
集合推导式
s = {i for i in range(100) if i%2 == 1} #和字典推导式类似, 只有一个key
print(s)
四.生成器表达式(没有元组推导式)
因为元组不可变(不能增删改), 叫做生成器表达式
tu = (i for i in range(10) if i < 6) #得到的是生成器
print(tu)
print(tu.__next__())
print(tu.__next__())
生成器的惰性机制: 1.生成器取值每次都要到源头取, 源头只能向前, 数据取完就没有了
def func():
print('one line')
yield 666
yield 777
yield 888
g1 = func() #获取生成器
g2 = (i for i in g1) #生成器
g3 = (i for i in g2) #生成器
print('---------------') #到这里所有的生成器都没有执行
print(list(g1)) #[666, 777, 888] 全拿了
print(list(g2)) #[] #所以这里为空
print(list(g3)) #[] #同理这里为空
生成器, 要值的时候才会拿
def add(a, b): #求和
return a + b
def test(): #生成器函数(0,1,2,3)
for i in range(4):
yield i
g = test() #获取生成器
for n in [2, 10]: #n = 2, 10
g = (add(n, i) for i in g) #当n=2时, g = (add(n, i) for i in g) 此时无执行(只记录代码, 不带值), 当n=10时 g = (add(n, i) for i in g), 把上次g带入本次
#为 g = (add(n, i) for i in add(n, i) for i in g))
# (20,21,22,34)<-10 (10,11,12,13)<-(10,11,12,13)<-10 (0,1,2,3)<-(0,1,2,3)
print(list(g)) #当遇到list时,生成器执行, 此时 n = 10(所有的n都是10), 代入上面的表达式
#__next__(), send(), for循环, list 这四种情况, 生成器才执行, 去取值
练习:
enumerate()
lst = ['bajie', 'wukong', 'datang']
for i, el in enumerate(lst, 100): #获取下标和元素, 默认从0开始,可以当成下标. 这里是从100开始
print(i, el)
- python 生成器函数.推导式.生成器表达式
一.生成器 什么是生成器,生成器的实质就是迭代器 在python中有三种方式来获取生成器: 1.通过生成器函数 2.通过各种推导式来实现生成器 3.通过数据的转换也可以获取生成器 1 def func ...
- Python_Mix*生成器,生成器函数,推导式,生成器表达式
生成器: 生成器的本质就是迭代器 生成器一般由生成器函数或者生成器表达式来创建,其实就是手写的迭代器 def func(): print('abc') yield 222 #由于函数中有了yield ...
- Day12--Python--生成器,生成器函数,推导式,生成器表达式
一.昨日内容回顾 惰性机制(只有执行__next__()才会取值)二.今日主要内容 1.生成器 生成器:本质是迭代器,写法和迭代器不一样.用法和迭代器一样. ※生成器记录的是代码 2.生成器函数 生成 ...
- python全栈开发 生成器 :生成器函数,推导式及生成器表达式
python 全栈开发 1.生成器函数 2.推导式 3.生成器表达式 一.生成器函数 1.生成器: 生成器的本质就是迭代器 (1)生成器的特点和迭代器一样.取值方式和迭代器一样(__next__(), ...
- Python生成器、推导式之前襟后裾
生成器 函数体内有yield选项的就是生成器,生成器的本质是迭代器,由于函数结构和生成器结构类似,可以通过调用来判断是函数还是生成器,如下: def fun(): yield "我是生成器& ...
- python基础学习笔记——生成器与推导式
生成器 首先我们来看看什么是个生成器,生成器本质就是迭代器 在python中有三种方式来获取生成器 1.通过生成器函数 2.通过各种推到式来实现生成器 3.通过数据的转换也可以获取生成器 首先,我们先 ...
- python — 生成器、推导式、递归
目录 1 生成器(函数的变异) 2 推导式 3 递归 1 生成器(函数的变异) 判断一个函数是否是生成器函数:只需看函数内部是否有yield # 生成器函数(内部是否包含yield) def func ...
- Learn day5 迭代器\生成器\高阶函数\推导式\内置函数\模块(math.time)
1.迭代器 # ### 迭代器 """能被next调用,并不断返回下一个值的对象""" """ 特征:迭代器会 ...
- Python【day 12】生成器和推导式
一.生成器和生成器函数1.生成器和生成器函数的概念 1.生成器的本质是迭代器 2.函数中包含yield,就是生成器函数 2.生成器函数的写法 def func(): a =10 yield 20 ge ...
随机推荐
- oracle的分析函数over
参考地址:https://www.cnblogs.com/chinas/p/7058771.html?utm_source=itdadao&utm_medium=referral#_lab2_ ...
- Calendar日历
Calendar calendar=Calendar.getInstance(); //上一年的今天 calendar.add(Calendar.YEAR,-1); System.out.printl ...
- 生成RSA公钥密钥
非对称加密就不做详细解释了,它的过程简单来说呢,就是A与B通讯,A公布了一个公开密钥,而且A手里还有一个私有的钥匙,叫密钥.B使用A给的公钥将内容进行加密,然后传递给A.A拿到加密后的内容后,用私钥解 ...
- 您的加密USB驱动器是否安全?黑客又是如何攻破的?
您如何确定您使用的“安全”USB驱动器是否真的安全,并且您存储的数据无法提取?这正是Google公司和中国网络安全研究人员在最近的2018年黑帽美国大会上以艰难的方式攻击加密的USB密钥”的问题. 研 ...
- Shell输入命令时一些有用的快捷键
Ctrl + u: 从光标所在位置一直删除到开头 Ctrl + k: 从光标所在位置一直删除到尾 Ctrl + b: 光标向后移动一个字符 Ctrl + f: 光标后前移动一个字符 Alt + b: ...
- BZOJ 4238 电压 解题报告
BZOJ 4238 电压 考虑一条边成为答案以后,删去Ta后剩下的图是一个或很多个二分图,即没有奇环 则一条边可以成为答案,当且仅当自己在所有奇环的交上且不在偶环上. 考虑建出dfs树,那么返祖边一定 ...
- linux 文件及目录结构体系
linux 目录的特点: 1). /是所有目录的顶点 2).目录结构像一颗倒挂的树 3).目录和磁盘分区是没有关联的 4)./下不同的目录可能对应不同的分区或磁盘 5).所有的目录都是按照一定的类别有 ...
- paper 165: 人脸的两个关键问题--光照和姿态
人脸识别关键问题研究 a) 人脸识别中的光照问题 光照变化是影响人脸识别性能的最关键因素,对该问题的解决程度关系着人脸识别实用化进程的成败.研究思路是将在对其进行系统分析的基础上,考虑对其进行量化研究 ...
- 某些 UI效果 实现思路
一.日历组件: https://blog.csdn.net/amork/article/details/7257212 二.瀑布流 三.轮播图:轮播图已经用的很多了,结构也简单就不去将了. 四.分页组 ...
- SelfCert wcf中 生成x5.09证书的工具
http://blog.pluralsight.com/selfcert-create-a-self-signed-certificate-interactively-gui-or-programma ...