1. 程式人生 > >python--004--函數(匿名函數、高階函數)

python--004--函數(匿名函數、高階函數)

對象 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--函數(匿名函數、高階函數)