一、函數式編程
- 函數本身可以賦值給變量,賦值后變量為函數;
- 允許將函數本身作為參數傳入另一個函數;
- 允許返回一個函數。
1、map()是 Python 內置的高階函數,它接收一個函數 f 和一個 list,並通過把函數 f 依次作用在 list 的每個元素上,得到一個新的 list 並返回
def add(x): return x+x print map(add,[1,2,3])
2、reduce()函數也是Python內置的一個高階函數。reduce()函數接收的參數和 map()類似,一個函數 f,一個list,但行為和 map()不同,reduce()傳入的函數 f 必須接收兩個參數,reduce()對list的每個元素反復調用函數f,並返回最終結果值。
1 def prod(x, y): 2 return x*y 3 4 print reduce(prod, [2, 4, 5, 7, 12])
reduce()還可以接收第3個可選參數,作為計算的初始值。如果把初始值設為100,計算:
reduce(f, [1, 3, 5, 7, 9], 100)
結果將變為125,因為第一輪計算是:
計算初始值和第一個元素:f(100, 1),結果為101。
3、filter()函數是 Python 內置的另一個有用的高階函數,filter()函數接收一個函數 f 和一個list,這個函數 f 的作用是對每個元素進行判斷,返回 True或 False,filter()根據判斷結果自動過濾掉不符合條件的元素,返回由符合條件元素組成的新list。
import math def is_sqr(x): return math.sqrt(x)==int(math.sqrt(x)) print filter(is_sqr, range(1, 101))
4、 sorted()也是一個高階函數,它可以接收一個比較函數來實現自定義排序,比較函數的定義是,傳入兩個待比較的元素 x, y,如果 x 應該排在 y 的前面,返回 -1,如果 x 應該排在 y 的后面,返回 1。如果 x 和 y 相等,返回 0。
def reversed_cmp(x, y): if x > y: return -1 if x < y: return 1 return 0 sorted([36, 5, 12, 9, 21], reversed_cmp)
sorted()也可以對字符串進行排序,字符串默認按照ASCII大小來比較。
def cmp_ignore_case(s1, s2): s1=s1.lower() s2=s2.lower() if s1>s2: return 1 if s1<s2: return -1 return 0 print sorted(['bob', 'about', 'Zoo', 'Credit'], cmp_ignore_case)
5、Python的函數不但可以返回int、str、list、dict等數據類型,還可以返回函數!
請注意區分返回函數和返回值:
def myabs():
return abs # 返回函數,返回函數可以把一些計算延遲。
def myabs2(x):
return abs(x) # 返回函數調用的結果,返回值是一個數值
def calc_prod(lst): def lazy_prod(): prod=1 for i in lst: prod=prod*i return prod return lazy_prod f = calc_prod([1, 2, 3, 4]) print f()
