一、生成器函数进阶

需求:求取移动平均数
1、应用场景之一,在奥运会气枪射击比赛中,每打完一发都会显示平均环数!
 def show_avg():
print('你已进入显示移动平均环数系统!')
a = yield
avg = a/1
b = yield
avg = (a + b)/2
print('目前的平均环数是:')
yield avg generator = show_avg()
generator.__next__()
print(generator.send(10)) # 第一发打了10环
print(generator.send(9.8)) # 第二发打了9.8环
send 获取下一个值的效果和next基本一致,
只是在获取下一个值的时候,给上一yield的位置传递一个数据
使用send的注意事项
# 第一次使用生成器的时候 是用next获取下一个值
# 最后一个yield不能接受外部的值
2、获取移动平均值,数据如下:10,20,30,40
 # 进阶一下:用循环取平均值
def average():
sum = 0
count = 0
avg = 0
while 1:
num = yield avg
sum += num
count += 1
avg = sum/count
g = average()
print(g.__next__()) #执行该语句,代码就执行到:= yield avg 返回的avg = 0 其他参数的值也都是默认的
print(g.send(10)) #执行该语句,代码进入到第二次循环,yield avg 返回avg = 10,接着num = 10,sum = 10,count = 1,avg = 10
print(g.send(20)) #执行该语句,代码进入到第三次循环,yield avg 返回avg = 15,接着num = 20,sum = 10+20,count = 1+1,avg =(10+20)/2
print(g.send(30)) #执行该语句,代码进入到第四次循环,yield avg 返回avg = 20,接着num = 30,sum = 10+20+30,count = 1+1+1,avg =(10+20+30)/3
print(g.send(40)) #执行该语句,代码进入到第五次循环,yield avg 返回avg = 25,接着num = 40,sum = 10+20+30+40,count = 1+1+1+1,avg =(10+20+30+40)/4
3、预激生成器的装饰器
 #send前必须要__next__()一下,如果大量的使用到,可以考虑使用装饰器来做!
# 我们来改造一下打靶环数的例子:
def next(func):
def inner(*args,**kwargs):
g = func(*args,**kwargs)
g.__next__()
return g
return inner @next
def avg_ring_count():
print('你已进入显示移动平均环数系统!')
sum = 0
count = 0
avg = 0
while 1:
print('目前的平均环数是:')
num = yield avg
sum += num
count += 1
avg = sum / count g = avg_ring_count()
print(g.send(10))
print(g.send(9.8))
print(g.send(9.6))
print(g.send(8.9))

二、生成器表达式和各种推导式

1、引入的例子:列表推导式
love_list = []
for i in range(200):
love_list.append('ILOVEU%d'%i)
# 可以写成:
love_list = ['ILOVEU%d'%i for i in range(200)]
 2、引入生成器表达式
#将上面的列表推导式,小改一下即可:
generator = ('ILOVEU%d'%i for i in range(20)) for i in generator:
print(i)
 我们发现两者的不同之处在于:
括号不一样
返回的值不一样 === 几乎不占用内存,你要一条就给一条,而不是一次性都拿出来
3、各种推导式
  1)列表推导式,上面已经介绍过了
 #30以内所有能被3整除的数
ret = [i for i in range(30) if i%3 == 0] #完整的列表推导式
g = (i for i in range(30) if i%3 == 0) #完整的列表推导式
print(ret) #30以内所有能被3整除的数的平方
ret = [i*i for i in (1,2,3,4) if i%3 == 0]
ret = (i*i for i in range(30) if i%3 == 0)
print(ret) # 例三:找到嵌套列表中名字含有两个‘e’的所有名字
names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
ret = [name for lst in names for name in lst if name.count('e') ==2]
ret = (name for lst in names for name in lst if name.count('e') ==2)
print(ret)
2)字典推导式
 #例一:将一个字典的key和value对调
mcase = {'a': 10, 'b': 34}
#{10:'a' , 34:'b'}
mcase_frequency = {mcase[k]: k for k in mcase}
print(mcase_frequency) #例二:合并大小写对应的value值,将k统一成小写
mcase = {'a': 10, 'b': 34, 'A': 7, 'Z': 3}
#{'a':10+7,'b':34,'z':3}
mcase_frequency = {k.lower(): mcase.get(k.lower(), 0) + mcase.get(k.upper(), 0) for k in mcase}
print(mcase_frequency)
 3)集合推导式
#       自带结果去重功能
squared = {x**2 for x in [1, -1, 2]}
print(squared)
4、各种推导式的小结:

 [or{or(每一个元素或者是和元素相关的操作 for 元素 in 可迭代数据类型)or}or]              #遍历之后挨个处理 元素个数不变
[or{or(满足条件的元素相关的操作 for 元素 in 可迭代数据类型 if 元素相关的条件)or}or] #筛选功能 带if 元素个数可能改变

