python生成器函数_Python 编写生成器函数
Python 编写生成器函数,可以将许多函数简洁地写成生成器表达式的形式,比如之前讲过的映射和过滤。另外,也可以用Python内置的高阶函数(例如map()或者filter())或者生成器函数实现这些函数。编写代码时,如果生成器函数中包含多条语句,要留意代码实现是否偏离了函数式编程的指导原则:对无状态的函数求值。
使用Python进行函数式编程,就像在刀锋上行走:一边是纯函数式编程,一边是命令式编程。我们需要仔细地辨别出那些无法通过纯粹的函数式编程实现的部分,使用命令式Python完成它,并把这些部分与其他函数式部分的代码隔离开。
代码逻辑必须使用Python语句实现时,就只能用生成器函数。下面罗列了一些不能使用生成器表达式的场景。
使用with语句处理外部资源时。
循环条件比较灵活,不能用for语句,而需要用while语句时。
循环中,由于满足特定条件,需要使用break语句或者return语句提前结束循环时。
使用try-except结构处理异常时。
包含内部函数定义时。
复杂的if-elif分支语句。当需要处理的分支多于一种,无法用if-else表达时,分支语句会变得相对复杂。
以及那些不常用的Python语句,包括for-else、while-else、try-else和try-else-finally等,也都无法在生成器表达式中使用。
通常使用break语句提前结束集合处理过程。当遍历时遇到的元素满足指定的要求,就可以结束整个处理过程了,这类似于检测集合中是否存在拥有某种属性元素的any()函数。还有一种情况是在处理完指定数量的元素(不是所有元素)后退出。
可以将寻找集合中的特定值简洁地表达为min(some-big-expression)或者max(something big)。在这种情况下,必须检查集合中的所有元素,确保选出的是最大值或者最小值。
少数情况下,需要实现一个first(function, collection)函数,只要找到第一个值就够了。为了避免不必要的计算,遍历结束得越早越好。
下面是该函数的一种实现:
def first(predicate: Callable, collection: Iterable) -> Any:
for x in collection:
if predicate(x): return x
遍历集合,对集合中的每个元素应用指定的谓词函数。如果谓词函数判断结果为True,则返回对应的元素;如果集合遍历完毕,则返回默认的None值。
可以从PyPI上下载该函数的一个版本,first模块基本上是对上面的思想的实现与扩展,更多细节可参考https://pypi.python.org/pypi/first。
判断一个数是否为质数时就可以用这里的first函数,示例如下:
import math
def isprimeh(x: int) -> bool:
if x == 2: return True
if x % 2 == 0: return False
factor = first(
lambda n: x % n == 0,
range(3, int(math.sqrt(x) + .5) + 1, 2))
return factor is None
该函数处理了一些特殊情况,包括2是质数,而其他偶数都不是质数,然后用上面定义的first()函数寻找指定集合中的第一个因子。
first()函数返回第一个因子。在这个场景中,这个数具体是什么并不重要,存在与否才重要。当因子不存在时,isprimeh()函数返回True。
可以使用同样的方法处理数据异常。处理无效数据的map()函数如下:
def map_not_none(func: Callable, source: Iterable) -> Iterator:
for x in source:
try:
yield func(x)
except Exception as e:
pass # For help debugging, use print(e)
该函数遍历可迭代对象中的每个元素,并将函数应用于元素。如果没有异常,则返回处理结果;如果发现了异常,则舍弃该异常元素。
处理包含无效值或者缺失值的数据时,这种方法很方便,无须创建复杂的过滤器筛选异常值,只要在处理过程中舍弃无效的输入值即可。
可以对包含无效值的输入数据执行映射,如下所示:
data = map_not_none(int, some_source)
some_source集合由字符串组成,map_not_none()函数对其中元素依次应用int()函数,可以方便地过滤掉那些不代表数字的字符串。
python生成器函数_Python 编写生成器函数相关推荐
- Python使用numpy包编写自定义函数计算平均绝对误差(MAE、Mean Absolute Error)、评估回归模型和时间序列模型、解读MAE
Python使用numpy包编写自定义函数计算平均绝对误差(MAE.Mean Absolute Error).评估回归模型和时间序列模型.解读MAE 目录
- Python使用numpy包编写自定义函数计算均方误差(MSE、mean squared error)、评估回归模型和时间序列模型、解读MSE评估指标
Python使用numpy包编写自定义函数计算均方误差(MSE.mean squared error).评估回归模型和时间序列模型.解读MSE评估指标 目录
- python使用numpy包编写自定义函数计算SMAPE(对称平均绝对百分比误差)指标Symmetric mean absolute percentage error、SMAPE指标解读、指标使用的注
python使用numpy包编写自定义函数计算SMAPE(对称平均绝对百分比误差)指标Symmetric mean absolute percentage error (SMAPE).SMAPE指标解 ...
- python使用numpy包编写自定义函数计算MAPE(平均绝对百分比误差)指标mean absolute percentage error (MAPE)、MAPE指标解读、MAPE指标使用的注意事项
python使用numpy包编写自定义函数计算MAPE(平均绝对百分比误差)指标mean absolute percentage error (MAPE).MAPE指标解读.MAPE指标使用的注意事项 ...
- python中execute函数_python中的函数是如何使用的?
欢迎关注「issnail」感谢! "一起学习,一起成长!" 1.定义函数与调用函数 定义python函数:依次输入def.函数名.带有函数参数的圆括号,最后紧跟一个冒号(:) 函数 ...
- python中fac函数_Python基础复习函数篇
目录 1.猴子补丁 2. global和nonlocal关键字 3.迭代器和生成器 4.递归函数 5.高阶函数和lamdba函数 6.闭包 7.装饰器 1. 猴子补丁 猴子补丁主要用于在不修改已有 ...
- python列表迭代器_python迭代器生成器-迭代器和list区别
迭代 生成 for循环遍历的原理 for循环遍历的原理就是迭代,in后面必须是可迭代对象 为什么要有迭代器 对于序列类型:字符串.列表.元组,我们可以使用索引的方式迭代取出其包含的元素.但对于字典.集 ...
- python匿名函数调用_python之内置函数,匿名函数
内置函数 我们一起来看看python里的内置函数.什么是内置函数?就是Python给你提供的,拿来直接用的函数,比如print,input等等.截止到python版本3.6.2,现在python一共为 ...
- python如何自定义函数_python如何自定义函数_后端开发
c语言特点是什么_后端开发 c语言特点是:1.语言简洁.紧凑,使用方便.灵活:2.运算符丰富:3.数据结构丰富,具有现代化语言的各种数据结构:4.具有结构化的控制语句:5.语法限制不太严度格,程序设计 ...
最新文章
- python爬取豆瓣电影并分析_爬取豆瓣电影top250提取电影分类进行数据分析
- mysql union all sum_[数据库]SQL Server UNION ALL 结果 SUM函数造成精度丢失
- Java守护线程概述
- 从真实项目中抠出来的设计模式——第二篇:过滤器模式
- 学习笔记——C语言实现单链表的基本操作:创建、输出、插入结点、删除结点、逆序链表
- 计算机专业经典书籍强烈推荐
- 基于Java毕业设计智慧后勤系统源码+系统+mysql+lw文档+部署软件
- 银行软开开发篇[转]
- 16QAM学习(二)multisim仿真 乘法器的实现,MC1496实现信号乘法混合
- (xsinx)/(1+(cosx)^2)在0到π上的定积分
- 20个优秀的 HTML5 网站设计案例欣赏
- 转行之后,我为什么选择做软件测试
- nginxlocation打印自定义日志
- UVP Phase运行机制的补充-Phase 的raise和drop机制
- 电脑无法连接wifi得解决方法
- HashSet线程不安全,1、	使用JUC中的CopyOnWriteArraySet底层还是使用CopyOnWriteArrayList进行实例化 2、使用工具类中的Collections.synch
- Python-OpenCV棋盘检测
- 印度和印度尼西亚有什么关系吗?
- java例题:判断所输入的年月日是这一年的第多少天
- 秒懂设计模式之工厂方法模式(Factory Method Pattern)
热门文章
- hystrix 源码 线程池隔离_springcloud-线程池隔离(consumer)ribbon
- 记一次线上coredump事故
- Volley源码学习2--Error类
- 基于JAVA+SpringMVC+Mybatis+MYSQL的少儿网站教育管理系统
- 基于JAVA+SpringBoot+Mybatis+MYSQL的仓库信息管理系统
- 基于JAVA+Servlet+JSP+MYSQL的个人博客系统
- 基于JAVA+Servlet+JSP+MYSQL的汽车维修保养管理系统
- Unity3D-Rigidbody
- web客户端安全之跨站点请求伪造攻击
- 20121022 django学习笔记1