(使用Python 3.1)
我知道这个问题多次被问到测试迭代器是否为空的一般问题;很明显,没有那个简洁的解决方案(我猜有一个原因 – 迭代器在它被要求返回其下一个值之前并不真正知道它是否为空).
但是,我有一个具体的例子,希望我能用它制作干净的Pythonic代码:
#lst is an arbitrary iterable
#f must return the smallest non-zero element, or return None if empty
def f(lst):
flt = filter(lambda x : x is not None and x != 0, lst)
if # somehow check that flt is empty
return None
return min(flt)
有没有更好的方法呢?
编辑:抱歉愚蠢的表示法.函数的参数确实是任意可迭代的,而不是列表.
解决方法:
def f(lst):
flt = filter(lambda x : x is not None and x != 0, lst)
try:
return min(flt)
except ValueError:
return None
当序列为空时,min抛出ValueError.这遵循了常见的“更容易请求宽恕”范例.
编辑:基于减少的解决方案,无例外
from functools import reduce
def f(lst):
flt = filter(lambda x : x is not None and x != 0, lst)
m = next(flt, None)
if m is None:
return None
return reduce(min, flt, m)