[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的關鍵字,只是在這個返回的是生成器

    • 變量作用域
      1. 全局變量。函數外部。全局可訪問
      2. 全局變量要在函數內使用 要加global
      3. 局部變量。函數內部。函數內訪問
      4. global 定義全局變量 global x,y,z
    • 閉包(隱藏內部函數的名稱,為了達到內部函數的安全性)
      1. 就是在函數中定義函數。
      2. 外函數必須返回對內函數的引用。
      3. 外部函數必須使用return返回的是內函數的名稱
      4. 內部函數使用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>


    分享到:


    相關文章: