函数式编程
函数式编程
- 函数式编程是指用一系列函数解决问题
- 函数是一等公民
好处:
- 用每个函数完成细小的功能,一系列函数组合可以解决大问题
- 函数仅接收输入并产生输出,不包含任何能影像输出的内部状态
函数的可重入性:
- 当一个函数输入的实参一定,结果也必须一定的函数称为可重入函数
- 说明:
-可重入函数在函数内部一定不访问除局部变量以外的变量
- 说明:
示例:
# 可重入函数:
def myadd(x, y):
return x + y
# 不可重入函数
s = 0
def myadd2(x, y):
global s
s += x + y
return s
高阶函数:
- (High Order Function)
- map filter sorted
什么是高阶函数
- 满足以下条件中一个的函数即为高阶函数
- 函数接受一个或多个函数作为参数传入
- 函数返回一个函数
- map 函数
- map(func,*iterable),返回一个可迭代对象,此可迭代对象用函数func对可迭代对象iterable中的每一个元素作用参数计算后得一个结果,当最短的一个可迭代对象不再提供数据时刻碟大爱对象生成数据结束
示例:
def power2(x):
return x ** 2
# 生成一个可迭代对象,此可迭代对象可以生成1~9的
# 整数的平方
for x in map(power2, range(1, 10)):
print(x)
# 生成一个可迭代对象, 此可迭代对象可以生成:
1**4, 2**3, 3**2, 4**1
def mypower2(x, y):
return x ** y
for x in map(mypower2,[1,2,3,4],[4,3,2,1]):
print(x)
- filter函数:
- filter (function,iterable) 返回一个可迭代对象此可迭代对象将iterable提供的数据用函数进行筛选,function将对iterable中的每个元素求值。返回False 将此数据丢弃,返回True则保留
- 示例:
def isodd(x):
return x % 2 == 1
# 打印0~10之间所有的奇数:
for x in filter(isodd, range(11)):
print(x)
for x in filter(lambda x:x%2, range(11)):
print(x)
L = [x for x in filter(isodd, range(11))]
- sorted函数
- 作用:
- 将原可迭代对象提供的数据进行排序,生成排序后的列表
- 格式说明:
- sorted(iterable ,key=None,reverse=False)
- 返回一个新的保安汗啊所有可迭代啊对象中的列表,新的列表是排序过来的列表。
- 参数说明:
- iterable 可迭代对象
- key 函数是用来提供一个值,这个值作用排序的依据
- reverse 是否降序排列
- 作用:
示例:
L = [5, -2, -4, 0, 3, 1]
L2 = sorted(L) # L2=[-4, -2, 0, 1, 3, 5]
L3 = sorted(L, reverse=True) # 从大到小排序
L4 = sorted(L, key=abs) # L4=[0, 1, -2, 3, -4, 5]
# 依据 0, 1, 2, 3, 4, 5
names = ['Tom', 'Jerry', 'Spike', 'Tyke']
sorted(names) # ['Jerry', 'Spike', 'Tom', 'Tyke']
sorted(names, key=len)
sorted(names, key=len, reverse=True)
递归函数
- 函数直接或者间接调用自身
示例:
# 函数直接调用自身
def f():
f() # 调用自己
f()
# 函数间接调用自身
def fa():
fb()
def fb():
fa()
fa()
递归说明:
- 递归一定要控制递归的层数,当符合某一条件事要终止递归调用几乎所有的递归都能用while
- 递归的优缺点:
- 优点:可以把问题简单化,让思路更为清晰,代码简洁
- 缺点:递归因系统环境影响大,递归深度太大可能得不到预知的结果。
- 递归函数的执行分为两个阶段:
- 递推阶段:调用函数的内部
- 回归阶段:返回结果,得到最终的结果
闭包 clusure
- 什么是闭包?
- 闭包是指用了此函数外部变量的函数(外部变量是指外部嵌套函数作用域内的变量)
- 闭包必须满足的三个条件:
- 必须有一个嵌套函数
- 内嵌函数必须引用外部函数中的变量
- 外部函数返回值必须是内部嵌套函数
- 注意点:
- 由于闭包会使函数中的变量都被保留在内存中,内存消耗比较大,座椅不能滥用闭包
示例:
闭包测试题:
试看下列程序的执行结果是什么?
def get_funs(n):
L = []
for i in range(n):
L.append(lambda x: x * i)
return L
funs = get_funs(4)
print(funs[0](10)) # 30
print(funs[1](10)) # 30
print(funs[2](10)) # 30
print(funs[3](10)) # 30