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 编写生成器函数相关推荐

  1. Python使用numpy包编写自定义函数计算平均绝对误差(MAE、Mean Absolute Error)、评估回归模型和时间序列模型、解读MAE

    Python使用numpy包编写自定义函数计算平均绝对误差(MAE.Mean Absolute Error).评估回归模型和时间序列模型.解读MAE 目录

  2. Python使用numpy包编写自定义函数计算均方误差(MSE、mean squared error)、评估回归模型和时间序列模型、解读MSE评估指标

    Python使用numpy包编写自定义函数计算均方误差(MSE.mean squared error).评估回归模型和时间序列模型.解读MSE评估指标 目录

  3. python使用numpy包编写自定义函数计算SMAPE(对称平均绝对百分比误差)指标Symmetric mean absolute percentage error、SMAPE指标解读、指标使用的注

    python使用numpy包编写自定义函数计算SMAPE(对称平均绝对百分比误差)指标Symmetric mean absolute percentage error (SMAPE).SMAPE指标解 ...

  4. python使用numpy包编写自定义函数计算MAPE(平均绝对百分比误差)指标mean absolute percentage error (MAPE)、MAPE指标解读、MAPE指标使用的注意事项

    python使用numpy包编写自定义函数计算MAPE(平均绝对百分比误差)指标mean absolute percentage error (MAPE).MAPE指标解读.MAPE指标使用的注意事项 ...

  5. python中execute函数_python中的函数是如何使用的?

    欢迎关注「issnail」感谢! "一起学习,一起成长!" 1.定义函数与调用函数 定义python函数:依次输入def.函数名.带有函数参数的圆括号,最后紧跟一个冒号(:) 函数 ...

  6. python中fac函数_Python基础复习函数篇

    目录 1.猴子补丁 2. global和nonlocal关键字 3.迭代器和生成器 4.递归函数 5.高阶函数和lamdba函数 6.闭包 7.装饰器 1.   猴子补丁 猴子补丁主要用于在不修改已有 ...

  7. python列表迭代器_python迭代器生成器-迭代器和list区别

    迭代 生成 for循环遍历的原理 for循环遍历的原理就是迭代,in后面必须是可迭代对象 为什么要有迭代器 对于序列类型:字符串.列表.元组,我们可以使用索引的方式迭代取出其包含的元素.但对于字典.集 ...

  8. python匿名函数调用_python之内置函数,匿名函数

    内置函数 我们一起来看看python里的内置函数.什么是内置函数?就是Python给你提供的,拿来直接用的函数,比如print,input等等.截止到python版本3.6.2,现在python一共为 ...

  9. python如何自定义函数_python如何自定义函数_后端开发

    c语言特点是什么_后端开发 c语言特点是:1.语言简洁.紧凑,使用方便.灵活:2.运算符丰富:3.数据结构丰富,具有现代化语言的各种数据结构:4.具有结构化的控制语句:5.语法限制不太严度格,程序设计 ...

最新文章

  1. python爬取豆瓣电影并分析_爬取豆瓣电影top250提取电影分类进行数据分析
  2. mysql union all sum_[数据库]SQL Server UNION ALL 结果 SUM函数造成精度丢失
  3. Java守护线程概述
  4. 从真实项目中抠出来的设计模式——第二篇:过滤器模式
  5. 学习笔记——C语言实现单链表的基本操作:创建、输出、插入结点、删除结点、逆序链表
  6. 计算机专业经典书籍强烈推荐
  7. 基于Java毕业设计智慧后勤系统源码+系统+mysql+lw文档+部署软件
  8. 银行软开开发篇[转]
  9. 16QAM学习(二)multisim仿真 乘法器的实现,MC1496实现信号乘法混合
  10. (xsinx)/(1+(cosx)^2)在0到π上的定积分
  11. 20个优秀的 HTML5 网站设计案例欣赏
  12. 转行之后,我为什么选择做软件测试
  13. nginxlocation打印自定义日志
  14. UVP Phase运行机制的补充-Phase 的raise和drop机制
  15. 电脑无法连接wifi得解决方法
  16. HashSet线程不安全,1、 使用JUC中的CopyOnWriteArraySet底层还是使用CopyOnWriteArrayList进行实例化 2、使用工具类中的Collections.synch
  17. Python-OpenCV棋盘检测
  18. 印度和印度尼西亚有什么关系吗?
  19. java例题:判断所输入的年月日是这一年的第多少天
  20. 秒懂设计模式之工厂方法模式(Factory Method Pattern)

热门文章

  1. hystrix 源码 线程池隔离_springcloud-线程池隔离(consumer)ribbon
  2. 记一次线上coredump事故
  3. Volley源码学习2--Error类
  4. 基于JAVA+SpringMVC+Mybatis+MYSQL的少儿网站教育管理系统
  5. 基于JAVA+SpringBoot+Mybatis+MYSQL的仓库信息管理系统
  6. 基于JAVA+Servlet+JSP+MYSQL的个人博客系统
  7. 基于JAVA+Servlet+JSP+MYSQL的汽车维修保养管理系统
  8. Unity3D-Rigidbody
  9. web客户端安全之跨站点请求伪造攻击
  10. 20121022 django学习笔记1