函數:
在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的作用就是,把一個函數的某些參數給固定住(也就是設置默認值),返回一個新的函數,調用這個新函數會更簡單