函数式编程
函数式编程是指用一系列函数决定问题
函数是一等公民
- 函数本身可以赋值给变量,赋值后变量绑定函数
- 允许将函数本身作为参数传入另一个函数
- 允许返回一个函数
函数的可重入性
- 可重入是指一个函数传的参数一定,则结果必须一定
-
def
定义的函数不要访问除局部变量以外的变量,结果不受外界的影响
# 以下是不可重入的函数myadd
y = 200
def myadd(x):
return x + y
print(myadd(10)) # 210
y = 300
print(myadd(10)) # 310
# 以下是可重入的函数 myadd
def myadd(x, y):
return x + y
print(myadd(10, 20)) # 30
高阶函数 (High Order Function)
什么是高阶函数:
满足下列一个条件的函数即为高阶函数:
- 函数接受一个或多个函数作为参数传入
- 函数返回一个函数
Python中内建的高阶函数
map
函数
-
map(func, *iterables)
用函数和对可迭代对象中的每一个元素作为参数计算出新的可迭代对象,当最短的一个可迭代对象不再提供数据时,此可迭代对象生成结束 - 可迭代对象的个数要与
func
函数的个数相同
def pow2(x):
return x ** 2
for x in map(pow2, range(1, 10)):
print(x,end = ' ') # 1 4 9 16 25 36 49 64 81
# ********************************************* #
# 内建的pow(x, y, z=None)
# 生成 1 ** 4 , 2**3 , 3 ** 2, 4 ** 1
for x in map(pow, range(1, 10), range(4,0,-1)):
print(x) # 1, 8, 9, 4
for x in map(pow, [2,3,5,7],[4,3,2,1], range(5, 10)):
print(x) # 1, 3, 4, 7
# 求 1 ** 2 + 2 ** 2 + 3 ** 2 + ... + 9**2 的和
def pow2(x):
return x**2
print(sum(map(pow2,range(1,10))))
print(sum(map(lambda x:x**2,range(1,10))))
# 求 1 ** 3 + 2 ** 3 + 3 ** 3 + ... + 9**3 的和
print(sum(map(lambda x:x**3,range(1,10))))
# 求 1**9 + 2**8 + 3**7 + ... + 9**1的和 # 11377
print(sum(map(lambda x,y:x**y,range(1,10),range(9,0,-1))))
# ********************************************* #
# 错误示例
def pow2(x,y):
return x ** y
for x in map(pow2, range(1, 10)):
print(x,end = ' ')
filter
函数
filter(func, iterable)
- 筛选可迭代对象
iterable
中的数据,返回一个可迭代对象,此可迭代对象将对iterable
进行筛选 - 函数
func
将对每个元素进行求值,返回False
则将此数据丢弃,返回True
则保留此数据
def isodd(x): # 此函数判断x是否为奇数
return x % 2 == 1
for x in filter(isodd, range(10)):
print(x,end=' ') # 1 3 5 7 9
# ************************************************* #
even = [x for x in filter(lambda x: x%2==0, range(10))]
print(even) # [0, 2, 4, 6, 8]
sorted
函数
- 将原可迭代对象的数据进行排序,生成排序后的列表
-
sorted(iterable, key=None, reverse=False)
iterable
可迭代对象
key
函数是用来提供一个参考值,这个值将作为排序的依据
reverse
标志用来设置是否降序排序
L = [5, -2, -4, 0, 3, 1]
L1 = sorted(L) # L1 = [-4, -2, 0, 1, 3, 5]
L2 = sorted(L, reverse=True) # L2 = [5, 3, 1, 0, -2, -4]
L3 = sorted(L, key=abs) # L3 = [0, 1, -2, 3, -4, 5]
eval()
函数
- 把一个字符串当成一个表达式来执行,返回表达式执行后的结果,如果字符串不是表达式则会出错
eval(source, global=None, locals=None)
x = 100
y = 200
a = eval('x+y')
print(a) # 300
exec()
函数
- 把一个字符串当成程序来执行
exec(source, globals=None, locals=None)
x = 100
y = 200
s = 'z = x+y; print(z); del z; print("删除成功")'
# 执行s绑定的语句
exec(s)
# 300
# 删除成功
# ********************************** #
# eval 和 exec 的两个参数 globals 和 locals
# 这两个参数是用来设置表达式或程序运行的全局变量和局部变量
x = 100
y = 200
s = 'print(x, y, x + y)'
exec(s) # 100 200, 300
exec(s, {'x': 10, 'y': 20}) # 10, 20, 30
exec(s, {'x': 10}, {'x': 1, 'y': 2}) # 1 2 3
exec(s, {'x': 10}, {'y': 2}) # 10 2 12