Функция Iterator (iter ()) в Python. - PullRequest
       5

Функция Iterator (iter ()) в Python.

17 голосов
/ 15 октября 2010

Для словаря я могу использовать iter() для перебора ключей словаря.

y = {"x":10, "y":20}
for val in iter(y):
    print val

Когда у меня есть следующий итератор,

class Counter:
    def __init__(self, low, high):
        self.current = low
        self.high = high

    def __iter__(self):
        return self

    def next(self):
        if self.current > self.high:
            raise StopIteration
        else:
            self.current += 1
            return self.current - 1

Почему я не могуЯ использую это так

x = Counter(3,8)
for i in x:
    print x

, ни

x = Counter(3,8)
for i in iter(x):
    print x

, но так?

for c in Counter(3, 8):
    print c

Какая польза от функции iter()?

ДОБАВЛЕНО

Полагаю, это может быть одним из способов использования iter().

class Counter:
    def __init__(self, low, high):
        self.current = low
        self.high = high

    def __iter__(self):
        return self

    def next(self):
        if self.current > self.high:
            raise StopIteration
        else:
            self.current += 1
            return self.current - 1

class Hello:
    def __iter__(self):
        return Counter(10,20)

x = iter(Hello())
for i in x:
    print i

Ответы [ 2 ]

16 голосов
/ 15 октября 2010

Все это прекрасно работает, за исключением опечатки - вы, вероятно, имеете в виду:

x = Counter(3,8)
for i in x:
    print i

вместо

x = Counter(3,8)
for i in x:
    print x
8 голосов
/ 15 октября 2010

Я думаю, что ваша настоящая проблема в том, что вы print x, когда вы имеете в виду print i

iter() используется для получения итератора для данного объекта. Если у вас есть метод __iter__, который определяет, что на самом деле будет делать iter. В вашем случае вы можете перебирать счетчик только один раз. Если бы вы определили __iter__ для возврата нового объекта, это сделало бы его таким, чтобы вы могли повторять его столько раз, сколько захотите. В вашем случае Counter уже итератор, поэтому имеет смысл возвращать себя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...