33-高级特性之generator(1)
1. 列表生成式
################列表生成式
#method_1 {太原始,不推荐}
L = []
for i in range(1,11): #[1,11)L.append(i*i)
print(L)#method_2
#######最佳的办法
L1 = [x*x for x in range(1,11)]
print(L1)L2 = [x*x for x in range(1,11) if (x%2 == 0)]
print(L2)L3 = [m+n for m in "ABC" for n in "XYZ"]
print(L3)import os
dir = [d for d in os.listdir('.')] #.表示当前目录下
print(dir)#考虑到for 可以同时迭代两个甚至更多变量,把他应用到 列表生成式
dict = {'name':'haozhang', 'gender':'male', 'city':'HG'}
for k,v in dict.items():print(k,':',v)
print("\n")L4 = [k+':'+v for k,v in dict.items()]
print(L4)#
L = ['ABC', 'Hong', 'KONG']
print(L)
L5 = [s.lower() for s in L]
print(L5)L6 = ['ABC', 'HongKong', 123, '456']
print(L6)
L7 = [s.lower() for s in L6 if isinstance(s, str)]
print(L7)
L8 = [s.lower() for s in L6] #没有过滤整数,会报错
2. generator初步:
理解yield关键字的作用:
- 首先yield就像一个中断源,代码执行到yield处就中断,cpu执行其他函数去了。例如,
count = yield yyy
,代码到这一行,刚刚碰到yield就暂停本generator函数,并保存当前状态等待恢复。 - 直到
next(对象名)
,或者send(实参)
,来激活这一行语句。 - 暂停yield的同时,向主调函数返回yyy {就这个功能而言,yield yyy等价于return yyy}
- 终上所述,yield首先是挂起当前的generator函数,然后可以返回一个数据给主调函数(即使用了next(),send(),或者
用for迭代这个generator函数
的语句)。 用for迭代这个generator函数
本质还是利用了next(对象名)
- 首先yield就像一个中断源,代码执行到yield处就中断,cpu执行其他函数去了。例如,
代码测试:
#测试generator
#以创建list作为对比
L = [x*x for x in range(1,11)]
print(L)G = (x*x for x in range(1,11)) #Generator表达式
print(G)
print(next(G))
print(next(G))
print("\n")g = (xx for x in range(1,11)) #构造了一个generator类并返回了一个它的对象
for y in g: #迭代g的每一项xx
print(y)
print("\n")#测试第二种generator :Generator函数
#采用函数方式
def fib(n):
i,a,b = 0,0,1 #fib(0) = 0, fib(1) = 1, fib(2) = 1
while i < n: #执行n-1次,i的范围是[0,n-1],因为默认是fib(1),所以后面都是返回fib(n)
print(b)
a,b = b,a+b
i = i + 1
return 'done'
fib(6)
print("\n")#采用yield关键字,用generator实现
def G_fib(n): #实际上等价于创建了一个generator类,虽然表面上是一个函数
i,a,b = 0,0,1
while i < n: #[0,n-1]
yield b #此次返回并暂时挂起
a,b = b,a+b
i = i + 1
g2 = G_fib(6) #返回一个generator类创建的对象g2
print(g2)
for x in g2: #迭代g2中的每一项即:fib(i)
print(x)
print("\n")#创建一个产生所有奇数的generator
def odd():
i = 1
while True:
yield i
i = i + 2
g3 = odd()
print(next(g3))
print(next(g3))
print(next(g3))
print("\n")
##理论上可以通过for x in g3 遍历足够多的,或者说是所有的奇数,但这里没有必要
#{即节省内存,因为每次只会创建一个item;另外,非常的简洁地可以代表一个无穷的stream}#实现一个2^n{乘方}
def powtwo(n):
i = 1
while i <= n: #[1,n],操作了n次
yield 2 ** i
i += 1for x in powtwo(5): #计算2^5
print("中间过程依次是:",x)
print("the result is = ",x)
print("\n")'''
实现一个假设我们有一个快餐连锁店的日志。
#日志的第四列是每小时售出的披萨数量,我们想对近5年的这一数据进行求和。
#假设所有数据都是字符,不可用的数据都以"N/A"表示with open('sells.log') as file:
pizza_col = (line[3] for line in file) #取第4列,构建一个tuple
per_hour = (int(x) for x in pizza_col if x != 'N/A') #依据上面的tuple构建generator表达式
print("Total pizzas sold = ",sum(per_hour))
'''#########################################################################################
'''
最后一个主题:获取generator中,用return关键字返回的值
{因为现在只会返回yield关键字所带的值}
#通过解析StopIteration的内容获取return关键字后的值
#以获取杨辉三角的最后return的'haozhang'为例
'''
#做法1
def triangles():
N = [1] #要求返回N为list
while True:
yield N
N.append(0) #辅助元:处理每一行两边{左边一个1,右边一个1},保证它们在下一行依旧为1:0+1还是1
#append完之后,本行{假设为k-1} 新增N[k] = 0,同时在python中N[k]作为倒数第一个元素,也为N[-1]
#具体实现方法:对于下一行{假设是k}的N, N[0] = N[-1]+N[0],N[k] = N[k-1]+N[k]
N = [N[i-1]+N[i] for i in range(len(N))]i = 0
for L in triangles(): #匿名创建了triangles的generator对象,并迭代
print(L)
i += 1
if (i == 10): #打印10行
break
print("\n")#做法2:错位相加{L1左边和L2右边各自添加一个[0],即长度加1}
#[0]+N等价于在N左边加了一个元素0,N+[0]等价于在N右边加了一个元素0{可在控制台测试}
#zip(x, y)等价于:若x=[x1,x2], y=[y1,y2], 则zip(x,y) = [(x1,y1), (x2,y2)]
def triangles_2():
N = [1]
while True:
yield N
N = [sum(i) for i in zip([0]+N, N+[0])]
j = 0
for L2 in triangles_2():
print(L2)
j += 1
if (j == 10): #输出10行即停止
break
print("\n")#加入try-catch实现把return关键字返回的值打印出来
def My_Triangle(n):
N = [1]
i = 0
while (i < n): #[0,n-1]次
yield N
N = [sum(i) for i in zip([0]+N, N+[0])]
i += 1
return "haozhang is ok" #我想把这个也拿出来!GT = My_Triangle(10)
while True:
try:
x = next(GT)
print(x)
except StopIteration as e:
print("Generation return value is: ", e.value)
break理解send()的作用:
- next()等价于send(None),系统向generator发信号“在中断处重新启动”就是send(实参)的功劳,send()才是核心。
send(数据值)
等价于 给yield左边的变量赋值,例如:count = yield x
,当使用send(555)
激活上述的yield时,等价于执行count = 555
,然后再执行count=yield
的下一句代码- 终上所述,
send(实参)
可以给generator函数传入数据,并同时激活这个generator函数
代码测试:
def stupid_fib(n):
index = 0
a = 0
b = 1
while index < n:
sleep_cnt = yield b
print('let me think {0} secs'.format(sleep_cnt))
time.sleep(sleep_cnt)
a, b = b, a + b
index += 1print('-'10 + 'test yield send' + '-'10)
N = 20
sfib = stupid_fib(N) #得到一个generator对象
fib_res = next(sfib) #启动generator
while True:
print(fib_res)
try:
fib_res = sfib.send(random.uniform(0, 0.5)) #给函数传入暂停时长sleep_cnt,并重新激活generator
except StopIteration:
break
参考文献:
- http://python.jobbole.com/86069/
- 尚学堂python视频
- 廖雪峰python3
转载于:https://www.cnblogs.com/LS1314/p/8504552.html
33-高级特性之generator(1)相关推荐
- python generator输出_python 高级特性:Generator(生成器)
格式对比: List Imprehensions 格式:[ 语句 for .. in ..] Generator 格式:(语句 for .. in ..) 区别:List存储的是具体内容,每个元素都占 ...
- Python高级特性(切片,迭代,列表生成式,生成器,迭代器)
掌握了Python的数据类型.语句和函数,基本上就可以编写出很多有用的程序了. 比如构造一个1, 3, 5, 7, ..., 99的列表,可以通过循环实现: L = [] n = 1 while n ...
- Python (五) 高级特性
Python高级特性 一. 切片 python中提供了切片(Slice)操作符 , 可以方便的获取list或tuple中的某一段元素 . # -*- coding : utf-8 -*- #Pytho ...
- Python学习笔记(五) Python高级特性
Python高级特性 一. 切片 python中提供了切片(Slice)操作符 , 可以方便的获取list或tuple中的某一段元素 . # -*- coding : utf-8 -*- #Pytho ...
- python的高级特性:切片,迭代,列表生成式,生成器,迭代器
python的高级特性:切片,迭代,列表生成式,生成器,迭代器 1 #演示切片 2 k="abcdefghijklmnopqrstuvwxyz" 3 #取前5个元素 4 k[0:5 ...
- python高级特性_Python高级特性
参考原文 开篇:高级特性是用来简化我们常用操作的特性,合理利用高级特性可以使代码更简洁.明了. 切片 取list或tuple中的指定索引范围的操作,用循环十分繁琐,因此Python提供了切片(Slic ...
- Python高级特性:切片、迭代、列表生成式、生成器与迭代器
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 接着廖雪峰老师的学习教程,小编要开始加快推进Python的学习进程 ...
- python函数第二次运行报错_Python学习笔记2-函数、高级特性
函数 调用函数 要调用一个函数,需要知道函数的名称和参数,比如求绝对值的函数abs,只有一个参数 >>> abs(100) 100 >>> abs(-20) 20 ...
- python3自动释放线程_Python3高级特性:并发
前言 可迭代对象.迭代器.生成器 python中的 list, set 等是可迭代对象,可迭代对象使用 iter() 方法可以将其变成迭代器. 可迭代对象有 __iter__ 方法,该方法返回一个迭代 ...
- Zookeeper系列五:Master选举、ZK高级特性:基本模型
一.Master选举 1. master选举原理: 有多个master,每次只能有一个master负责主要的工作,其他的master作为备份,同时对负责工作的master进行监听,一旦负责工作的mas ...
最新文章
- XML和JSON 数据交换格式
- 原来JScript中的关键字'var'还是有文章的
- Spring Aop实例之AspectJ注解配置
- 浅谈Python http库 httplib2
- memset 数组初始化
- python中sorted的用法append_Python中高阶函数sorted()用法
- JAVA 获取操作系统属性
- php中修改元素值为5,php怎么改变元素数组的值
- MyBatis--工具类模板
- navicat链接mysql
- android美颜功能吗,Android美颜sdk接入之前需要知道这些知识吗
- 借教室(codevs 1217)
- 一个盒子两个摄像头,你就不知道怎么办了?
- 职教云怎么合并账号_云课堂智慧职教怎么注销账号
- 差分GPS-RTK-千寻
- php 做批量打印二维码,php语言开发的网站,如何实现批量打印快递单的功能?
- 情商高的人比智商高的可怕多了
- 收藏商品表设计_数据采集实战:商品详情页数据埋点
- BouncyCastle库
- lucene使用IndexWriter时遇到LockObtainFailedException: Lock obtain timed out 异常原因及解决办法
热门文章
- python怎么制作简单图_Python简单的制作图片验证码实例
- 个人博客网站的设计与实现_使用hexo来搭建个人网站博客(超详细教程)
- 一个小故事读懂Memcached漏洞
- 自动化测试===unittest和requests接口测试案例,测试快递查询api(二)
- 16位汇编第一讲简介
- 从CDN到云计算,网宿科技定制化打造“双龙头”格局
- Firefox和Chrome浏览器导出书签
- 第二季-专题8-不用内存怎么行
- 数据-第19课-递归的应用实战一
- PMC 任命Edward Sharp为首席战略及技术官