使用^{}实现非零测试,只需在创建时缓存它:from itertools import tee
class NonZeroIterable(object):
def __init__(self, iterable):
self.__iterable, test = tee(iter(iterable))
try:
test.next()
self.__nonzero = True
except StopIteration:
self.__nonzero = False
def __nonzero__(self):
return self.__nonzero
def __iter__(self):
return self.__iterable
小演示:>>> nz = NonZeroIterable('foobar')
>>> if nz: print list(nz)
...
['f', 'o', 'o', 'b', 'a', 'r']
>>> nz2 = NonZeroIterable([])
>>> if not nz2: print 'empty'
...
empty
此版本的不可零缓存标志;因此它只告诉您迭代器在开始时是否为非空。如果您需要能够在iterable生命周期的其他点上测试它,那么可以使用Sven's version;在每次迭代之后,如果还有更多的项要继续,那么__nonzero__标志将告诉您。
你例子中的旁注
您的示例代码太简单,不适合您的用例;您首先测试非空性(可能会在输入列表上迭代以查找奇数),但无论如何都会耗尽整个迭代器。下面的代码同样有效,不需要您发明打破python习惯用法的方法:def print_odd(odd_nums):
odd_nums = list(odd_nums)
if odd_nums:
print "odd numbers found", odd_nums
else:
print "No odd numbers found"