lambda 自己不是一個函數,而是一個關鍵字,它告訴python建立一個函數並在適當的位置使用它,而不是經過一個名稱引用它。python
>>> filter_me=[1,2,3,4,5,6,7,8,11]
>>> func=lambda x:x%2==0
>>> result=filter(func,filter_me)
>>> print(result)
<filter object at 0x0000021D6FB26908>
>>> print(*result)
2 4 6 8函數
>>> result=filter(lambda x:x%2==0,filter_me)
>>> print(*result)測試
因爲缺乏名稱,lambda建立的函數被稱爲匿名函數,可使用lambda 語句的結果給函數綁定一個名稱。該名稱只在建立名稱的做用域內可用ui
lambda只能是一個簡單函數,而且不能包含其餘語句,好比爲變量建立一個名稱。在lambda內部,只能執行有限的操做,好比測試相等性、將兩個數相乘或者以特定的方式使用其餘已經存在的函數。只能使用傳遞到lambda函數的參數。然而,能夠經過使用and/or 操做。對象
lambda主要用在內置函數map和filter中。經過使用lambda,這些函數可以以緊湊的方式執行一些大的操做,而沒必要使用循環。接口
2 map短路循環:作用域
map是一個特殊的函數,它用於須要對列表中的每一個元素執行一個指定的操做的情形。字符串
>>> map_me=['a','b','c','d']get
>>> result=map(lambda x:"the letter is %s"%x,map_me)
>>> print(*result)string
若是向map中傳遞一個列表 或者元組 的列表,則它期待獲得列表。主列表中的每一個序列應該有相同數目的元素。
>>> # use map with a list of lists,to re-order the output
>>> map_me_again=[[1,2,3],[4,5,6]]
>>> result=map(lambda list:[list[1],list[0],list[2]],map_me_again)
>>> print(*result)
[2, 1, 3] [5, 4, 6]
map老是返回一個迭代器。能夠傳遞給map一個非匿名函數的名稱,它仍然以相同的方式運行。
3 列表解析
>>> everything=[1,2,3,4,5,6,7,8,12]
>>> print([x for x in everything if x%2==0])
[2, 4, 6, 8, 12]
這是將列表的一部分放入循環中的一種簡潔實用的方式。列表中只有相關的部分,也就是在程序中但願獲得的部分纔會被加入到循環中。
列表解析能夠包括循環和條件語句,可以提供更強大的作出決策的能力。而lambda只容許執行一個簡單表達式。
在大多數狀況中,列表解析將比其餘方式運行得更快。
4 爲循環生成迭代器
python有一個可以建立迭代器的特殊特性,即range函數:
>>> f=range(10,20)
>>> print(*f)
10 11 12 13 14 15 16 17 18 19
若是隻給range傳遞一個數值,那麼它將從0數到該數值。這個數值既能夠是正數,也能夠是負數
若是隻但願每隔一個數值或者每隔兩個數值打印數值,可使用一個可選的第三個參數step
>>> f=range(-1)
>>> print(*f)
>>> for number in range(5,55,4):
print("number from 5 to 55 by fours:%d"%number)
range返回一個行爲與列表相似的迭代器對象。注意這個對象沒有公共接口。而僅有私有方法。dir(range(0,10)
能夠經過同列表、序列以及字典相同的解除引用操做符(方括號)來訪問它,當使用方括號訪問時,是在告訴python要調用列表、元組或字典的__getitem__方法,range對象具備這個私有方法
>>> f=range(2)
>>> f[0]
0
5 使用字典的特殊字符串替換
使用字典進行字符串替換
>>> person={"name":"James","camera":"nikon","handedness":"lefty","baseball_team":"angels","instrument":"guitar"}
>>> print("%(name)s,%(camera)s,%(baseball_team)s"%person)
James,nikon,angels
圓括號中的信息是鍵名,它的值將從字典中獲得並替換爲字符串。圓括號後面指定插入的數據類型,s 字符串,i 整數、j虛數、L長整數
>>> import string
>>> person={"name":"James","camera":"nikon","handedness":"lefty","baseball_team":"angels","instrument":"guitar"}
>>> person["height"]=1.6
>>> person["weight"]=80
>>> t=string.Template("$name is $height m high and $weight kilos")
>>> print(t.substitute(person))
James is 1.6 m high and 80 kilos
lambda容許編寫一個簡單的函數而沒必要在其餘地方聲明它。編寫和運行這些函數不須要綁定一個名稱,所以它們稱爲匿名函數。map在列表上操做,當用於一個簡單列表時,將針對列表從頭至尾的每一個元素運行一個函數。當提供給map多個列表,或者列表中包含列表時,它具備更復雜的行爲。
列表解析是指在解除對序列的引用的方括號中運行有限量代碼的能力,只有知足中括號中標準的那些元素被返回。經過列表解析能夠簡單快速的訪問一個序列的指定成員
range操做可以提供起始於任意數值而且終止於任意數值的數值列表,因此能夠用來生成一個一般用於for循環的迭代器。
除了簡單的字符串替換之外,還能夠提供一個具備格式說明符的字符串,這些格式說明符經過使用一種特殊的語法引用字典中的鍵名。這個形式容許繼續使用格式說明符選項
string.Template模塊中爲這種簡單的基於鍵名字符串格式化提供了一種替換形式。它提供了略微簡單一點的格式,在容許用戶指定模板時更適合。生成套用信函是使用這個方法的一個例子。