Python学习笔记
来源:互联网 发布:windows中国官网 编辑:程序博客网 时间:2024/06/01 07:52
Python学习笔记 - 函数式编程
根据廖雪峰的Python教程做成的笔记,其中不包含全部知识点,仅是重点或是容易发生混淆或者忘记的部分。
函数式编程特点:
允许把函数本身作为参数传入另一个函数,还允许返回一个函数。
1.高阶函数
变量可以指向函数,类似于C++中函数指针的概念:
func = absfunc(-6)
也可以把函数名作为参数传入另一个函数:
def add(x, y, f) return f(x) + f(y)调用:add(-5, 6, abs)
1.1 map/reduce
Python内建了map()和reduce()函数。
1.1.1 map()函数
map函数接收两个参数:函数、Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。
例1:有一个函数f(x) = x²,要把这个函数作用在一个list [1,2,3,4,5,6,7,8,9]上。
# 函数定义:def f(x): return x * x# 函数调用:r = map(f, [1,2,3,4,5,6,7,8,9])L = list(r)# r = [1,4,9,16,25,36,49,64,81]
1.1.2 reduce()函数
reduce
把一个函数作用在一个序列[x1,x2,x3,...]
上,这个函数必须接收两个参数,reduce
把结果继续和序列的下一个元素作累计运算。
例1:对一个序列求和。
from functools import reduce# 函数定义def add(x, y): return x + y# 函数调用sum = reduce(add, [1,3,5,7,9])# sum = ((((1 + 3) + 5) + 7) + 9) = 25
例2:把序列
[1,3,5,7,9]
变成整数13579
def fn(x, y): return x * 10 + yret = reduce(fn, [1,3,5,7,9])# ret = 13579
例3:利用map/reduce实现str2int函数
def str2int(s): def fn(x, y): return x * 10 + y def char2num(ch): m = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7':7, '8': 8, '9': 9} return m[ch] return reduce(fn, map(char2num, s))# 调用:ret = str2int('10086')
1.2 filter
Python内建的filter函数用于过滤序列,和map()
一样也是接收一个函数和一个序列,不同的是filter()
把传入的函数依次作用于每个元素,然后根据返回值是True
还是False
决定保留还是丢弃该元素(True
删除,False
保留)。
例1:在一个list中,删掉偶数,只保留奇数。
def is_odd(n): return n % 2 == 1list(filter(is_odd, [1,2,4,5,6,9,10,15]))# 结果:[1,5,9,15]
例2:把一个序列中的空字符串删掉。
def not_empty(s): return s and s.strip()list(filter(not_empty, ['A', '', 'B', None, 'C', ' ']))# 结果:['A', 'B', 'C']
阅读全文