2016-09-08 40 views
1

我已经创建了一个迭代器。我试图通过配方成分迭代来检查纯素食者是否可以。无法将列表作为类属性

class Vegan: 

    NONE_VEGAN_INGREDIENT = ['egg', 'milk', 'honey', 'butter'] 

    def __init__(self, *args): 
     self.ingredient_list = (args) 
     self.index = -1 

    def __iter__(self): 
     return self 

    def __next__(self): 
     if self.index == len(self.ingredient_list): 
      raise StopIteration 
     for ingredient in self.ingredient_list: 
      if ingredient in Vegan.NONE_VEGAN_INGREDIENT: 
       self.index += 1 
       return ('{} is a vegan ingredient'.format(ingredient[self.index])) 
      else: 
       self.index += 1 
       return ('{} is NOT a vegan ingredient'.format(ingredient[self.index])) 

iterable = Vegan('tomato', 'banana', 'asd', 'egg', 'tomato') 
iterator = iter(iterable) 
while True: 
    try: 
     print(next(iterator)) 
    except StopIteration: 
     break 

,你可以看到,我路过*指定参数时,这应该是一个名单,但每当我尝试运行此,它通过第一个字迭代,并检查单词“番茄”的信。我想让我的迭代器遍历所有的成分,如果某些东西不在NONE_VEGAN_INGREDIENT列表中,那么就按原样打印在代码中。我怎样才能通过一个列表?

+0

不是简单的'在素食V固定问题(..):打印(V)'相当于你的最后一行? – polku

+3

你为什么要调用它,为什么不迭代实例呢? –

回答

3

您的问题得到解决是因为你索引的元素不是元组,ingredient[self.index]应该是self.ingredient_list[self.index]

您可以简化代码通过使表现得像你的,但工作ARGS迭代这样你就可以通过字符串作为你无需将它们放在一个列表等:

class Vegan: 
    NONE_VEGAN_INGREDIENT = ['egg', 'milk', 'honey', 'butter'] 

    def __init__(self, *args): 
     self.ingredient_iter = iter(args) 
    def __iter__(self): 
     return self 

    def __next__(self): 
     ingredient = next(self.ingredient_iter) 
     if ingredient in Vegan.NONE_VEGAN_INGREDIENT: 
      return '{} is a vegan ingredient'.format(ingredient) 
     return '{} is NOT a vegan ingredient'.format(ingredient) 


iterable = Vegan('tomato', 'banana', 'asd', 'egg', 'tomato') 

for ele in iterable: 
    print(ele) 

输出:

In [2]: iterable = Vegan('tomato', 'banana', 'asd', 'egg', 'tomato') 

In [3]: for ele in iterable: 
    ...:   print(ele) 
    ...:  
tomato is NOT a vegan ingredient 
banana is NOT a vegan ingredient 
asd is NOT a vegan ingredient 
egg is a vegan ingredient 
tomato is NOT a vegan ingredient 

你提高自己的代码一个StopIteration但调用next(iterable)会做相同的,所以,使得对象的点迭代是你能所迭代直接在它上面,所以不需要尝试/除外。也我通过参数,这应该是一个列表是不正确的,参数是一个元组。

此外,如果你有很多成分的检查使NONE_VEGAN_INGREDIENT一组会更有效:

NONE_VEGAN_INGREDIENT = {'egg', 'milk', 'honey', 'butter'} 
0

这里是一个可能的解决问题的方法:

class Vegan: 

    NONE_VEGAN_INGREDIENT = ['egg', 'milk', 'honey', 'butter'] 

    def __init__(self, *args): 
     self.ingredient_list = (args) 

    def __iter__(self): 
     self.index = 0 
     return self 

    def __next__(self): 
     if self.index >= len(self.ingredient_list): 
      raise StopIteration 

     ingredient = self.ingredient_list[self.index] 
     self.index += 1 

     if ingredient in Vegan.NONE_VEGAN_INGREDIENT: 
      return ('{} is a vegan ingredient'.format(ingredient)) 
     else: 
      return ('{} is NOT a vegan ingredient'.format(ingredient)) 

iterable = Vegan('tomato', 'banana', 'asd', 'egg', 'tomato') 
iterator = iter(iterable) 

while True: 
    try: 
     print(next(iterator)) 
    except StopIteration: 
     break 

在任何情况下,我觉得这个问题可能在1个或2行,而不是使用__iter____next__方法,这样

0

我觉得跟你的类问题是,你通过你的__next__()方法的元素循环。下面是使用代码的解决方案:

class Vegan: 

    NONE_VEGAN_INGREDIENT = ['egg', 'milk', 'honey', 'butter'] 

    def __init__(self, *args): 
     self.ingredient_list = args 
     self.index = -1 

    def __iter__(self): 
     return self 

    def __next__(self): 
     if self.index == len(self.ingredient_list) - 1: # index is incremented 
      raise StopIteration 
     self.index += 1 
     if self.ingredient_list[self.index] in Vegan.NONE_VEGAN_INGREDIENT: 
      return ('{} is a vegan ingredient'.format(self.ingredient_list[self.index])) 
     else: 
      return ('{} is NOT a vegan ingredient'.format(self.ingredient_list[self.index])) 

iterable = Vegan('tomato', 'banana', 'asd', 'egg', 'tomato') 
iterator = iter(iterable) 
while True: 
    try: 
     print(next(iterator)) 
    except StopIteration: 
     break 

我所做的只是改变指数检查出界len() - 1和删除的for循环。这工作,产生输出我假设你所追求的:

tomato is NOT a vegan ingredient 
banana is NOT a vegan ingredient 
asd is NOT a vegan ingredient 
egg is a vegan ingredient 
tomato is NOT a vegan ingredient 

编辑:用if语句

+0

你忘记提及一个修复你造成的奇怪行为,用单个字母:将'.format(成分[self.index])'改为'.format(self.ingredient_list [self.index])'。 – glibdud

+0

asd不包含在vegan_ingredients列表中,但我明白了你的观点。修复了代码。 – daladier