Генераторы 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
- Я думаю, что он ведет себя правильно, как простой генератор. Есть ли угловой корпус Я скучаю?
- Это не выглядит элегантно. Есть ли еще лучший питонический способ сделать то же самое?
Использование образца:
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]))