Python进阶-VI 生成器函数进阶、生成器表达式、推导式的更多相关文章

  1. python学习笔记:第12天 列表推导式和生成器

    目录 1. 迭代器 2. 推导式 1. 迭代器 什么是生成器呢,其实生成器的本质就是迭代器:在python中有3中方式来获取生成器(这里主要介绍前面2种) 通过生成器函数获取 通过各种推导式来实现生成 ...

  2. 2018.11.06 生成器函数进阶&列表推导式&生成器表达式

    1.生成器函数进阶 2.列表推导式 3.生成器表达式

  3. python学习日记(生成器函数进阶)

    迭代器和生成器的概念 迭代器 对于list.string.tuple.dict等这些容器对象,使用for循环遍历是很方便的.在后台for语句对容器对象调用iter()函数.iter()是python内 ...

  4. python之序列去重以及生成器、生成器函数、生成器表达式与迭代器浅谈

    首先要明确序列值类型是否可哈希,因为可哈希的值很简单就可以用 in /not in 写个生成器去判断,如果是不可哈希的就要去转换为可哈希的再用 in/not in 去判断 原地不可变类型(可哈希): ...

  5. python笔记3 闭包 装饰器 迭代器 生成器 内置函数 初识递归 列表推导式 字典推导式

    闭包 1, 闭包是嵌套在函数中的 2, 闭包是内层函数对外层函数的变量(非全局变量)的引用(改变) 3,闭包需要将其作为一个对象返回,而且必须逐层返回,直至最外层函数的返回值 闭包例子: def a1 ...

  6. day 13 生成器函数 表达式 推导式

    今日主要内容 1. 生成器和生成器函数 生成器的本质就是迭代器 生成器的三种创建办法: 1.通过生成器函数 2.通过生成器表达式创建生成器 3.通过数据转换 2. 生成器函数: 函数中包含了yield ...

  7. 零基础入门学习Python(21)--函数:lambda表达式

    知识点 lambda 表达式 Python 允许使用lambda关键字创建匿名函数 lambda 函数怎么使用? 单个参数 >>> def add(x): return 2*x + ...

  8. Python之路-条件控制&循环语句&列表推导式&常用函数

    一.什么是条件控制语句 条件控制语句,也可以称之为判断语句,通过一条或多条的执行结果来决定接下来要执行的代码块. 二.if语句 if语句是用来进行判断的,最简答的if语句只有一个判断一个操作. 语法: ...

  9. 019.Python函数sorted,filter和推导式

    一 sorted函数 sorted(iterable,reverse=False,key=函数) 功能:排序 参数: iterable:可迭代性数据(常用:容器类型数据,range对象,迭代器) re ...

随机推荐

  1. 【2019.8.11上午 慈溪模拟赛 T3】欢迎回来(back)(设阈值+莫队)

    设阈值 考虑对于询问的\(d\)设阈值进行分别处理. 对于\(d\le\sqrt{max\ d}\)的询问,我们可以\(O(n\sqrt{max\ d})\)预处理答案,\(O(1)\)输出. 对于\ ...

  2. python3爬虫筛选所需要数据

    第一次使用博客园,也是第一篇文章,让我们一起开启学习之旅吧!! 昨天在为某授权系统做安全性测试的时候,可以未授权访问系统的用户登陆统计记录.由此想整理出部分用户名,作为暴力破解的用户名,检查是否存在用 ...

  3. redis命令之 ----Hash(哈希表)

    HDEL HDEL key field [field ...] 删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略. HEXISTS HEXISTS key field 查看哈希表 key  ...

  4. restful api的10个最佳实践

    Web API在过去的几年里非常盛行,因为它有着语法简单.规范化和轻量级的优点,因为得到广泛的推崇,很多过往的技术手段都慢慢转换为使用Web API来开发.而Web API通常使用的设计方式是REST ...

  5. SSM手动实现分页逻辑---非PageHelper方式

    第一种方法:查询出所有数据再分页 分析: 分页时,需要获得前台传来的两个参数,分别为pageNo(第几页数据),pageSize(每页的条数); 根据这两个参数来计算出前端需要的数据是查出数据list ...

  6. [ICP]手推SVD方法

    该方法源于<Least-Squares Rigid Motion Using SVD>,原文推导十分详细,这里自己也仔细推导了一遍,有些地方加以注释整理. 问题定义 假设我们有两个点云集合 ...

  7. tf.argmax()解析

    tf.argmax(input,axis)根据axis取值的不同返回每行或者每列最大值的索引. 代码如下: import tensorflow as tfimport numpy as npsess= ...

  8. 学习shiro第三天

    今天比较晚,所以只看了shiro的认证策略Authentication Strategy,下面讲讲shiro的三种认证策略. 1.AtLeastOneSuccessfulStrategy:这个是shi ...

  9. OL7.7安装Oracle 11.2.0.4

    安装环境准备工具 yum –y install oracle-rdbms-server-11gR2-preinstall 创建目录 mkdir -p /u01/app/oracle/product/1 ...

  10. pandas 之 时间序列索引

    import numpy as np import pandas as pd 引入 A basic kind of time series object in pandas is a Series i ...