生成器中取值的三种方法

方法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. Nginx 请求的11个阶段

    48 1:当请求进入Nginx后先READ REQUEST HEADERS 读取头部 然后再分配由哪个指令操作 2:Identity 寻找匹配哪个Location  3:Apply Rate Limi ...

  2. Linux查看用户登录信息-last

    last命令: last命令用于显示用户最近登录信息.单独执行last命令,将读取 /var/log/wtmp 文件,并将给该文件的内容记录的登入系统的用户名单全部显示出来. 语法: last (选项 ...

  3. 有关swiper动态改变数据遇到的坑(不能自动滚动,自动跟新数据,切换不正常)

    以前都觉得swiper的使用很简单,那是因为使用swiper时都是写的数据,按照官网上介绍直接初始化swiper,随便丢一个地方初始化就ok了,但是在很多需求中,我们都需要动态的改变数据,这样可能就会 ...

  4. mpvue——引入vant_weapp组件

    克隆仓库 克隆后,将dist目录下的所有文件复制到项目中的/static/vant/目录下,vant目录是我自己创建为了区分的 git clone https://github.com/youzan/ ...

  5. <数据结构基础学习>(二)简单的时间复杂度分析

    一.简单的复杂度分析 O(1) O(n) O(logn) O(logn) O(n^2) 大O描述的是算法的运行事件和输入数据之间的关系 Eg: 数组求和 public static int sum(i ...

  6. class09

    class09 四川菜很辣. Sichuan cuisine is very spicy. 那个汤是凉的. That soup is cold. 这茶很烫. This tea is very hot. ...

  7. java 日期格式化

    DateFormat DateFormat 是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化并解析日期或时间. SimpleDateFormat SimpleDateFormat 是一个以与 ...

  8. Python中如何设置输出文字的颜色

    一.语法 1.实现过程 终端的字符颜色是用转义序列控制的,是文本模式下的系统显示功能,和具体的语言无关.控制字符颜色的转义序列是以ESC开头,即用\033来完成   2.书写过程 开头部分: \033 ...

  9. Numpy系列(十三)- 文件IO

    NumPy提供了多种存取数组内容的文件操作函数.保存数组数据的文件可以是二进制格式或者文本格式.二进制格式的文件又分为NumPy专用的格式化二进制类型和无格式类型. 一,tofile()和fromfi ...

  10. [物理学与PDEs]第4章第2节 反应流体力学方程组 2.1 粘性热传导反应流体力学方程组

    1.  记号: $Z=Z(t,{\bf x})$ 表示未燃气体在微团中所占的百分比 ($Z=1$ 表示完全未燃烧; $Z=0$ 表示完全燃烧). 2.  物理化学 (1)  燃烧过程中, 通过化学反应 ...