2016-09-08 44 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