Python 函数式编程

by A. M. Kuchling


【资料图】

---

介绍

---

函数式编程把问题分解为函数, 函数接收输入, 产生输出. 函数式编程不能有影响输出的内

部状态. 函数式编程不能有修改内部状态的副作用, 或者不能有除了输出以外的修改. 完全没有

副作用的函数叫纯函数. 避免副作用意味着不使用可变数据结构. 函数的输出只依赖输入. 

有的函数式语言非常执着于纯粹性, 甚至没有赋值语句, 例如 a=3 或 c=a+b, 但是很难避免所

有的副作用, 例如打印到屏幕, 或写入磁盘文件. 例如 print() 或 time.sleep(), 它们都

没有输出返回值. 调用它们只是为了它们的副作用, 打印文本到屏幕, 或暂停程序执行1秒. 

Python 支持的函数式特性不采用极端风格, 例如避免所有I/O输入输出或赋值. 相反, 提供函

数式接口, 在内部使用非函数式特性. 例如, 一个函数可以给局部变量赋值, 但是不会修改全局

变量, 或有其它副作用. 

函数式编程是面向对象编程的反例. 对象包含内部状态和修改状态的方法. 函数式编程通过在函

数间传递数据流, 来极力避免修改状态. Python 里可以组合两种方法, 编写函数能接收或输出

对象实例. 

函数式设计的限制看起来奇怪. 为何需要避免对象和副作用呢?函数式的理论和实践优点是:

形式证明:不幸的是, 证明程序正确性是不切实际的. 你生成的证明可能包含错误, 

却让你错误地相信你证明了程序的正确性. 

模块:把程序分成更小的函数模块, 一个函数只做一件事. 

组合:利用现有函数组装新程序. 

调试与测试:按函数调试输入输出. 按函数做单元测试. 

---

迭代器

---

迭代器是 Python 支持函数式编程的重要基础. 迭代器表示一个数据流, 一次只取一个数据. 

Python 在很多地方用到迭代器, 比如 for 语句, for x in y, y需要是可迭代的. 

迭代器可以被具体化为 list 或 tuple. 

序列解包也支持迭代器, 如果一个迭代器返回 n 个元素, 就可以解包为 n 个元素的 tuple. 

内置函数 max() 和 min() 接收迭代器参数. 

in 和 not in 也支持迭代器. 

支持迭代器的数据类型:

list, tuple, str, ..等序列类型. 

dict. 

set. 

readline() 读文件

---

生成器和列表推导

---

生成器和列表推导表达式来自函数式语言 Haskell. 

生成器可以简化编写迭代器, 生成器可以返回一个迭代器. 

---

内置函数

---

# 把函数应用到每个元素

map(function, iterable, *iterables)

# 过滤元素,返回函数返回为真的元素

filter(function, iterable)

# 枚举对象,返回索引和对象

enumerate(iterable, start=0)

# 返回有序列表

sorted(iterable, /, *, key=None, reverse=False)

# 任一元素为真返回真

any(iterable)

# 全部元素为真返回真

all(iterable)

# 从每个序列中取一个元素合并成为元组 (A1, B1,), (A2, B2,), 

zip(iterA, iterB, ...)

# n-length groups idiom 

# zip(* [iter(s)]*n )

# zip(*([iter(s)]*n))

>>> s = [1, 2, 3, 4, 5, 6]

>>> list(  zip(  *[iter(s)] *2  )  )

[(1, 2), (3, 4), (5, 6)]

>>> list(  zip(  *[iter(s)] *3  )  )

[(1, 2, 3), (4, 5, 6)]

>>> 

---

高阶函数

---

# 偏函数应用

partial(func, /, *args, **keywords)

# 把函数应用到每个元素,并返回累积值

reduce(function, iterable[, initializer])

---

运算符模块

---

Math operations: add(), sub(), mul(), floordiv(), abs(), …

Logical operations: not_(), truth().

Bitwise operations: and_(), or_(), invert().

Comparisons: eq(), ne(), lt(), le(), gt(), and ge().

Object identity: is_(), is_not().

---

lambda

---

lambda 表达式是一个匿名函数

https://docs.python.org/3/howto/functional.html

标签:

最近更新

Python 函数式编程
2023-04-16 03:59:06
【环球速看料】2022手机耳机十大品牌排行榜_手机耳机哪个牌子好
2023-04-15 22:41:04
朝阳社保咨询电话12333-朝阳社保电话咨询电话
2023-04-15 20:50:57
江苏男篮相关负责人:目前正在配合调查_全球讯息
2023-04-15 19:04:34
公司名字大全参考两个字 两个字公司名字大全必过
2023-04-15 17:23:52
环球热推荐:逆变器龙头股前三_逆变器板块龙头股(4/14)
2023-04-15 16:09:46
焦点观察:数说中国·首季经济形势|稳中向好,暖意渐浓——一季度我国外贸形势观察
2023-04-15 14:10:37
环球最新:上市公司研究院|20多家券商建议“买入”,备受追捧的康缘药业成色几何
2023-04-15 11:12:18
2022年中国茶叶市场供需现状及进出口贸易分析:产量及需求量持续上涨 [图] 环球焦点
2023-04-15 09:26:12
589家豫企组团赴广交会抢订单
2023-04-15 08:10:51
世界今日讯!apache虚拟主机配置
2023-04-15 06:14:14
复星医药(02196.HK):4月14日南向资金减持12.05万股 全球热文
2023-04-15 03:21:56
专家回应新冠核酸阳性率回升:不太可能出现大规模暴发
2023-04-14 23:01:53
沙尘又来,周末轻度污染!上海人如今对“雨”的态度很微妙……
2023-04-14 20:16:20
周黑鸭持续发力,创新产品取得良好成绩!
2023-04-14 18:59:47
送礼送啥好_全球今热点
2023-04-14 18:23:00
艰难险阻难舍“锂”梦 腾飞前路有“锂”同行—大中矿业成功取得湖南临武县鸡脚山矿区钨锡多金属矿探矿权
2023-04-14 17:56:13
证券板块涨0.16% 红塔证券涨4.23%居首
2023-04-14 17:19:19
滨城区高效课堂建设观摩活动在清怡小学拉开帷幕
2023-04-14 16:12:20
【天天时快讯】宝特电业东莞摘地 投2亿元建生产基地
2023-04-14 15:32:15
民生香白卡是什么卡啊?民生银行信用卡白金卡好申请吗?
2023-04-14 14:52:43
理财保险存3年6年取后悔了怎么办?能提前取钱吗?
2023-04-14 13:36:06
长康集团亮相第108届成都糖酒会,客商联谊会成交流亮点
2023-04-14 12:11:50
空调行业市场供需分析 空调行业进出口市场分析2023
2023-04-14 11:37:38
重庆大学2022年福建(物理类)高校专项计划录取分数线 天天观热点
2023-04-14 10:48:37
港股异动 | 荣昌生物-B(09995)涨超6% 爱地希治疗实体瘤患者相关新药临床研究申请获批-环球今日报
2023-04-14 10:00:20
天天新资讯:张继科事件又一“受害者”曝光,炒作还是真无辜?
2023-04-14 09:10:07
三国志战棋版黄忠配队打法思路
2023-04-14 08:22:41
3200频率DDR4内存8G只要71元|全球微头条
2023-04-14 06:51:49
血亏!曼联本场遭补时绝平+2人乌龙+2人伤退+1人停赛
2023-04-14 05:30:44