十三. Python基础(13)--生成器进阶
十三. Python基础(13)--生成器进阶
1 ● send()方法
2 ● send()函数的简单案例
def fun(): print('*') value = yield 1 print('**', value) yield 2
g = fun() print(g.__next__()) # print(g.__next__()) # ** None print(g.send("aaa")) # ** aaa # print(g.send("bbb")) # 警示"StopIteration"异常, 因为此时"bbb"没有可以用来赋值的的yield表达式 ''' * 1 ** aaa 2 ''' |
# send()和__next__()工作的起始位置是完全相同的 # send()可以把一个值作为信号量(semaphore)传到函数中去 # 在生成器执行伊始, 只能先用__next__()或send(None), 因为用send()传递非None参数的时候,在生成器中必须有一个未被赋值的yield表达式 # __next_()方法以及send()方法的数量 不同多于 yield表达式的数量, 否则警示异常StopIteration. |
3 ● 计算累计平均数
def wrapper(func): # 这个装饰器中只做一件事:g.__next__; 或者next(g), 也就是激活生成器(next是内置函数) def inner(*args, **kwargs): g = func(*args, **kwargs) # 最好不要跟外面的创建的gen生成器重名 g.__next__() # 也可以是g.send(None), 用来激活生成器 return g return inner
@wrapper def average_func(): total = 0 count = 0 average = 0 while True: # 这个while True可以让使用者一直使用send方法, 也就是调用这个函数的可生成一个取之不尽用之不竭的生成器, 注意这里不会造成死循环 value = yield average total += value count += 1 average = total/count
gen = average_func() print(gen.send(30)) print(gen.send(50)) print(gen.send(10)) |
''' 30.0 40.0 30.0 ''' |
4 ● 列表推导式/字典推导式/集合推导式(没有元组推导式)
列表推导式: for i in range(0, 21, 2) |
字典推导式: 案例①: dic = {'k1':'v1', 'k2':'v2'} print({dic[key]: key # {'v1': 'k1', 'v2': 'k2'}
案例②: dic = {'a': 10, 'b': 34, 'A': 7, 'Z': 3} dic_new = {k.lower(): dic.get(k.lower(), 0) + dic.get(k.upper(), 0) print(dic_new) # {'a': 17, 'b': 34, 'z': 3} |
集合推导式: (自带去重的功能) print({i**2 for i in [1, -1, 2]}) # {1, 4} |
5 ● 生成器表达式
把列表解析的[]换成()得到的就是生成器表达式. |
gen_list = (i**2 for i in range(0, 21, 2) if i < 11) for i in gen_list: print(i) ''' 0 4 16 36 64 100 ''' |
dic = {'k1':'v1', 'k2':'v2'} gen_a = (key for key in dic) gen_b = (key for key in dic.items()) for i in gen_a: print(i) for i in gen_b: print(i) ''' k1 k2 ('k1', 'v1') ('k2', 'v2') ''' |
gen_col = (i**2 for i in {1, -1, 2}) for i in gen_col: print(i) ''' 1 4 1 ''' |
6 ● 面试题1
def demo(): for i in range(4): yield i
g=demo()
g1=(i for i in g) g2=(i for i in g1)
print(list(g1)) # [0, 1, 2, 3] print(list(g2)) # [] |
7 ● 面试题2
def add(n,i): return n+i
def test(): for i in range(4): yield i
g=test() for n in [1,10]: g=(add(n,i) for i in g) # 生成器推导式 print(list(g))
# [1, 2, 3, 4] # []注意这一步是没有数跟10相加, 因此为空. |
def add(n,i): return n+i
def test(): for i in range(4): yield i
g=test() for n in [1,10]: g=(add(n,i) for i in g)
print(list(g))
''' ① 上面的三个g是三个不同的迭代器 ② 上面一段相当于: n = 1 g=(add(1,i) for i in range(4)) # 1+0+1+2+3=7 # 生成器中的数据没有被获取, 因为生成器只有在被调用的时候才会生成相应的数据(用__next__()、 for、list调用, 或被其它函数调用), 反之就不会生成--惰性运算. n = 10 g=(add(n,i) for i in g) print(list(g)) '''
# [20, 21, 22, 23] |
如果这里是: n=1 g=(add(n,i) for i in g) # 生成器推导式 n=10 g=(add(n,i) for i in g) n=5 g=(add(n,i) for i in g) print(list(g))
那么相当于运行: for n in [1,10,5]: g=(add(n,i) for i in g) # 生成器推导式 print(list(g))
即: n=1 g = (add(n,i) for i in g) n=10 g = (add(n,i) for i in (add(n,i) for i in g)) n=5 g = (add(5,i) for i in add(n,i) for i in (add(n,i) for i in g))
# [15, 16, 17, 18] |
十三. Python基础(13)--生成器进阶的更多相关文章
- 十二. Python基础(12)--生成器
十二. Python基础(12)--生成器 1 ● 可迭代对象(iterable) An object capable of returning its members one at a time. ...
- 二十三. Python基础(23)--经典类和新式类
二十三. Python基础(23)--经典类和新式类 ●知识框架 ●接口类&抽象类的实现 # 接口类&抽象类的实现 #①抛出异常法 class Parent(object): ...
- python基础篇之进阶
python基础篇之进阶 参考博客:http://www.cnblogs.com/wupeiqi/articles/5115190.html python种类 1. cpython 使用c解释器生产 ...
- (转)python基础学习-----生成器和迭代器
在Python中,很多对象都是可以通过for语句来直接遍历的,例如list.string.dict等等,这些对象都可以被称为可迭代对象.至于说哪些对象是可以被迭代访问的,就要了解一下迭代器相关的知识了 ...
- Python全栈开发之路 【第五篇】:Python基础之函数进阶(装饰器、生成器&迭代器)
本节内容 一.名称空间 又名name space,就是存放名字的地方.举例说明,若变量x=1,1存放于内存中,那名字x存放在哪里呢?名称空间正是存放名字x与1绑定关系的地方. 名称空间共3种,分别如下 ...
- Python基础—面向对象(进阶篇)
通过上一篇博客我们已经对面向对象有所了解,下面我们先回顾一下上篇文章介绍的内容: 上篇博客地址:http://www.cnblogs.com/phennry/p/5606718.html 面向对象是一 ...
- Python基础之生成器、迭代器
一.字符串格式化进阶 Python的字符串格式化有两种方式: 百分号方式.format方式,由于百分号的方式相对来说比较老,在社区里讨论format方式有望取代百分号方式,下面我们分别介绍一下这两种方 ...
- Python之路,Day8 - Python基础 面向对象高级进阶与socket基础
类的成员 类的成员可以分为三大类:字段.方法和属性 注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存中就有多少个普通字段.而其他的成员,则都是保存在类中,即:无论对象的 ...
- Python之路【第六篇】python基础 之面向对象进阶
一 isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 和 issubclass(su ...
随机推荐
- layui 下拉框不显示解决方法
添加以下代码 layui.use('form', function(){ var form = layui.form; form.render(); });
- 雷林鹏分享:XML 树结构
XML 树结构 XML 文档形成了一种树结构,它从"根部"开始,然后扩展到"枝叶". 一个 XML 文档实例 XML 文档使用简单的具有自我描述性的语法: To ...
- English Voice of << Last Christmas >>
Last Christmas填 词:乔治·迈克尔谱 曲:乔治·迈克尔编 曲:乔治·迈克尔歌词:Last Christmas I gave you my heart去年的圣诞节,我把心给了你But th ...
- 第一章:IPsecVPN
第一章 一.VPN(virtual private Network,虚拟专用网)的基本概念 VPN连接模式分为两种,分别是传输模式和隧道模式 传输模式:在整个VPN传输中,ip包头并没有被封装进去 隧 ...
- Sphinx实时索引
数据库中的数据很大,然后我有些新的数据后来加入到数据库中,也希望能够检索到,全部重新建立索引很消耗资源,这样需要用到“主索引+增量索引”的思路来解决,这个模式实现的基本原理是设置两个数据源和两个索引. ...
- Oracle 聚合函数
聚合函数: SQL中提供的聚合函数可以用来统计.求和.求最值等等. 此处采用Oracle 11g中其他用户SCOTT中的EMP表,进行演示. –COUNT:统计行数量 COUNT(*)统计的是结果集的 ...
- python-项目流程分析及优化查询方法
项目流程分析: ****** 1. 需求分析 2. 知识点 - 插件 3. 功能分析: - 用户登录 - session - 签名cookie PS: 主动设置超时时间:request.session ...
- 基于jquery实现页面loading加载效果
实现loading 加载提示 ······ 透明遮罩 居中效果 具体代码如下: CSS样式部分: <style type="text/css"> .background ...
- sql百万级查询优化(转)
< 数据库技术内幕 > 处理百万级以上的数据提高查询速度的方法: 1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 2.对查询进 ...
- ayit-#41. 因数的个数-数论
搞了两天发现是qpow时大数相乘爆精度了,以前没遇到过,因为大数检测时模数达到了1e18,所以qpow可能会爆,应该利用快速幂原理写一个快速加即可. 先筛出1e6以内的质数,然后把x里<=1e6 ...