簡體   English   中英

Google Python風格指南

[英]Google Python style guide

為什么Google Python樣式指南更喜歡列表推導和for循環而不是filter,map和reduce?

不推薦使用的語言功能:...“使用列表推導和循環而不是過濾,映射和減少。”

給出的解釋是:“我們不使用任何不支持這些功能的Python版本,因此沒有理由不使用新的樣式。”

mapfilter的功能不如它們的list comprehension等效。 LC可以一步完成過濾和映射,它們不需要顯式功能,並且由於其特殊的語法可以更有效地編譯

# map and filter
map(lambda x:x+1, filter(lambda x:x%3, range(10)))
# same as LC
[x+1 for x in range(10) if x%3]

沒有理由更喜歡地圖或過濾LC。

reduce略有不同,因為沒有等效的LC,但它也沒有比普通的for-loop更大的優勢。

谷歌Python風格指南沒有說

更喜歡列表推導和循環而不是過濾,映射和減少

相反,完整的句子讀,

當函數參數無論如何都是內聯的lambda時,使用列表推導和for循環而不是filter和map。 (我的重點)

因此,不建議您完全避免使用map ,例如 - 僅限於此

[expression(item) for item in iterable] 

比較好

map(lambda item: expression(item), iterable)

在這種情況下,清楚的是列表理解更直接和可讀。

另一方面,使用這樣的map沒有錯:

map(str, range(100))

而不是啰嗦

[str(item) for item in range(100)]

它很好地啟動:

In [211]: %timeit list(map(str,range(100)))
7.81 µs ± 151 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

In [215]: %timeit [str(item) for item in range(100)]
10.3 µs ± 3.06 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

列表推導通常被認為比filtermapreduce更“pythonic”。

另請參閱Python創建者Guido van Rossum 撰寫的這篇文章

至於在樣式指南中的“棄用語言功能”下提交此內容,顯然有計划在Python 3中棄用filtermapreduce (參見上面引用的文章 )。

其中一些計划最終改變了。 reduce了從一個內置功能下降(並移動到functools模塊),但filtermap仍然可用的內置插件。

我認為這是因為不是每個人都知道如何很好地使用這些功能; 對於不那么熟悉的人,可讀性可能會受損。 此外, for循環和列表理解被廣泛使用並且易於理解; 即使后者來自函數式編程,就像mapfilterreduce ,它可以很好地鏡像列表和for循環。 在任何情況下,填充lambda或定義一個僅用於map,filter或reduce的函數都會變得煩人,特別是因為lambda只能是單個表達式而函數可能會混亂你的代碼。 反正你不需要它們; map(func, seq)只是[func(x) for x in seq] map(func, seq) [func(x) for x in seq]filter只是一個if組件的列表理解。 可以使用for循環完成reduce

簡而言之, for和list comprehensions更清晰,並且在大多數情況下它們提供基本相同的功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM