python--004--函數(匿名函數、高階函數)
阿新 • • 發佈:2019-03-24
對象 fun 可能 尾遞歸 條件 面向過程 語言 erlang 函數名
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
python--004--函數(匿名函數、高階函數)