当前位置: 首页 > 滚动 > >正文

Python 函数式编程

来源:哔哩哔哩    时间:2023-04-16 03:59:06

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