文章目录
函数式编程概述
- 函数式编程: 函数式=编程语言定义的函数+数学意义的函数
优点:
- 便于进行单元测试
- 便于调试
- 适合并行执行
特性
- 不可变数据(不可变:不用变量保存状态,不修改变量)
非函数式:
a=1
def incr_test1():
global a
a+=1
return a
print(incr_test1())
运行结果
2
函数式:
n=1
def incr_test2(n):
return n+1
print(incr_test2(2))
运行结果
3
- 第一类对象(函数即"变量")---------看下面高阶函数的条件
- 尾调用优化(尾递归) 尾调用:在函数最后一步调用另外一个函数(最后一行不一定是函数的最后一步)
函数bar3
在foo3
内为尾调用
def bar3(n):
return n
def foo3():
return bar3(3)
函数bar4
和bar5
在foo4
内均为尾调用,二者在if判断条件不同的情况下都有可能作为函数的最后一步
def bar4(n):
return n
def bar5(n):
return n+1
def foo4(x):
if type(x) is str:
return bar4(x)
elif type(x) is int:
return bar5(x)
函数bar6
在foo5
内为非尾调用
def bar6(n):
return n
def foo5(x):
y=bar6(x)
return y
函数bar7
在foo6
内非尾调用
def bar7(n):
return n
def foo6(x):
return bar7(x)+1
高阶函数
下面两个条件满足其中一个即可:
- 函数可以接收另一个函数作为参数
def add(x,y,f):
return f(x)+f(y)
print(add(-5,6,abs)) #f=abs abs()求绝对值
运行结果
11
- 返回值可以是函数名
def bar1():
print('from bar1')
def foo1():
print('from foo')
return bar1
m=foo1() #n=bar1
m()
运行结果
from foo
from bar1
def hanle():
print('from hanle')
return hanle
h=hanle()
h()
运行结果
from hanle
from hanle
这个就不是高阶函数
def foo(n):
print(n)
def bar(name):
print('i am name is %s'%name)
foo(bar('alex')) #bar函数没有返回值,返回值不是函数名
运行结果
i am name is alex
None
匿名函数
lambda 参数列表:函数返回值表达式语句
- 关键字
lambda
表示匿名函数 - 冒号前表示参数,冒号后表示返回值
def func(x):
return x+1
res=func(10)
print(res)
#相当于
res=lambda x:x+1
print(res(10)) #记得带参数
运行结果
11
11
res=lambda x:x+'_ab'
print(res('alex'))
运行结果
alex_ab
lambda
表达式序列
- 可以将
lambda
表达式作为序列(如列表、元组或字典等)元素,从而实现挑战表的功能,也就是函数的列表
序列=[(lambda 表达式1),(lambda 表达式2), …]
调用序列中lambda表达式的方法
序列[索引](lambda 表达式的参数列表)
定义一个lambda
表达式序列,第一个元素用于计算参数的平方,第二个元素用于计算参数的立方,第三个元素用于计算参数的四次方
arr=[(lambda x:x**2),(lambda x:x**3),(lambda x:x**4)]
print(arr[0](2),arr[1](2),arr[2](2))
运行结果
4 8 16
将lambda
表达式作为函数的返回值
def math(o):
if(o==1):
return lambda x,y:x+y
if(o==2):
return lambda x,y:x-y
if(o==3):
return lambda x,y:x*y
if(o==4):
return lambda x,y:x/y
action=math(1) #返回加法lambda表达式
print('10+2=',action(10,2))
action=math(2) #返回减法lambda表达式
print('10-2=',action(10,2))
action=math(3) #返回乘法lambda表达式
print('10*2=',action(10,2))
action=math(4) #返回除法lambda表达式
print('10/2=',action