1 回答

TA貢獻1780條經驗 獲得超1個贊
在一般代碼中,您可能想要使用任意可迭代對象,而不僅僅是list,在這種情況下,只有第一種形式完全有效(您無法索引非序列)。您可能還需要處理潛在的空輸入(A 通過生成 來處理它們None,而 B 引發一個IndexError)。它確實增加了非零成本(CPython 只有最簡單、最本地化的優化器;它不能做出像“min_val僅None在第一個循環上”這樣的廣泛推論)。如果性能至關重要,您可以通過以下方式獲得兩全其美(盡管代碼稍顯丑陋):
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)
在這種情況下,您不會假設輸入是序列,您不會制作不必要的數據副本(切片會這樣做list_vals[1:]),您不必為初始情況發明哨兵值,因為您可以安全地獲取第一個元素一次,并且您不會針對其自身測試初始值(因為有狀態迭代器僅產生初始值一次)。
添加回答
舉報