您絕對可以簡化not_double_cap_word
函數,但它仍然是一個基本的解決方案。您可以使用ch.isupper()
而不是str.isupper(ch)
。以正常方式調用方法總比將其作爲未綁定方法調用並顯式傳遞self
容易。
接下來,我們可以在一臺發電機表達sum
更換明確for循環:
cap_count = sum(ch.isupper() for ch in word)
而且我們並不真正需要定義not_double_cap
,cap_count < 2
似乎很簡單,直接返回。所以:
def not_double_cap_word(word):
cap_count = sum(ch.isupper() for ch in word)
return cap_count < 2
但真的,這整個事情可能很簡單,直接內聯到主表達式。雖然你可能通過使用lambda
定義一個函數來做到這一點,但沒有理由。一般來說,map
和filter
是很好的,當你想要做的每件事都是調用一個你已經躺在身邊的函數;當你想要做的是一個表達式,你必須包含在一個函數(lambda
或其他)中以傳遞給map
或filter
。比較:。
words_no_double_caps = [word for word in words_alnum
if sum(ch.isupper() for ch in word) < 2]
words_no_double_caps = list(filter((lambda word: sum(map(
lambda ch: ch.upper(), word)) < 2), words_alnum))
(我想我已經找到了第二個版本右邊的括號。如果不......嗯,如果我想用Lisp編程,我會:)
無論哪種方式,它的表演相當與原始代碼完全相同的步驟,但它更簡潔。它更可讀嗎?這是給你決定的。但這是選擇一個或另一個的最重要原因,或者是兩者之間的中間事物。
那麼,以及是否需要重用這個邏輯;如果你這樣做,它應該肯定被定義爲def
語句並給出一個不錯的名字。
我不跟着你的輸出「一個兩個」如何成爲「一個,兩個」。 – 2014-10-16 18:34:06
你是什麼意思「使用lambdas」? 'lambda'只是一種不同的寫'def'給你的函數的方法,它不允許你使用語句或給函數一個名字,但是允許你在函數的中間表達。你爲什麼想要這樣? – abarnert 2014-10-16 18:35:28