【发布时间】:2012-07-13 02:58:21
【问题描述】:
在大多数情况下,python 生成器是列表的良好替代品,我希望在其中检查空条件,而这对于普通生成器是不可能的。我正在尝试编写一个包装器,它允许检查空条件,但仍然很懒惰并提供生成器的好处。
class mygen:
def __init__(self,iterable):
self.iterable = (x for x in iterable)
self.peeked = False
self.peek = None
def __iter__(self):
if self.peeked:
yield self.peek
self.peeked = False
for val in self.iterable:
if self.peeked:
yield self.peek
self.peeked = False
yield val
if self.peeked:
yield self.peek
self.peeked = False
def __nonzero__(self):
if self.peeked:
return True
try:
self.peek = self.iterable.next()
self.peeked = True
return True
except:
return False
- 我认为它的行为与普通生成器一样正确。是否有任何角落案例 我迷路了?
- 这看起来不太优雅。有没有更好的 Pythonic 方式来做同样的事情?
示例用法:
def get_odd(l):
return mygen(x for x in l if x%2)
def print_odd(odd_nums):
if odd_nums:
print "odd numbers found",list(odd_nums)
else:
print "No odd numbers found"
print_odd(get_odd([2,4,6,8]))
print_odd(get_odd([2,4,6,8,7]))
【问题讨论】:
-
(x for x in iterable)是一种缓慢而冗长的写法iter(iterable)。 -
你想让
__nonzero__()返回当前是否有剩余的项目,或者iterable是否从一开始就为空? -
我要看看还有没有剩余的东西。