函数是编程语言内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计。
函数就是面向过程的程序设计的基本单元。函数式编程(英语:Functional programming)或者函数程序设计,又称泛函编程,是一种编程范型;它虽然也可以归结到面向过程的程序设计,但其思想更接近数学计算。
1 2 3 4 5 | 计算机(Computer)和计算(Compute) 在计算机的层次上,CPU执行的是加减乘除的指令代码,以及各种条件判断和跳转指令,所以,汇编语言是最贴近计算机的语言。 而计算则指数学意义上的计算,越是抽象的计算,离计算机硬件越远。 |
对应到编程语言,就是越低级的语言,越贴近计算机,抽象程度低,执行效率高,比如C语言;越高级的语言,越贴近计算,抽象程度高,执行效率低,比如Lisp语言。
函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有副作用。而允许使用变量的程序设计语言,由于函数内部的变量状态不确定,同样的输入,可能得到不同的输出,因此,这种函数是有副作用的。
纯函数式的程序没有变量和副作用。因为纯函数式程序设计语言没有变量,函数没有副作用,编写出的程序可以利用记忆化、公共子表达式消除和并发计算在运行时和编译时得到大量优化。
函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数!
Python对函数式编程提供部分支持。由于Python允许使用变量,因此,Python不是纯函数式编程语言。
高阶函数
把函数作为参数传入,或者把函数作为返回值返回,这样的函数称为高阶函数,函数式编程就是指这种高度抽象的编程范式。
1.map()
1 2 3 4 5 | >>> def xr(x): ... return x * x ... >>> map (xr, [ 1 , 0 , 2 , 4 , 1024 ]) [ 1 , 0 , 4 , 16 , 1048576 ] |
当写xr
时,指的是函数对象本身,当我们写xr(1)
时,指的是调用xr函数,并传入参数1,期待返回结果1。
如果不用map()的话:
1 2 3 4 5 6 7 8 | def xr(x): return x * x L = [] for n in [ 1 , 0 , 2 , 4 , 1024 ]: L.append(xr(n)) print L |
可以看出map()作为高阶函数,事实上它把运算规则抽象了。
2.reduce()
reduce(function,sequence)
function接收的参数个数只能为2先把sequence中第一个值和第二个值当参数传给function,再把function的返回值和第三个值当参数传给function,然后只返回一个结果。
1 2 3 4 5 | >>> def fc(x, y): ... return x * 10 + y ... >>> reduce (fc, [ 1 , 3 , 5 , 7 , 9 ]) 13579 |
3.sorted()它还可以接收一个比较函数来实现自定义的排序
1 2 | >>> sorted ([ 36 , 23 , 4325 , 234 , 1 , 2 ]) [ 1 , 2 , 23 , 36 , 234 , 4325 ] |
匿名函数
lambda会创建一个函数对象,但不会把这个函数对象赋给一个标识符,而def则不同,它在创建函数对象的同时会进行这种操作。这是lambda的第一个特点。lambda的第二个特点是,它只是一个表达式,而不是一个语句;不用写return,返回值就是该表达式的结果。
1 2 | >>> map ( lambda x: x * x, [ 1 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ]) [ 1 , 9 , 16 , 25 , 36 , 49 , 64 , 81 ] |
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 理解Rust引用及其生命周期标识(下)
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 2025成都.NET开发者Connect圆满结束
· 后端思维之高并发处理方案
· 千万级大表的优化技巧
· 在 VS Code 中,一键安装 MCP Server!
· 10年+ .NET Coder 心语 ── 继承的思维:从思维模式到架构设计的深度解析