day14 生成器的进阶
一、生成器的两种形式 1.生成器函数的应用
# def cloth():
# for i in range(100):
# yield '衣服%s'%i
#
# g = cloth()
# for i in g:
# print(i) # for i in range(100):
# print(g.__next__())
#
# for i in range(50):
# print(g.__next__())
工厂做衣服
#监听文件末尾追加的例子
# def tail():
# f = open('文件','r',encoding='utf-8')
# f.seek(0,2)
# while True:
# line = f.readline()
# if line:
# yield line
# import time
# time.sleep(0.1)
# g = tail()
# for i in g:
# print(i.strip()
注:理解while 循环的最佳方式 就是拆分内部
------------------------------------
# line = f.readline()
# if line:
# yield line
# import time
# time.sleep(0.1)
# line = f.readline()
# if line:
# yield line
# import time
# time.sleep(0.1)
# line = f.readline()
# if line:
# yield line
# import time
# time.sleep(0.1)
------------------------------------
神奇的 send ; 可以向生成器中传值
def func():
print('*'*10)
a = yield 5 #深度解析 执行第一个yield a = yield 5 时候 先计算等号右边部分,故返回了5,但是中断了,故等号左边部分没有计算 等下一个send时候开始计
print('a : ',a) 算等号左边,此时send带的参数传进来被a 接受
yield 10
# g = func()
# num = g.__next__()
# # print(num)
# num2 = g.send('alex')
# num2 = g.send('aaaa')
# print(num2) #从哪一个yield开始接着执行,就把一个值传给了那个yield
#send不能用在第一个触发生成器
#生成器函数中有多少个yield就必须有多少个next+send next() = .__next__()=send(None)
生成器的预激装饰器
计算平均值
def init(func): #生成器的预激装饰器
def inner(*args,**kwargs):
g = func(*args,**kwargs) #func = averager
g.__next__()
return g
return inner @init
def averager():
total = 0.0
count = 0
average = None
while True
term = yield average
total += term
count += 1
average = total/count
yield average # g_avg = averager()
# print(g_avg.send(10))
# print(g_avg.send(30))
魔性小用法:yield from 后边加一个可迭代对象 然后可以将其迭代取出
def func():
a = 'AB'
b = 'CD'
yield from a
# for i in a:yield i
yield from b
# for i in b:yield i 'A','B','C','D'
#返回了4次
g = func()
# for i in g:
# print(i)
总结:
#生成器函数:生成一个生成器的函数
#生成器的本质参数迭代器
#生成器函数的特点:
# 带有yield关键字
# 且调用之后,函数内的代码不执行 #触发执行的方式:
#next
#send (选会) :send(None) == __next__(),send在next的基础上传一个值到生成器函数内部
#send操作不能用在生成器使用的第一次
#for循环
2 列表推导式、生成器表达式
#列表推导式
# y = [1,2,3,4,5,6,7,8]
# x = [1,4,9,16,25,36,49,64]
# x = []
# for i in y:
# x.append(i*i)
# print(x)
# x = [i*i for i in y]
# print(x) #range(100)
# x2 = [i/2 for i in range(100)]
# print(x2) #生成器表达式 # x = [i*i for i in y]
# print(x)
# g = (i*i for i in y)
# print(g)
# print(list(g))
# for i in g:
# print(i) #
# l = ['鸡蛋%s'%i for i in range(10)]
# print(l)
# laomuji = ('鸡蛋%s'%i for i in range(10))
# for egg in laomuji:
# print(egg)
15、推导式的扩展:
multiples = [i for i in range(30) if i % 3 is 0]
print(multiples)
# Output: [0, 3, 6, 9, 12, 15, 18, 21, 24, 27]
被三整除的数
def squared(x):
return x*x
multiples = [squared(i) for i in range(30) if i % 3 is 0]
print(multiples)
30以内被3整除的数
names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']] print([name for lst in names for name in lst if name.count('e') >= 2]) # 注意遍历顺序,这是实现的关键
查找名字中含有两个e的
mcase = {'a': 10, 'b': 34}
mcase_frequency = {mcase[k]: k for k in mcase}
print(mcase_frequency)
k和vaule对调
mcase = {'a': 10, 'b': 34, 'A': 7, 'Z': 3}
mcase_frequency = {k.lower(): mcase.get(k.lower(), 0) + mcase.get(k.upper(), 0) for k in mcase.keys()}
print(mcase_frequency)
合并大小写对应的value值,将k统一成小写
squared = {x**2 for x in [1, -1, 2]}
print(squared)
# Output: set([1, 4])
计算列表中每个值的平方,自带去重功能
day14 生成器的进阶的更多相关文章
- python基础一 day14 生成器函数进阶
def generator(): print(123) content = yield 1 print('=======',content) print(456) arg = yield 2 '''' ...
- python基础一 day14 生成器函数进阶(1)
- 2018.11.06 生成器函数进阶&列表推导式&生成器表达式
1.生成器函数进阶 2.列表推导式 3.生成器表达式
- Python进阶-VI 生成器函数进阶、生成器表达式、推导式
一.生成器函数进阶 需求:求取移动平均数 1.应用场景之一,在奥运会气枪射击比赛中,每打完一发都会显示平均环数! def show_avg(): print('你已进入显示移动平均环数系统!') a ...
- day14.生成器进阶,推导式
生成器中取值的三种方法 方法1:next() 方法2:for 循环 方法3:数据类型的强制转换 def func(): for i in range(20): yield '赛车*{}'.format ...
- day14: 生成器进阶
1,复习,迭代器:双下方法很少直接调用,一般都是通过其他语法触发的:迭代器一定可迭代,可迭代的通过调用iter()方法皆可以得到一个迭代器. 迭代器很方便使用,所有的数据只可以取一次,节省内存空间.生 ...
- day14.生成器迭代器作业
1.写生成器,从文件中读取内容,再每一行读取的内容前加上 ‘***’之后返回给用户 def func(filename): word = input('输入你想找的内容:') with open(fi ...
- day14 生成器迭代器
迭代器(iterator) 可迭代对象: 可以使用迭代器取出数据的对象 判断一个对象是否是可迭代对象,就看这个对象有没有实现__iter__方法 所有的容器类型(包括字符串)都是可迭代的 迭代器的使用 ...
- Python_生成器函数进阶_39
def generator(): print(123) content = yield 1 #content接收的是send传的值 print('=======',content) print(456 ...
随机推荐
- 三位一体的漏洞分析方法-web应用安全测试方法
本文转自乌云知识库 0x00 前言 节选自: http://www.owasp.org.cn/OWASP_Conference/owasp-20140924/02OWASPWeb20140915.pd ...
- B11:解释器模式 Iterpreter
给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. UML: 示例代码: abstract class Expression { abstract pub ...
- PJOI PKU Campus 2011 B:A Problem about Tree LCA 求随意点x为根的y的父节点
题目链接:点击打开链接 题意:给定n个点 m个询问 以下n-1行给定一棵树 m个询问 x y 问把树转成以x为根 y的父节点是谁 第一种情况lca==y那就是x的第 dep[x] - dep[y] - ...
- lombok使用总结
前提 这篇文章主要介绍lombok的使用,至于lombok的源码和原理暂不探究,可以看上一篇文章插件化注解处理API去了解lombok的基本原理.参考资料: lombok官网 lombok官方教程-l ...
- homestead虚拟机,通过npm下载依赖包和解决运行gulp报错问题 yarn出错问题
homestead虚拟机,通过npm下载依赖包和解决运行gulp报错问题 yarn出错问题 1. 在虚拟器运行 npm 下载依赖组件时报错: npm ERR! EPROTO: protocol err ...
- HTML5中音频视频标签使用
HTML5中音频视频标签使用的最好方式 Html5中提供了<audio> <vedio>元素实现音频视频的引入播放 然而更好的方式
- 【DB2】报错:-30090 25000 指定的操作对远程执行失败
场景描述: 数据库:DB_1,DB_2 现在在DB_1中建立NICKNAME为CST_INFO_NICK,并且该别名指向数据库DB_2的CST_INFO表,在DB_1中建立存储过程,该存储过程需要 ...
- Android 自己定义控件开发入门(二)
上一次我们讲了一堆实现自己定义控件的理论基础.列举了View类一些能够重写的方法,我们对这些方法的重写是我们继承View类来派生自己定义控件的关键 我通过一个最简单的样例给大家展示了这一个过程,不管是 ...
- SQL Server事务详解
事务定义: 事务是单个的工作单元.如果某一事务成功,则在该事务中进行的所有数据更改均会提交,成为数据库中的永久组成部分.如果事务遇到错误且必须取消或回滚,则所有数据更改均被清除. 事务三种运行模式: ...
- robot.txt 文件 作用和语法
seo工作者应该不陌生,robots.txt文件是每一个搜索引擎蜘蛛到你的网站之后要寻找和访问的第一个文件,robots.txt是你对搜索引擎制定的一个如何索引你的网站的规则.通过该文件,搜索引擎就可 ...