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.生成器函数 生成 ...
随机推荐
- kubeadm的安装步骤(HA)
准备3台主节点:km1/km2/km3 1.编辑kubeadm-config.yaml apiVersion: kubeadm.k8s.io/v1beta1 kind: ClusterConfigur ...
- 学习python第二天
编程语言分为哪几种? 1. 机器语言:是通过直接编写二进制指令对计算机下达指令的编程方式 -- 0000,0000,00000000001:加载 暂存区A 存储器地址1 2. 汇编语言:是通过编写二进 ...
- HDU - 1078 FatMouse and Cheese (记忆化搜索)
FatMouse has stored some cheese in a city. The city can be considered as a square grid of dimension ...
- Spark Standalone spark-default.conf
Example: spark.master spark://master:7077 spark.eventLog.enabled true spark.eventLog.dir hdfs://name ...
- 深入浅出mybatis之映射器
目录 概述 XML映射器 定义xml映射器 配置xml映射器 使用xml映射器 接口映射器 定义接口映射器 配置接口映射器 使用接口映射器 总结与对比 概述 映射器是MyBatis中最核心的组件之一, ...
- 一个QQ旋风的BUG
本人喜欢用QQ旋风下载工具,很不幸的是这个工具BUG太多了. 下载不同COOKIE,相同文件名.URL的文件时候会QQ旋风崩溃. 感兴趣可以试下.
- luogu 3166 组合与gcd(数三角形)结论
在n*m的点格图中选取三个点满足三角形的个数 结论:点(x1,y1)和(x2,y2) 中间有gcd(x2-x1,y2-y1)+1个和两点连成的线段直线共线 那么大力枚举 x2-x1和y2-y1,然后发 ...
- 数据库之数据库管理篇[mysql]
管理数据库 1.mysql开闭使用篇 mariadb在Linux中首次进入mysql(因为此时还没有创建任何用户,mysql的root并不等效于linux中的root用户) sudo mysql 进入 ...
- 网络流Dinic(本篇介绍最大流)
前言:看到网上Dinic和ISAP的比较,多数人认为ISAP更快,不容易爆栈.当然,也有少数人认为,在多数情况下,Dinic比较稳定.我认为Dinic的思路比ISAP更简明,所以选择了Dinc算法 介 ...
- C# - 多线程(基础)
多线程 基础(Multithreading) 一些基本的关于线程和与其相关的概念 位)的变量赋值,这个操作就是原子性的.因为它可以一次性填充64位的二进制数据到栈上,属于一步完成,不会发生断裂.而假如 ...