在以下Python腳本中,「aDict」是一個字典,「_:_ [0]」在lambda函數中做什麼?這是在Python lambda函數中做了什麼?
sorted(aDict.items(), key=lambda _: _[0])
在以下Python腳本中,「aDict」是一個字典,「_:_ [0]」在lambda函數中做什麼?這是在Python lambda函數中做了什麼?
sorted(aDict.items(), key=lambda _: _[0])
讓我們挑選一下。
1)假設你有一個字典,二:
di={'one': 1, 'two': 2, 'three': 3}
2)現在假設你想它的每一個鍵,值對:
>>> di.items()
[('three', 3), ('two', 2), ('one', 1)]
3)現在,你想對它們進行排序(因爲類型的字典是無序的):
>>> sorted(di.items())
[('one', 1), ('three', 3), ('two', 2)]
注意,元組字典順序排序 - 通過在第一文本元組的元素。這相當於一系列元組的t[0]
。
假設您希望它按數字排序。你會使用一個key
功能:
>>> sorted(di.items(), key=lambda t: t[1])
[('one', 1), ('two', 2), ('three', 3)]
你有sorted(aDict.items(), key=lambda _: _[0])
的聲明就使用_
作爲變量名。它也什麼也不做,因爲aDict.items()
產生元組,並且如果你沒有使用一個鍵,它就會按照元組的第一個元素排序。你的例子中的關鍵功能是完全無用的。
可能有一個表單的用例(元組除外)要考慮。如果你有字串,那麼你會被第一個字符排序和忽略其它:
>>> li=['car','auto','aardvark', 'arizona']
>>> sorted(li, key=lambda c:c[0])
['auto', 'aardvark', 'arizona', 'car']
Vs的:
>>> sorted(li)
['aardvark', 'arizona', 'auto', 'car']
我仍然不會在lambda使用_
但是。 _
的使用是針對一個有副作用機率很小的throway變量。 Python的命名空間大多令人擔心並不是真正的擔心。
考慮:
>>> c=22
>>> sorted(li, key=lambda c:c[0])
['auto', 'aardvark', 'arizona', 'car']
>>> c
22
的c
值,因爲lambda
內局部命名空間的保留。
然而(下的Python 2.x的但不是Python的3.x的)這可能是一個問題:
>>> c=22
>>> [c for c in '123']
['1', '2', '3']
>>> c
'3'
所以(光)慣例使用_
用於可變無論是在的情況下,成爲列表理解或元組擴展等,您不必擔心踐踏您的某個名字。該消息是:如果它被命名爲_
,我並不關心它,只是在這裏...
在Python中,lambda用於創建一個匿名函數。你的例子中的第一個下劃線只是lambda函數的參數。在冒號(即功能簽名)之後,_[0]
檢索變量_
的第一個元素。
無可否認,這可能會令人困惑;您示例中的lambda組件可以重寫爲lambda x: x[0]
,結果相同。但是,通常情況下,Python中的下劃線變量名用於「一次性變量」。在這種情況下,這意味着我們在每個字典項目中唯一關心的事情就是關鍵。細微差別,也許。
注意:_也被用作'gettext'或類似函數的別名來檢索用於國際化的消息。但那又是一個故事。但是,下劃線會影響另一個,因此最好使用「真實」變量名稱。 –
在Python中_
(下劃線)是一個有效的標識符,可用作變量名稱,例如,
>>> _ = 10
>>> print(_)
10
它因此也可以使用作爲參數傳遞給lambda表達式的名稱 - 它就像一個未命名的函數。
在你的例子中sorted()
將aDict.items()
生成的元組傳遞給它的key
函數。鍵函數返回該元組的第一個元素,然後sorted()
用作鍵,即該值與其他值進行比較以確定順序。
注意,在這種情況下,可以不用鑰匙的功能,因爲元組是按照第一個元素,則第二元件等,所以
sorted(aDict.items())
會產生自然排序產生相同的結果相同的結果。由於字典不能包含重複鍵,每個元組的第一個元素是唯一的,所以第二個元素在排序時從不考慮。
'_'只是一個變量。它根據字典的第一項對它們進行排序。 – Li357
小擴展,'_'可能是'my_var'或'foo'或'woo'。就像@AndrewL。說,它只是一個變量名稱。 – idjaw
這個關鍵字也完成了對那個特定代碼的字面解釋。 – TigerhawkT3