2015-11-01 2 views
1

Я делаю это, чтобы лучше понять методы iter() и next().Создание функции, которая меняет итератор

Так что я понимаю, это можно легко сделать, как это использовать некоторые встроенные модули:

>>>animal = 'cat' 
>>>print(list(reversed(animal))) 
['t','a','c'] 

Но это также может быть сделано создание класса итератора:

class Reverselist(): 
    def __init__(self, data): 
     self.data = data 
     self.index = len(data) 

    def __iter__(self): 
     return self 

    def __next__(self): 
     if self.index == 0: 
      raise StopIteration 
     self.index =self.index -1 
     return self.data[self.index] 

    def intolist(self): 
     self.test = [i for i in self] 
     return self.test 

rev = Reverselist('cat') 
print(rev.intolist()) 

['t','a','c'] 

Однако, я с некоторыми проблемами, делающими то же самое, но используя функции вместо перехода на маршрут ООО.

Есть ли способ сделать это с помощью функций с использованием методов iter() и next() без необходимости прибегать к пониманию и циклам?

+2

Что именно вы подразумеваете под «использованием функций»? В качестве генераторной функции должен быть просто ваш собственный итератор обратного списка, но вам понадобится хотя бы один цикл какого-либо типа (либо «while index> 0», либо «for index in range» (len (lst) -1, - 1, -1) '). – Blckknght

+1

Не путайте итераторы и итерации. Итератору необязательно нужно генерировать конечную последовательность, и поэтому не имеет последнего элемента для начала. – chepner

ответ

1

Вы можете сделать это с помощью generator function:

def reverse_list(seq): 
    for index in range(len(seq)-1, -1, -1): 
     yield seq[index] 

Вызов этой функции будет производить «объект генератора», который поддерживает iter() и next().

>>> rev = reverse_list('cat') 
>>> rev 
<generator object reverse_list at 0x10a93ebe0> 
>>> next(rev) 
't' 
+0

Спасибо за ответ. Я больше искал способ сделать это с помощью 'iter()' и 'next()' явно? Я понимаю, что это усложняет ситуацию. – dyao

+0

@bLunt Если вы хотите явно указать поведение 'iter()' и 'next()', используйте оригинальный подход к определению объекта с помощью методов '__iter__' и' __next__'. – augurar

Смежные вопросы