python 匿名函數


lambda 本身不是一個函數,而是一個關鍵字,它告訴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 語句的結果給函數綁定一個名稱。該名稱只在創建名稱的作用域內可用

lambda只能是一個簡單函數,並且不能包含其他語句,比如為變量創建一個名稱。在lambda內部,只能執行有限的操作,比如測試相等性、將兩個數相乘或者以特定的方式使用其他已經存在的函數。只能使用傳遞到lambda函數的參數。然而,可以通過使用and/or 操作。

lambda主要用在內置函數map和filter中。通過使用lambda,這些函數能夠以緊湊的方式執行一些大的操作,而不必使用循環。

2 map短路循環:

map是一個特殊的函數,它用於需要對列表中的每個元素執行一個指定的操作的情形。

>>> map_me=['a','b','c','d']

>>> result=map(lambda x:"the letter is %s"%x,map_me)
>>> print(*result)

如果向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模塊中為這種簡單的基於鍵名字符串格式化提供了一種替換形式。它提供了略微簡單一點的格式,在允許用戶指定模板時更適合。生成套用信函是使用這個方法的一個例子。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM