生成器中取值的三种方法

方法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.生成器进阶,推导式的更多相关文章

  1. python基础(9)-迭代器&生成器函数&生成器进阶&推导式

    迭代器 可迭代协议和迭代器协议 可迭代协议 只要含有__iter__方法的对象都是可迭代的 迭代器协议 内部含有__next__和__iter__方法的就是迭代器 关系 1.可以被for循环的都是可迭 ...

  2. Python生成器、推导式之前襟后裾

    生成器 函数体内有yield选项的就是生成器,生成器的本质是迭代器,由于函数结构和生成器结构类似,可以通过调用来判断是函数还是生成器,如下: def fun(): yield "我是生成器& ...

  3. 12生成器,send,推导式

    # 1.生成器的本质就是迭代器 # 2.通过函数变成一个生成器 # def func(): # print(1) # yield 5 # 我的函数走到这了 # print(2) # yield 9 # ...

  4. python基础之 迭代器回顾,生成器,推导式

    1.迭代器回顾 可迭代对象:Iterable 可以直接作用于for循环的对象统称为可迭代对象:Iterable.因为可迭代对象里面存在可迭代协议,所以才会被迭代 可迭代对象包括: 列表(list) 元 ...

  5. day14 python各种推导式详解

    推导式的套路 之前我们已经学习了最简单的列表推导式和生成器表达式.但是除此之外,其实还有字典推导式.集合推导式等等. 下面是一个以列表推导式为例的推导式详细格式,同样适用于其他推导式. variabl ...

  6. Python_Mix*生成器,生成器函数,推导式,生成器表达式

    生成器: 生成器的本质就是迭代器 生成器一般由生成器函数或者生成器表达式来创建,其实就是手写的迭代器 def func(): print('abc') yield 222 #由于函数中有了yield ...

  7. python note 12 生成器、推导式

    1.生成器函数 # 函数中如果有yield 这个函数就是生成器函数. 生成器函数() 获取的是生成器. 这个时候不执行函数# yield: 相当于return 可以返回数据. 但是yield不会彻底中 ...

  8. python基础 (迭代器回顾,生成器,推导式)

    1.迭代器回顾 可迭代对象:Iterable 可以直接作用于for循环的对象统称为可迭代对象:Iterable.因为可迭代对象里面存在可迭代协议,所以才会被迭代 可迭代对象包括: 列表(list) 元 ...

  9. Day12--Python--生成器,生成器函数,推导式,生成器表达式

    一.昨日内容回顾 惰性机制(只有执行__next__()才会取值)二.今日主要内容 1.生成器 生成器:本质是迭代器,写法和迭代器不一样.用法和迭代器一样. ※生成器记录的是代码 2.生成器函数 生成 ...

随机推荐

  1. Mysql数据库使用量查询及授权

    Mysql数据库使用量查询及授权 使用量查询 查看实例下每个库的大小 select TABLE_SCHEMA, concat(truncate(sum(data_length)/1024/1024,2 ...

  2. django restframework jwt

    既然要来学习jwt(json web token),那么我们肯定是先要了解jwt的优势以及应用场景--跨域认证. $ pip install djangorestframework-jwt 传统coo ...

  3. Lightning Conductor 洛谷P3515 决策单调性优化DP

    遇见的第一道决策单调性优化DP,虽然看了题解,但是新技能√,很开森. 先%FlashHu大佬,反正我是看了他的题解和精美的配图才明白的,%%%巨佬. 废话不多说,看题: 题目大意 已知一个长度为n的序 ...

  4. mac开发环境搭建篇(2)--brew与mysql

    [brew]:参考 https://www.cnblogs.com/zoulifeng2017/p/7514139.html 安装brew: 终端执行:/usr/bin/ruby -e "$ ...

  5. css预编译语言 sass scss(变量$var, css嵌套规则,@import规则,@extend,@mixin)

    什么是sass Sass 是对 CSS 的扩展,让 CSS 语言更强大.优雅. 它允许你使用变量.嵌套规则. mixins.导入等众多功能, 并且完全兼容 CSS 语法. Sass 有助于保持大型样式 ...

  6. MySQL学习6 - 完整性约束

    一 介绍 二 not null 与default 三 unique 四 primary key 五 auto_increment 六 foreign key 快速理解foreign key 创建两张表 ...

  7. vue中使用swiper-slide时,循环轮播失效?

    前言 vue 项目中使用时,组件swiper-slide 如果用v-for循环的话,loop:true 就不能无缝轮播,每次轮播到最后一张就停止了??? 正文 代码如下: <swiper :op ...

  8. dubbo和zikkeper的使用

    1.先来一段异常看看:No provider available for the service 16:05:25.755 [localhost-startStop-1] WARN o.s.w.c.s ...

  9. mysql-8.0.11安装步骤

    1.下载好安装包:mysql-8.0.11-winx64.zip 2.解压到合适的目录,例如:C:\XQ\Soft\mysql-8.0.11-winx64 3.在目录下创建my.ini文件,配置bas ...

  10. Android获取虚拟软键盘高度

    public static int getDpi(Context context) { int dpi = 0; WindowManager windowManager = (WindowManage ...