內置函數,匿名函數 python中map()函數 python匿名函數(lambda) python中reduce()函數 python中filter()函數

python中map()函數

 

map()是 Python 內置的高階函數,它接收一個函數 f 和一個 list,並經過把函數 f 依次做用在 list 的每一個元素上,獲得一個新的 list 並返回。html

例如,對於list [1, 2, 3, 4, 5, 6, 7, 8, 9]python

若是但願把list的每一個元素都做平方,就能夠用map()函數:編程

所以,咱們只須要傳入函數f(x)=x*x,就能夠利用map()函數完成這個計算:函數

def f(x):
    return x*x
print map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])

輸出結果:post

[1, 4, 9, 10, 25, 36, 49, 64, 81]

注意:map()函數不改變原有的 list,而是返回一個新的 list。ui

利用map()函數,能夠把一個 list 轉換爲另外一個 list,只須要傳入轉換函數。url

因爲list包含的元素能夠是任何類型,所以,map() 不單單能夠處理只包含數值的 list,事實上它能夠處理包含任意類型的 list,只要傳入的函數f能夠處理這種數據類型。code

示例:htm

假設用戶輸入的英文名字不規範,沒有按照首字母大寫,後續字母小寫的規則,請利用map()函數,把一個list(包含若干不規範的英文名字)變成一個包含規範英文名字的list:對象

輸入:['adam', 'LISA', 'barT']
輸出:['Adam', 'Lisa', 'Bart']

 
 

python匿名函數(lambda)

 

  簡單來講,編程中提到的 lambda 表達式,一般是在須要一個函數,可是又不想費神去命名一個函數的場合下使用,也就是指匿名函數

當咱們在傳入函數時,有些時候,不須要顯式地定義函數,直接傳入匿名函數更方便。

在Python中,對匿名函數提供了有限支持。仍是以map()函數爲例,計算f(x)=x2時,除了定義一個f(x)的函數外,還能夠直接傳入匿名函數:

>>> list(map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
[1, 4, 9, 16, 25, 36, 49, 64, 81]

經過對比能夠看出,匿名函數lambda x: x * x實際上就是:

def f(x):
    return x * x

關鍵字lambda表示匿名函數,冒號前面的x表示函數參數。

匿名函數有個限制,就是隻能有一個表達式,不用寫return,返回值就是該表達式的結果。

用匿名函數有個好處,由於函數沒有名字,沒必要擔憂函數名衝突。此外,匿名函數也是一個函數對象,也能夠把匿名函數賦值給一個變量,再利用變量來調用該函數:

>>> f = lambda x: x * x
>>> f
<function <lambda> at 0x101c6ef28>
>>> f(5)
25

一樣,也能夠把匿名函數做爲返回值返回,好比:

def build(x, y):
    return lambda: x * x + y * y
和其餘不少語言相比,Python 的 lambda 限制較多,最嚴重的當屬它只能由一條表達式組成。這個限制主要是爲了防止濫用,由於當人們發覺 lambda 很方便,就比較容易濫用,但是用多了會讓程序看起來不那麼清晰,畢竟每一個人對於抽象層級的理解程度都有所不一樣。
 
 
 

python中reduce()函數

 

  reduce()函數也是Python內置的一個高階函數。reduce()函數接收的參數和 map()相似,一個函數 f,一個list,但行爲和 map()不一樣,reduce()傳入的函數 f 必須接收兩個參數,reduce()對list的每一個元素反覆調用函數f,並返回最終結果值。

例如,編寫一個f函數,接收x和y,返回x和y的和:

def f(x, y):
    return x + y

調用 reduce(f, [1, 3, 5, 7, 9])時,reduce函數將作以下計算:

先計算頭兩個元素:f(1, 3),結果爲4;
再把結果和第3個元素計算:f(4, 5),結果爲9;
再把結果和第4個元素計算:f(9, 7),結果爲16;
再把結果和第5個元素計算:f(16, 9),結果爲25;
因爲沒有更多的元素了,計算結束,返回結果25。

上述計算其實是對 list 的全部元素求和。雖然Python內置了求和函數sum(),可是,利用reduce()求和也很簡單。

reduce()還能夠接收第3個可選參數,做爲計算的初始值。若是把初始值設爲100,計算:

reduce(f, [1, 3, 5, 7, 9], 100)

結果將變爲125,由於第一輪計算是:

計算初始值和第一個元素:f(100, 1),結果爲101。

練習:

Python內置了求和函數sum(),但沒有求積的函數,請利用reduce()來求積:

輸入:[2, 4, 5, 7, 12]
輸出:2*4*5*7*12的結果

方法:

def prod(x, y):
    return x*y
print reduce(prod, [2, 4, 5, 7, 12])

結果:

>>>3360
 
 
 
 
 
 

python中filter()函數

 

filter()函數是 Python 內置的另外一個有用的高階函數,filter()函數接收一個函數 f 和一個list,這個函數 f 的做用是對每一個元素進行判斷,返回 True或 False,filter()根據判斷結果自動過濾掉不符合條件的元素,返回由符合條件元素組成的新list。

例如,要從一個list [1, 4, 6, 7, 9, 12, 17]中刪除偶數,保留奇數,首先,要編寫一個判斷奇數的函數:

def is_odd(x):
    return x % 2 == 1

而後,利用filter()過濾掉偶數:

>>>filter(is_odd, [1, 4, 6, 7, 9, 12, 17])

結果:

[1, 7, 9, 17]

利用filter(),能夠完成不少有用的功能,例如,刪除 None 或者空字符串:

def is_not_empty(s):
    return s and len(s.strip()) > 0
>>>filter(is_not_empty, ['test', None, '', 'str', '  ', 'END'])

結果:

['test', 'str', 'END']

注意: s.strip(rm) 刪除 s 字符串中開頭、結尾處的 rm 序列的字符。

當rm爲空時,默認刪除空白符(包括'\n', '\r', '\t', ' '),以下:

>>> a = ' 123'
>>> a.strip()
'123'

>>> a = '\t\t123\r\n'
>>> a.strip()
'123'

練習:

請利用filter()過濾出1~100中平方根是整數的數,即結果應該是:

[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

方法:

import math
def is_sqr(x):
    return math.sqrt(x) % 1 == 0
print filter(is_sqr, range(1, 101))

結果:

[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
相關文章
相關標籤/搜索