1 回答

TA貢獻(xiàn)1780條經(jīng)驗(yàn) 獲得超1個(gè)贊
在一般代碼中,您可能想要使用任意可迭代對(duì)象,而不僅僅是list,在這種情況下,只有第一種形式完全有效(您無(wú)法索引非序列)。您可能還需要處理潛在的空輸入(A 通過(guò)生成 來(lái)處理它們None,而 B 引發(fā)一個(gè)IndexError)。它確實(shí)增加了非零成本(CPython 只有最簡(jiǎn)單、最本地化的優(yōu)化器;它不能做出像“min_val僅None在第一個(gè)循環(huán)上”這樣的廣泛推論)。如果性能至關(guān)重要,您可以通過(guò)以下方式獲得兩全其美(盡管代碼稍顯丑陋):
vals = ... could be any iterable ...
iter_vals = iter(vals) # Explicitly convert to iterator (if already an iterator, just returns vals at trivial cost)
min_val = next(iter_vals, None) # Pulls first value, or None if vals was empty
for val in iter_vals: # Iterates rest of values looking for minimum
if val < min_val:
min_val = val
print("min = ", min_val)
在這種情況下,您不會(huì)假設(shè)輸入是序列,您不會(huì)制作不必要的數(shù)據(jù)副本(切片會(huì)這樣做list_vals[1:]),您不必為初始情況發(fā)明哨兵值,因?yàn)槟梢园踩孬@取第一個(gè)元素一次,并且您不會(huì)針對(duì)其自身測(cè)試初始值(因?yàn)橛袪顟B(tài)迭代器僅產(chǎn)生初始值一次)。
添加回答
舉報(bào)