我試圖寫的Python代碼一行以下:Python的條件語句與for循環
is_valid = False
for single_object in object_list:
if single_object.test == test:
is_valid = True
if not is_valid:
return 'Bad data!'
我知道,必須有更少的代碼來完成這種方式。我的意思是,它是Python!
我試圖寫的Python代碼一行以下:Python的條件語句與for循環
is_valid = False
for single_object in object_list:
if single_object.test == test:
is_valid = True
if not is_valid:
return 'Bad data!'
我知道,必須有更少的代碼來完成這種方式。我的意思是,它是Python!
is_valid = any(o.test == test for o in object_list)
的any(iterable)
函數返回True
如果任何iterable
值都True
和False
如果他們都不是。我使用「生成器表達式」來檢查object_list
中的值並評估條件。
較少的代碼通常不是更好的代碼。
for single_object in object_list:
if single_object.test == test:
break
else:
return 'Bad data!'
雖然這不是一個代碼行,這是少,更乾淨的代碼,並且可以說是更容易比any
閱讀。速度也基本相同。
循環中的else
子句只有在循環未由break
語句退出時纔會執行。
我認爲這就像Pythonic一樣的解決方案。
我絕對同意你的陳述「少代碼通常不是更好的代碼」。有時候,在Python中很容易陷入太多困境。我從來沒有意識到'else'子句將會被一個'break'調用。這非常棒! –
謝謝。只需使用反引號''''在註釋中標記代碼。 – agf
@Jeremy Banks的解決方案似乎對我來說是完美的。不過,我想提出另一個。不是爲了更好(不是),而是要顯示非布爾問題的替代方案,或者是否要獲得列表中非常精確的對象(可能爲了修改或刪除它)而非常重要。
valid_one = next((o.test for o in object_list if o.test == test), None)
if valid_one is None:
# not valid
else:
object_list.remove(valid_one)
# or
valid_one.special_atr = 42
謝謝! any()函數似乎正是我正在尋找的! –