day14.生成器进阶,推导式
生成器中取值的三种方法
方法1:next()
方法2:for 循环
方法3:数据类型的强制转换
def func():
for i in range(20):
yield '赛车*{}'.format(i) ret = func()
print(ret.__next__()) for i in ret:
print(i) l1 = list(ret)
print(l1)
send() 方法
send 获取下一个值得时候给上一个yield位置传递一个数据
第一个 yiled 必须使用next 获取下一个值
最后一个yield 不能接受任何值
def func():
print(1)
con = yield 111
print('yield1 的返回值测试:',con) print(2)
con2 = yield 222 g = func()
ret1 = g.__next__()
print(ret1) ret2 = g.send('hello,world')
print(ret2)
1
111
yield1 的返回值测试: hello,world
2
222
send方法获取动态平均值小练习
简略版分析:
def avg():
sum = 0
count = 0
avg = 0
num = yield # next方法执行至此,执行yield之前的所有函数。下面执行send方法时,执行赋值给num
sum += num
count += 1
avg = sum/count
yield avg avg_g = avg()
avg_g.__next__()
last = avg_g.send(10)
print(last)
进阶版本:
def avg():
sum = 0
count = 0
avg = 0
while True:
num = yield avg # 直接传参,避免count = 0无法执行报错
count += 1
sum += num
avg = sum / count avg_g = avg()
avg_g.__next__()
last = avg_g.send(10)
print(last)
last1 = avg_g.send(20)
print(last1)
10.0
15.0
yield from 方法
在生成器函数中,可以替代 for 循环取值
def func():
a = 'abcde'
b = ''
yield from a
yield from b
g = func()
for i in g:
print(i)
列表推到式
记住就行了,不难
print([i for i in range(10)])
print(['倒数15个数:{}'.format(i) for i in range(5,0,-1)])
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
['倒数15个数:5', '倒数15个数:4', '倒数15个数:3', '倒数15个数:2', '倒数15个数:1']
生成器表达式
列表表达式会将结果全部打印出来,占内存。
print((i for i in range(10)))
<generator object <genexpr> at 0x00000244643515C8>
例:1到10 取每个数的平方
g = (i**2 for i in range(10))
for i in g:
print(i)
列表推导式
例1:30以内所有能被3整出的数,以及此数的平方
ret = [i for i in range(30) if i%3 == 0]
print(ret) ret = [i*i for i in range(30) if i%3 == 0]
print(ret)
例2:找到嵌套列表中名字含有两个 ‘e’ 的所有名字
嵌套列表有点意思,两个循环
names = [['tom','aa','aece'],['bob','bcde','edde']]
ret = [name for i in names for name in i if name.count('e') == 2]
print(ret)
字典推导式:
例1:将字典的 key 和 value 对调位置
shop = {'手机':1000,'电脑':3000,'鼠标':100}
shop2 = {shop[k]:k for k in shop}
print(shop2)
例2:合并字典大小写对应的value值,将k统一成小写
利用了一个字典的查找功能,找不到可以自定义返回值,很好用
mcase = {'a':10,'b':30,'A':7,'Z':3}
mcase2 = {k.lower():mcase.get(k.lower(),0) + mcase.get(k.upper(),0) for k in mcase}
print(mcase2)
字典的get 方法
a = {'a':10,'b':20}
ret1 = a.get('a',100)
ret2 = a.get('c',30)
print(ret1,ret2)
10 30
python3 集合
集合(set)是一个无序的不重复元素序列。
可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。
>>>basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}
>>> print(basket) # 这里演示的是去重功能
{'orange', 'banana', 'pear', 'apple'}
>>> 'orange' in basket # 快速判断元素是否在集合内
True
>>> 'crabgrass' in basket
False
>>> # 下面展示两个集合间的运算.>>> a = set('abracadabra')
>>> b = set('alacazam')
>>> a
{'a', 'r', 'b', 'c', 'd'}
>>> a - b # 集合a中包含而集合b中不包含的元素
{'r', 'd', 'b'}
>>> a | b # 集合a或b中包含的所有元素
{'a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'}
>>> a & b # 集合a和b中都包含了的元素
{'a', 'c'}
>>> a ^ b # 不同时包含于a和b的元素
{'r', 'd', 'b', 'm', 'z', 'l'}
集合推导式
集合推导式类似于列表推导式,自带去重功能
ret1 = {i**2 for i in [-1,1,2]}
print(ret1)
{1,4}
day14.生成器进阶,推导式的更多相关文章
- python基础(9)-迭代器&生成器函数&生成器进阶&推导式
迭代器 可迭代协议和迭代器协议 可迭代协议 只要含有__iter__方法的对象都是可迭代的 迭代器协议 内部含有__next__和__iter__方法的就是迭代器 关系 1.可以被for循环的都是可迭 ...
- Python生成器、推导式之前襟后裾
生成器 函数体内有yield选项的就是生成器,生成器的本质是迭代器,由于函数结构和生成器结构类似,可以通过调用来判断是函数还是生成器,如下: def fun(): yield "我是生成器& ...
- 12生成器,send,推导式
# 1.生成器的本质就是迭代器 # 2.通过函数变成一个生成器 # def func(): # print(1) # yield 5 # 我的函数走到这了 # print(2) # yield 9 # ...
- python基础之 迭代器回顾,生成器,推导式
1.迭代器回顾 可迭代对象:Iterable 可以直接作用于for循环的对象统称为可迭代对象:Iterable.因为可迭代对象里面存在可迭代协议,所以才会被迭代 可迭代对象包括: 列表(list) 元 ...
- day14 python各种推导式详解
推导式的套路 之前我们已经学习了最简单的列表推导式和生成器表达式.但是除此之外,其实还有字典推导式.集合推导式等等. 下面是一个以列表推导式为例的推导式详细格式,同样适用于其他推导式. variabl ...
- Python_Mix*生成器,生成器函数,推导式,生成器表达式
生成器: 生成器的本质就是迭代器 生成器一般由生成器函数或者生成器表达式来创建,其实就是手写的迭代器 def func(): print('abc') yield 222 #由于函数中有了yield ...
- python note 12 生成器、推导式
1.生成器函数 # 函数中如果有yield 这个函数就是生成器函数. 生成器函数() 获取的是生成器. 这个时候不执行函数# yield: 相当于return 可以返回数据. 但是yield不会彻底中 ...
- python基础 (迭代器回顾,生成器,推导式)
1.迭代器回顾 可迭代对象:Iterable 可以直接作用于for循环的对象统称为可迭代对象:Iterable.因为可迭代对象里面存在可迭代协议,所以才会被迭代 可迭代对象包括: 列表(list) 元 ...
- Day12--Python--生成器,生成器函数,推导式,生成器表达式
一.昨日内容回顾 惰性机制(只有执行__next__()才会取值)二.今日主要内容 1.生成器 生成器:本质是迭代器,写法和迭代器不一样.用法和迭代器一样. ※生成器记录的是代码 2.生成器函数 生成 ...
随机推荐
- OperationCenter Docker容器启动脚本
docker rm -f OperationCenter rm -f /root/webapps/logs/* image_name="harbor.gfstack.geo/geostack ...
- mybatis操作mysql的奇淫技巧总结(代码库)
1.添加公共sql代码段 使用<sql> 和 <include> 标签 <sql id="userSubassemblyRecordParam"> ...
- zabbix误报交换机重启
交换机的sysUpTime是由一个32-bit的counter来计数的,单位是0.01秒,所以最大时间为496天,过了496天就溢出,变成0,然后又重新计算时间,所以zabbix误报. snmpwal ...
- MySQL 创建、删除、显示数据库、数据表
1 创建.删除.显示数据库 -- 创建数据库 create database student_db character set utf8 collate utf8_general_ci; -- 删除数 ...
- windows7 java环境配置
最近在工作碰到了在ie浏览器调用java程序时,出现了一些问题,所以在这里整理一下: jdk的下载地址为:http://666dx.pc6.com/wwb3/jdkx6417.zip 正对于windo ...
- UE4材质特别属生记录
tangent space normal 切线空间法线 材质默认使用的切线空间法线,可切换为对象空间法线(彩色贴图) Separate Translucency 单独半透明 允许半透明被渲染到一个单独 ...
- 程序通过ReportViewer对象来调用reporting services并导出pdf文件
ReportViewer tempReportViewer = new ReportViewer(); tempReportViewer.ProcessingMode = ProcessingMode ...
- spring的纯注解的IOC配置
package config; import com.mchange.v2.c3p0.ComboPooledDataSource;import org.apache.commons.dbutils.Q ...
- Database学习 - mysql 视图/触发器/函数
- C#实现按键弹出查询窗口
protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { if (keyData == Keys.F2) { thi ...