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:]),您不必为初始情况发明哨兵值,因为您可以安全地获取第一个元素一次,并且您不会针对其自身测试初始值(因为有状态迭代器仅产生初始值一次)。
添加回答
举报