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
X 关闭
Copyright © 2015-2022 北方洁具网 版权所有
备案号:京ICP备2021034106号-50
联系邮箱: 55 16 53 8@qq.com