[Python 3.x入門] 5. Python函數編程進階


lambda表達式

lambda [arg1[,arg2,…argn]]:表達式

簡單語法:

lambda 參數1,參數2,… : 表達式

<code>def func(num1,num2):
      return num1+num2
res = func(1,2)    //函數形式求和/<code>

與上面代碼功能相同。

<code>lambdaAdd = lambda num1,num2 : num1+num2 
res = lambdaAdd(10,20)   //表達式形式/<code>

<code>lp = lambda x : print(x)    //lambda內部可以調用系統函數
lp(10)/<code>

<code>import time #導入time模塊

def showTime(t):
return time.strftime('%Y-%m-%d/%H:%M:%S',t)
tlp = lambda t : print(showTime(t))
tlp(time.localtime()) #lambda內部可以調用自定義函數/<code>

<code>lp = lambda x : [n ** 2 for n in range(x)]
l = lp(5)
print(l)                        #lambda內部可以使用推導式/<code>

<code>lp = lambda num1,num2,num3 = 10 : num1 + num2 + num3
l = lp(20,5)                //內部可使用缺省值/<code>

<code>lp = lambda *args : [ n ** 2  for n in args]
l = lp(10,5,30)
print(l)                       #可使用元組可變參數/<code>

<code>lp = lambda **kw : [item for item in kw.items()]
l = lp(**{'name':'張三','age':12,'gender':'男'})


print(l)                          #使用可變字典類型參數/<code>

高階函數

在Python中可以使用函數作為參數

<code>def  func(a,b,f):
\t\t\t\treturn f(a) + f(b)
print(func(1,2,abs))      #可以傳系統函數,有可使用自定義函數。/<code>裝飾器

更多是為了提高代碼的複用性


<code>#不適用裝飾器
def  func():
  \t\tprint('hello world')
  
def  func_zhuangsi():
        print('life is short,I use python')
        func()
        print('python 就是好')
 
if __name__ == '__main__':
        func_zhuangsi()/<code>

<code>#使用裝飾器
def  zhaungshiqi(f):              #f代表被裝飾的函數func()
print('**********')
f()
print('~~~~~~~~~~~~~')
 
@zhaungshiqi               #裝飾器的使用方法,不用調用,裝飾器直接執行
def func():
\t\t\t\tprint('這是主要的語句')/<code>


生成器(用來開闢一個連續的內存空間,用來存儲數據)

1.推導式獲取到生成器對象,使用小括號

<code>gener = ( n**2 for n in range(5))/<code>

2.使用yield方式創建生成器

<code>def gen():
\t\t\tfor n in range(5):
\t\t\t\t\t\tyield n**2
gener = gen()
for n in gener:
\t\t\tprint(n)/<code>

yield是一個類似return的關鍵字,只是在這個返回的是生成器

變量作用域全局變量。函數外部。全局可訪問全局變量要在函數內使用 要加global局部變量。函數內部。函數內訪問global 定義全局變量 global x,y,z閉包(隱藏內部函數的名稱,為了達到內部函數的安全性)就是在函數中定義函數。外函數必須返回對內函數的引用。外部函數必須使用return返回的是內函數的名稱內部函數使用return 返回數據

lambda函數求斐波拉契數列

<code>fei = lambda n : 1 if n <= 2 else fei( n-1 )+fei( n-2 )
for n in range (1,11):
\t\t\t\tprint( fei(n) )/<code>