前言 :
在Python中,函式是一級(First-class)公民,也就是說,在Python中,函式是物件,為 function 的實例. 如果你要定義一個函式,基本上是使用 def 來定義,如同 def 陳述句 中所說明過的,例如你要定義一個最大值的函式 :
- def max(m, n):
- return m if m > n else n
- print(max(10, 3)) # 顯示 10
你可以用 lambda 運算式來定義函式,執行運算式時將會產生函式物件。 例如,上面的 max函式,可以用以下的方式定義 :
lambda的語法是 :
lambda中arg1、arg2等就相當於定義函式時的參數,之後你可以在expression中使用這些參數。注意!lambda是運算式,不是陳述句,你在 : 之後的也必須是運算式,lambda中也不能有區塊,這表示一些小的運算任務你可以使用lambda,而較複雜的邏輯你可以使用 def 來定義.
基本上,lambda 會產生 function 的實例,所以在def 陳述句 中所提到的參數定義與引數指定方式,對於lambda所產生的 function 實例都是適用的. 在Python中缺少其它語言中的switch陳述句,以下結合 字典物件 與 lambda 模擬 switch 的示範 :
- SwitchSim.py :
- score = int(input('Int: '))
- level = score // 10
- {
- 10: lambda: print('Perfect'),
- 9 : lambda: print('A'),
- 8 : lambda: print('B'),
- 7 : lambda: print('C'),
- 6 : lambda: print('D')
- }.get(level, lambda: print('E'))()
在Python中,函式是function的實例,所以你可以自由傳遞,將一個函式中所定義的函式傳回也是常見的應用. 例如 :
- LambdaTest1.py :
- def add(n1):
- def func(n2):
- return n1 + n2
- return func
- print(add(1)(2))
另一個值得注意的是,n1參數的存活期間,本應跟隨著 add() 函式呼叫完成就結束,不過因為n1被綁定在func()函式之中,形成了一個閉包(Closure). 所謂的閉包(Closure),是指一個函式物件(或 函式值)在建立時,綁定了當時作用範圍(Scope)下有效的自由變數(Free variable)。所 以支援閉包的語言,必須有支援一級函式(First-class function),建立函式物件並不等於建立閉包,建立函式物件時同時綁定了某個(些)自由變數,該函式物件才稱之為閉包.
在Python中,確實支援閉包的概念. 例如 :
在上例中,inner() 確實綁定了區域變數x,在 outer() 內部呼叫 inner() 時顯示的是10,而後改變了x為20,由於 inner() 綁定了x,所以傳回的函式執行時,顯示x的值為20. 不過實際上在應用時,還是得小心一點. 例如 :
在上例中,func() 中的 setX() 宣告的x,其實是 setX() 中的區域變數x,其覆蓋了外部 func() 的x,所以你的n是指定給區域變數x !
回到鞣製的討論,實際上其應用,在於先針對既有的資料先行作運算並傳回未運算的函式,待後續資料備妥後再完成整個所需的運算結果。一個例子像是 因 式分解,可以先準備好一定長度的質數表,之後利用該質數表來進行因式分解. 例如 :
- GCDPNumber.py :
- import math
- def prepare_factor(max):
- prime = [1] * max
- for i in range(2, int(math.sqrt(max))):
- if prime[i] == 1:
- for j in range(2*i, max):
- if j % i == 0:
- prime[j] = 0
- primes = [i for i in range(2, max) if prime[i] == 1] # 質數表
- def factor(num):
- list = []
- i = 0
- while primes[i] ** 2 <= num:
- if num % primes[i] == 0:
- list.append(primes[i])
- num //= primes[i]
- else:
- i += 1
- list.append(num)
- f = [0] * len(list)
- for i in range(len(f)):
- f[i] = list[i]
- return f
- return factor
- factor = prepare_factor(1000)
- print(factor(100))
- print(factor(200))
- print(factor(977))
沒有留言:
張貼留言