函数式编程
是一种编程范式
将电脑运算视为数学上的函数计算,并且避免可变数据
函数式编程最重要的基础是lambda演算,而且lambda演算的函数可以接受函数当作输入和输出
python支持有限的函数式编程功能
- filter(func, seq)
调用一个布尔函数 func 来迭代遍历每个 seq 中的元素; 返回一个func 返回值为 true 的元素的序列。
-
__map(func, seq1[,seq2...]) __
将函数 func ‘映射’到给定序列的每个元素,并用一个列表来提供返回值;如果 func 为 None, func 表现为一个身份函数,返回一个含有每个序列中元素集合的 n 个元组的列表。 -
reduce(func, seq[, init]) (折叠函数)
将二元函数(两个输入值,一个输出值的函数)作用于 seq 序列的元素。它通过取出序列的头两个元素,将他们传入二元函数来获得一个单一的值。把这个值和序列的下一个元素传入二元函数来获得又一个值,然后继续直到整个序列的内容都遍历完毕以及最后的值会被计算出来为止,返回最后的值;如果初始值 init 给定,第一个比较会是 init 和第一个序列元素而不是序列的头两个元素。注意传递的是函数名,不能加(),不是调用函数
filter()示例
def f1(x):
if x>20:
return True
else:
return False
l1 = [1, 3, 40, 24, 15]
filter(f1, l1)[40, 24]
# map()示例
map((lambda x: x * 2), l1)
>>> [2, 6, 80, 48, 30]
map(lambda x: x2, range(6))
>>> [0, 2, 4, 6, 8, 10]
[x2 for x in range(6)] # 使用列表推导对map()进行替换
>>> [0, 2, 4, 6, 8, 10]
#reduce()示例
def f5(x, y):
return x + y
reduce(f5, l1)
>>>83
闭包 Closure
如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是 closure。
定义在外部函数内的但由内部函数引用或者使用的变量被称为自由变量。
通俗理解:一个闭包就是你调用了一个函数A,这个函数A返回了一个函数B给你。这个返回的函数B就叫做闭包。你在调用函数A的时候传递的参数就是自由变量。
详解python中的闭包
def f1(x):
# 在函数内部再定义一个函数,这个函数就被认为是闭包
def f2(y):
return y ** x
# 返回闭包的结果
return f2
f1(4)
>>> <function __main__.f2>
f3 = f1(3)
type(f3)
>>> function
f3(2)
>>> 8
f3(3)
>>> 27
生成器、yield
yield语句挂起该函数并向调用者发送回一个值,但是,保留足够的状态以使得函数能够从它离开的地方继续。当继续时,函数在上一个yield返回后立即继续执行。
函数中使用yield语句会返回一个生成器对象。
def genNum(n):
i = 1
while i <= n:
yield i ** 2
i += 1
g1 = genNum(20)
for i in g1:
print i,
>>> 1 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 289 324 361 400
g2 = genNum(3)
g2.next()
>>> 1
g2.next()
>>> 4
g2.next()
>>> 9
装饰器
装饰器本身是一个函数,用于装饰其他函数;
装饰器增强装饰函数的功能;
装饰器一般接受一个函数对象作为参数,以对其进行增强;
扩展:什么时候会用到python装饰器?、闭包、装饰器、how can i make a chain of function decorators in python
def deco(func):
# 闭包的应用
def wrapper():
print 'Say something:'
func()
print 'No zuo no die'
return wrapper
@deco
def show():
print 'I am Yuan'
show()
>>>Say something:
I am Yuan
No zuo no die
#有参数的装饰器
def deco(func):
def wrapper(x):
print 'Say something:'
func(x)
print 'No zuo no die'
return wrapper
@deco
def show(x):
print x
show('Help')
>>> Say something:
Help
No zuo no die
递归
如果一个函数包括对自身的调用,该函数就是递归的。
递归需要边界条件用以退出递归。
#阶乘
def fac(n):
if n <= 1:
return 1
else:
return n * fac(n - 1)
fac(5)
>>> 120
网友评论