函数式编程
是指用一系列函数解决问题
要求:def创建的函数最好不要访问局部作用域以外的变量,这样可以保证返回结果的唯一性
函数是一等公民(Guido)
1. 函数本身可以赋值给变量,赋值后变量绑定函数
2. 允许将函数本身作为参数传入另一个函数
3. 允许函数返回一个函数
好处:
1.用每一个函数完成细小的功能,一系列函数在任意组合可以完成大问题
2.函数仅接受输入并产生输入,不包含任何能影响输出的内部状态
函数的可重入性:
当一个函数在运行时不读取和改变除局部作用域以外的变量时,此函数为可重入函数
可重入函数在每次调用时,如果参数一定,则结果必然一定
示例:
可重入函数:
def add1(x, y):
return x + y
不可重入函数示例:
y = 200
def add2(x):
return x + y
print(add2(10)) # 210
y = 300
print(add2(10)) # 310
高阶函数 high order function
什么是高阶函数
满足下列条件中一个的函数即为高阶函数
1. 函数接收一个或多个函数作为参数传入
2. 函数返回一个函数
python中内建的高阶函数:
map, filter, sorted
map 函数
map(func, *iterables) 用函数和对可迭代对象中的每一个元素作为参数返回新的可迭代对象.当最短的一个可迭代对象不再提供数据时迭代结束
要求:
func函数接收的参数个数必须与可迭代对象的个数相同
示例见:
map.py
练习 :
1. 求 1**2 + 2**2 + 3**2 + ...+ 9**2的和
(用函数式和高阶函数map实现)
2. 求 1**3 + 2**3 + 3**3 + ...+ 9**3的和
3. 求: 1**9 + 2**8 + 3**7 + .... + 9**1的和
filter 函数:
格式:
filter(function, iterable)
作用:
筛选可迭代对象iterable中的数据,返回一个可迭代对象,此可迭代对象将对iterable提供的数据进行筛选
说明:
函数function 将对iteralbe中的每个元素进行求布尔值,返回True则保留,返回False则丢弃
示例见:
filter.py
练习:
1. 把之前写的is_prime(x)判断x是否为素数的函数复制过来
1) 用filter函数把100到200的全部素数求出来,放入列表L中
2) 求300 ~ 400之间全部素数的和
sorted 函数
作用:
将原可迭代对象提供的数据进行排序,生成排序后的列表
格式:
sorted(iterable, key(必须是key)=None, reverse=False)
说明:
iterable 可迭代对象
key 函数是用来提供一个排序参考值的函数,这个函数的返回值将作为排序的依据
reverse 标志用来设置是否降序排序
示例:
L = [5, -2, -4, 0, 3, 1]
L2 = sorted(L) # [-4, -2, 0, 1, 3, 5]
# 要得到这样的结果该怎么办?
L3 = sorted(L, key=abs) # [0, 1, -2, 3, -4, 5]
names = ['Tom', 'Jerry', 'Spike', 'Tyke']
# 结果 ['Tom', 'Tyke', 'Jerry', 'Spike']
L = sorted(names, key=len)
练习:
已知:
names = ['Tom', 'Jerry', 'Spike', 'Tyke']
排序的依据为原字符串反序的字符串
'moT', 'yrreJ', 'ekipS', 'ekyT'
结果:
['Spike', 'Tyke', 'Tom', 'Jerry']
递归函数 recursion
函数直接或间接的调用自身
示例:
def f():
f() # 直接调用自己,进入递归
f()
# 函数间接调用自身
def fa():
fb()
def fb():
fa()
fa()
print("递归完成")
说明:
递归一定要控制递归的层数,当符合一定条件时要终止递归调用
几乎所有的递归都能用while循环来代替
优点:
递归可以把问题简单化,让思路更为清晰,代码更简洁
缺点:
递归因系统环境影响大,当递归深度太大时,可能会得到不可预知的结果
递归的两个阶段:
递推阶段: 从原问题出发,按递归公式递推从未知到已知,最终达到递归的终止条件
回归阶段: 按递归终止条件求出结果,逆向逐步代入递归公式,回归到问题求解
示例见:
recursion.py
示例:
写一个函数求n的阶乘(递归实现)
见:
recursion_factorial.py
递归的实现方法
先假设函数已经实现
练习:
写一个函数mysum(n), 用递归方法求
1 + 2 + 3 + 4 + .... + n的和
def mysum(n):
....
print(mysum(100)) # 5050
闭包 closure
闭包是指引用了此函数外部嵌套函数作用域变量的函数
闭包必须满足三个条件:
1. 必须有内嵌函数
2. 内嵌函数必须引用外部函数中的变量
3. 外部函数返回值必须是内嵌函数.