python--004--函数(匿名函数、高阶函数)
1. 匿名函数:
print(lambda x:x+1)
func = lambda x:x+1
print(func(10))
name = "wendy"
func=lambda x:x+'_max'
res=func(name)
print('匿名函数运行的结果',res)
lambda 一般不把它赋值给变量,lambda x:x+'_max',一般直接和其他函数一起用,上面用法只是举例解释,匿名函数单独是如何用和运行的
lambda返回多个值:
# lambda 返回多个值
f = lambda x,y,z:(x+1,y+1,z+1)
print(f(1,2,3)
2. 编程的方法论:
面向对象
面向过程:将一个大的问题分解成小的问题
函数式编程:函数式=编程语言定义的函数+数学意义的函数
结合数学模型 y = 2*x+1
def cal(x):
return 2*x+1
函数式编程可读性差,python不是严格意义上的函数式编程语言
hashell、clean erlang 纯函数式编程的语言
1.1 函数式编程尾递归调用优化
特征: 1.不可变数据 2.第一类对象 3.尾调用优化(尾递归)
eg1:不可变:不用变量保存状态,不修改变量
#非函数式 ,函数体中可能存在global等,或是赋值的操作
a = 1
def incr_test1():
global a
a +=1
return a
incr_test1()
print(a)
# 函数式
n = 1
def incr_test2(n):
return n+1
print(incr_test2(2))
print(n)
eg2: 第一类对象:函数即“变量”
1.函数名可以当作参数传递
2.返回值可以是函数名
高阶函数,满足下列两个条件之一,就是高阶函数
1)把函数当作参数传给另一个函数
2)返回值中包含函数
#1)把函数当作参数传给另一个函数
def foo(n):
print(n)
def bar(name):
print('my name is %s'%name)
foo(bar)
foo(bar('wendy'))
-------
#2)返回值中包含函数
def bar():
print('from bar')
def foo():
print('from foo')
return bar
n = foo()
n()
def test1():
print('from test1')
def test2():
print('from test2')
return test1() # 这相当于将test1的返回值拿来return
eg3: 尾调用:在函数的最后一步调用另一个函数(最后一行不一定是函数的最后一步)
调用后,该函数已经执行完,不需要等待执行结果,优化递归中要等待结果导致栈溢出
# 函数bar在foo内为尾调用
def bar(n):
return n
def foo(x):
return bar(x)
# 函数bar在foo内为非尾调用
def bar(n):
return n
def foo(x):
return bar(x)+1
# 函数bar在foo内为非尾调用
def bar(n):
return n
def foo(x):
y = bar(x)
return y