PYTHON-函數特性

函數:

在Python中,定義一個函數要使用 def 語句,依次寫出函數名、括號、括號中的參數和冒號:,然後,在縮進塊中編寫函數體,函數的返回值用 return 語句返回。

  • 遞歸函數,自身調用自身就是遞歸函數

定義默認參數
定義函數的時候,還可以有默認參數。
由於函數的參數按從左到右的順序匹配,所以默認參數只能定義在必需參數的後面:
默認參數必須指向不可變對象
如:

# OK:
def fn1(a, b=1, c=2):
    pass
# Error:
def fn2(a=1, b):
    pass

1. 高級特性:

  • 切片:
    list: L[A:B:C]
    A,表起始。B表結尾。C表隔幾個去一次,不填則爲默認參數
    tuple: 也可以切片,但是取出後仍是tuple類型

  • 迭代:
    普通迭代:for … in .. :
    沒有索引的,只要是可以迭代的對象(字符串也可以迭代),都可以。

例如:dict默認迭代的是key值。
for value in d.itervalues()   # 迭代
for k, v in d.iteritems()
  • 判斷對象是否可以迭代:
通過collections模塊的Iterable類型判斷:
from collections import Iterable
isinstance('abc', Iterable) # str是否可迭代
  • 如果一個對象說自己可迭代,那我們就直接用 for 循環去迭代它,可見,迭代是一種抽象的數據操作,它不對迭代對象內部的數據有任何要求。
    for 循環可作用的迭代對象遠不止 list,tuple,str,unicode,dict等
    for x, y in [(1, 1), (2, 4), (3, 9)]: #for裏同時可以引用兩個變量

  • Python內置的enumerate函數可以把一個list變成索引-元素對,這樣就可以在for循環中同時迭代索引和元素本身:

 for i, value in enumerate(['A', 'B', 'C']):
 enumerate()把list返回一個包含索引-value值得形式。
  • 列表生成式L:
體會快速生成列表的方法
 [x * x for x in range(1, 11) if x % 2 == 0]
 [m + n for m in 'ABC' for n in 'XYZ']
 [x * x for x in range(1, 11)]
  • 生成器G:
    列表元素按照某種算法推算出來,一邊循環一邊計算推算出後來的元素,可以節約大量空間

    創建L和g的區別僅在於最外層的[]和(),L是一個list,而g是一個generator。
    generator是可迭代對象,直接用for可以遍歷

    另外一種定義的方法:如果一個函數定義中包含yield關鍵字,那麼這個函數就不再是一個普通函數,而是一個generator

 def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield b
        a, b = b, a + b
        n = n + 1

跟函數不同的一點:變成generator的函數,在每次調用next()的時候執行,遇到yield語句返回,再次執行時從上次返回的yield語句處繼續執行

2.函數式編程

函數式編程的一個特點就是,允許把函數本身作爲參數傳入另一個函數,還允許返回一個函數!

  • 高階函數:
    函數本身也可以賦值給變量,即:變量可以指向函數一個函數就可以接收另一個函數作爲參數,這種函數就稱之爲高階函數

  • map/reduce
    map()函數接收兩個參數,先是函數,後是序列,map將傳入的函數依次作用到序列的每個元素,並把結果作爲新的list返回

  • reduce把一個函數作用在一個序列[x1, x2, x3…]上,這個函數必須接收兩個參數,reduce把結果繼續和序列的下一個元素做累積計算

  • filter()
    filter()也接收一個函數和一個序列。和map()不同的時,filter()把傳入的函數依次作用於每個元素,然後根據返回值是True還是False決定保留還是丟棄該元素

  • sorted()
    接受兩個參數,第一個是序列,默認參數從大到小,第二個參數是比較函數參數
    sorted([‘bob’, ‘about’, ‘Zoo’, ‘Credit’], cmp_ignore_case)

  • 返回函數
    高階函數除了可以接受函數作爲參數外,還可以把函數作爲結果值返回。
    返回閉包時牢記的一點就是:返回函數不要引用任何循環變量,或者後續會發生變化的變量

  • 匿名函數
    不需要顯式地定義函數,直接傳入匿名函數更方便 關鍵字lambda表示匿名函數,冒號前面的x表示函數參數。

map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9])

lambda x: x * x  就是
def f(x):
    return x * x
  • 裝飾器
    在面向對象(OOP)的設計模式中,decorator被稱爲裝飾模式。OOP的裝飾模式需要通過繼承和組合來實現,而Python除了能支持OOP的decorator外,直接從語法層次支持decorator。Python的decorator可以用函數實現,也可以用類實現。
    decorator可以增強函數的功能,定義起來雖然有點複雜,但使用起來非常靈活和方便。

  • 偏函數
    簡單總結functools.partial的作用就是,把一個函數的某些參數給固定住(也就是設置默認值),返回一個新的函數,調用這個新函數會更簡單

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章