Python学习札记(二十) 函数式编程1 介绍 高阶函数介绍
参考:
Note
A.函数式编程(Functional Programming)介绍
1.函数是Python内建支持的一种封装,我们通过一层一层的函数调用把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计。函数就是面向过程的程序设计的基本单元。这一点和C语言是一致的。
2.计算机和计算的概念:
a.在计算机的层次上,CPU执行的是加减乘除的指令代码,以及各种条件判断和跳转指令,所以,汇编语言是最贴近计算机的语言。
b.计算则指数学意义上的计算,越是抽象的计算,离计算机硬件越远。
因此对应到编程语言:越低级的语言,越贴近计算机,抽象程度低,执行效率高,比如C语言;越高级的语言,越贴近计算,抽象程度高,执行效率低,比如Lisp语言。
- 函数式编程就是一种抽象程度很高的编程范式;
- 纯粹的函数式编程语言编写的函数没有变量 => 任意一个函数,只要输入是确定的,输出就是确定的 => 我们称之为没有副作用。
- 而允许使用变量的程序设计语言 => 函数内部的变量状态不确定,同样的输入,可能得到不同的输出 => 这种函数是有副作用的。
3.函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数。
4.Python对函数式编程提供部分支持。由于Python允许使用变量,因此,Python不是纯函数式编程语言。
B.高阶函数 Higher-order function
1.变量可以指向函数:
#!/usr/bin/env python3
a = abs(-10)
print(a)
b = abs
print(b)
sh-3.2# ./intro.py
10
<built-in function abs>
结论:函数本身也可以赋值给变量,即:变量可以指向函数。
可以通过指向函数的变量来调用该函数:
print(b(-199))
199
说明现在变量b指向函数abs(),调用b()相当于调用abs()。
2.函数名是变量:函数名其实就是指向函数的变量。
例如,对于abs()这个方法,abs完全就是指向该函数的变量。但是如果将abs指向其他object,就无法再次调用abs原来指向的函数。
abs = 10
print(abs)
print(abs(-10))
10
Traceback (most recent call last):
File "./intro.py", line 17, in <module>
print(abs(-10))
TypeError: 'int' object is not callable
注:abs函数本身来自模块builtins,若要改动整个模块的abs指向,使用以下语句:
import builtins
builtins.abs = 10
3.传入函数:既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。
例如:一个简单的高阶函数
#!/usr/bin/env python3
def addtwonums(a, b) :
return a+b
def func(a, b, f) :
return f(a, b)
def main() :
a = int(input())
b = int(input())
f = addtwonums
print(func(a, b, f))
if __name__ == '__main__':
main()
sh-3.2# ./intro2.py
100
99
199
4.把函数作为参数传入,这样的函数称为高阶函数,函数式编程就是指这种高度抽象的编程范式。
2017/2/10
Python学习札记(二十) 函数式编程1 介绍 高阶函数介绍的更多相关文章
- Python学习札记(二十一) 函数式编程2 map/reduce
参考:map/reduce Note 1.map():map()函数接收两个参数,一个是函数,一个是Iterable.map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回. ...
- Python学习札记(二十三) 函数式编程4 sorted
参考:sorted NOTE 1.sorted,快速排序,时间复杂度O(nlogn)渐进最优. #!/usr/bin/env python3 L = [] for i in range(10): L. ...
- Python学习札记(二十七) 函数式编程8 偏函数
偏函数 NOTE 1.int()函数提供额外的base参数,默认值为10.如果传入base参数,就可以做N进制的转换: #!/usr/bin/env python3 import functools ...
- Python学习札记(二十六) 函数式编程7 修饰器
修饰器 NOTE 1.函数对象有一个__name__属性,可以拿到函数的名字: #!/usr/bin/env python3 def now(): print('2017/2/19') def mai ...
- Python学习札记(二十四) 函数式编程5 返回函数
参考:返回函数 NOTE 1.高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回. eg.求和函数 #!/usr/bin/env python3 def calsums(*args): a ...
- Python学习笔记二:函数式编程
1:Python中,内置函数名相当于一个变量,指向内置函数.所以可以通过函数名调用相应函数,也可以给函数名赋值,改变它的内容,如:可以把另一个函数变量赋值给它,那它就指向了所赋值的函数了. 2:高级函 ...
- Python---12函数式编程------12.1高阶函数
函数式编程 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计 ...
- Python学习札记(二十五) 函数式编程6 匿名函数
参考:匿名函数 NOTE 1.Python对匿名函数提供了有限的支持. eg. #!/usr/bin/env python3 def main(): lis = list(map(lambda x: ...
- Python学习札记(二十二) 函数式编程3 filter & SyntaxError: unexpected EOF while parsing
参考: filter Problem SyntaxError: unexpected EOF while parsing 遇到该语法错误,一般是由于 括号不匹配 问题. Note 1.filter 用 ...
随机推荐
- HTTP代理服务器基本知识
http://www.cnblogs.com/TankXiao/archive/2012/12/12/2794160.html https://blog.csdn.net/xiaoxiaorenky/ ...
- Linux命令(基础1)
一 命令的基本构成 (PS:Linux发行版本命令大概有200多个,熟练掌握个百八的就行了,其余的有个大概了解) 命令体 选项 参数(对象) ls -l /var 1.1参数:文件 文件类型: d ...
- CentOS6.5之Zabbix3.2.2 Server安装、汉化及Agent安装
1.安装MySQL 1.1.安装MySQL rpm -ivh http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm yum ...
- CS224n(一)
个人博客地址: https://yifdu.github.io/2018/10/30/CS224n%E7%AC%94%E8%AE%B0%EF%BC%88%E4%B8%80%EF%BC%89/#more
- html5游戏开发-零基础开发《圣诞老人送礼物》小游戏
开言: 以前lufy前辈写过叫“ HTML5游戏开发-零基础开发RPG游戏”的系列文章,在那里面我学习了他的引擎以及了解了游戏脚本.自从看了那几篇文章,我便对游戏开发有了基本的认识.今天我也以零基础为 ...
- 嵌入式文件系统构建工具 busybox / buildroot / openwrt
1.busybox busybox最轻量 1) 修改Makefile CROSS_COMPILE ?= /usr/local/gcc-linaro-arm-linux-gnueabihf/bin/ar ...
- 虚拟机——安装虚拟机时,提示intel VT-x处于禁用状态
1.联想Lenovo扬天T4900C-00安转虚拟机提示: 按F12进入bios模式,修改Intel VT-x为启用,BIOS中依次选择:Advanced(高级)——CPU Configuration ...
- Jquery源码分析(一)
版本: jQuery JavaScript Library v3.2.1 分析架构: 打开jquery.js,哇塞,一万多行,噩梦啊!很多人就say bye-bye了.其实,将代码结构拆分后,再分析源 ...
- WooCommerce Shortcode 简码使用方式说明
WooCommerce 自帶的几个简易代码,可以用来插入文章和页面內容里面.下面简码安裝时会自动建立,因此,应该不需要使用在其他地方 : [woocommerce_cart] – 顯示購物車頁面 [w ...
- Element 中表单非必填数据项 必须为数字的验证问题
Element-ui 的el-form组建中,自带基本的验证功能,比如某些项必填的验证,直接加入rules 规则中即可,如下实例: 在页面中书写如下: <el-form-item label=& ...