Learning Python 012 函数式编程 1 高阶函数
2016-07-23 02:11
597 查看
Python 函数式编程 1 高阶函数
高阶函数
Q:什么是高阶函数?A:一个函数接收另一个函数作为参数,这种函数就称之为高阶函数。
简单举个例子:
def add(x, y, f): return f(x) + f(y)
使用这个函数:
>>> add(-5, 6, abs) 11
它是这样执行的:
x = -5 y = 6 f = abs f(x) + f(y) ==> abs(-5) + abs(6) ==> 11 return 11
map/reduce
map
map()是一个高阶函数。
map()函数接收两个参数,一个是函数,一个是
Iterable,
map将传入的函数依次作用到序列的每个元素,并把结果作为新的
Iterator返回。
def f(x): return x * x r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9]) print(r) print(list(r))
运行:
<map object at 0x000000821D2A11D0> [1, 4, 9, 16, 25, 36, 49, 64, 81]
由于结果
r是一个
Iterator,
Iterator是
惰性序列,因此通过
list()函数让它把整个序列都计算出来并返回一个
list。
再比如,把这个
list所有数字转为字符串:
>>> list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9])) ['1', '2', '3', '4', '5', '6', '7', '8', '9']
reduce
reduce把一个函数作用在一个序列
[x1, x2, x3, ...]上,这个被传入的 函数必须接收两个参数,
reduce把结果继续和序列的下一个元素做累积计算。效果就是:
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)。
举个例子:一个序列求和
>>> from functools import reduce >>> def add(x, y): ... return x + y ... >>> reduce(add, [1, 3, 5, 7, 9]) 25
当然求和运算可以直接用Python内建函数
sum(),没必要动用
reduce。
>>> sum([1, 3, 5, 7, 9]) 25
再举个例子:把序列
[1, 3, 5, 7, 9]变换成整数
13579
>>> from functools import reduce >>> def fn(x, y): ... return x * 10 + y ... >>> reduce(fn, [1, 3, 5, 7, 9]) 13579
再举个例子:把
str转换为
int
>>> from functools import reduce >>> def fn(x, y): ... return x * 10 + y ... >>> def char2num(s): ... return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s] ... >>> reduce(fn, map(char2num, '13579')) 13579
整理代码:
from functools import reduce def str2int(s): def fn(x, y): return x * 10 + y def char2num(s): return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s] return reduce(fn, map(char2num, s))
总结:
假设Python没有提供
int()函数,你完全可以自己写一个把字符串转化为整数的函数,而且只需要几行代码!
filter
filter()函数用于过滤序列。
filter()也接收一个
函数和一个
序列。
filter()函数把传入的函数依次作用于每个元素,根据返回值是
True还是
False决定保留还是丢弃该元素。
举例:
一个list中,删掉偶数,只保留奇数:def is_odd(n): return n % 2 == 1 list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15])) # 结果: [1, 5, 9, 15]
一个序列中的空字符串删掉:
def not_empty(s): return s and s.strip() list(filter(not_empty, ['A', '', 'B', None, 'C', ' '])) # 结果: ['A', 'B', 'C']
strip()函数用法:
当没有形参传入
strip()函数时,默认删除空白符(包括
'\n',
'\r',
'\t‘,
' ')
strip()函数的具体用法请到这里学习:http://www.cnblogs.com/kaituorensheng/archive/2013/05/23/3096028.html
filter()函数返回的是一个
Iterator,所以 要强迫
filter()完成所有计算,就使用
list()函数获取所有结构,返回一个
list.
sorted
sorted()函数是:排序算法。
>>> sorted([36, 5, -12, 9, -21]) [-21, -12, 5, 9, 36]
sorted()函数也是一个高阶函数。接收一个
key函数来实现自定义的排序。比如:
>>> sorted([36, 5, -12, 9, -21], key=abs) [5, 9, -12, -21, 36]
再看一个字符串排序的例子:
>>> sorted(['bob', 'about', 'Zoo', 'Credit']) ['Credit', 'Zoo', 'about', 'bob']
默认的排序规则是:按照
ASCII的大小比较的,由于
'Z' < 'a',所以,大写字母
Z会排在小写字母
a的前面。
给
sorted传入
key函数,忽略大小写的排序:
>>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower) ['about', 'bob', 'Credit', 'Zoo']
实现反向排序,传入第三个参数
reverse=True:
>>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True) ['Zoo', 'Credit', 'bob', 'about']
参考网站:
http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014318230588782cac105d0d8a40c6b450a232748dc854000
相关文章推荐
- Python动态类型的学习---引用的理解
- Python3写爬虫(四)多线程实现数据爬取
- 垃圾邮件过滤器 python简单实现
- 下载并遍历 names.txt 文件,输出长度最长的回文人名。
- install and upgrade scrapy
- Scrapy的架构介绍
- Centos6 编译安装Python
- 使用Python生成Excel格式的图片
- 让Python文件也可以当bat文件运行
- [Python]推算数独
- Python中zip()函数用法举例
- Python中map()函数浅析
- Python将excel导入到mysql中
- Python在CAM软件Genesis2000中的应用
- 使用Shiboken为C++和Qt库创建Python绑定
- FREEBASIC 编译可被python调用的dll函数示例
- Python 七步捉虫法