Iter Python

Resumo : neste tutorial, você aprenderá como usar a iter()função integrada do Python de maneira eficaz.

Introdução à função iter do Python

A iter()função retorna um iterador de um determinado objeto:

iter(object)Linguagem de código:  Python  ( python )

A iter()função requer um argumento que pode ser iterável ou uma sequência . Em geral, o argumento do objeto pode ser qualquer objeto que suporte protocolo de iteração ou de sequência.

Quando você chama a iter()função em um objeto, a função primeiro procura um __iter__()método desse objeto.

Se o __iter__()método existir, a iter()função o chama para obter um iterador. Caso contrário, a iter()função procurará um __getitem__()método.

Se __getitem__()estiver disponível, a iter()função cria um objeto iterador e retorna esse objeto. Caso contrário, gera uma TypeErrorexceção.

O fluxograma a seguir ilustra como a iter()função funciona:

Como funciona a função Python iter()

Exemplos de funções Python iter()

O exemplo a seguir define uma Counterclasse simples e usa a iter()função para obter um iterador do objeto contador:

class Counter:
    def __init__(self):
        self.__current = 0


counter = Counter()
iterator = iter(counter)Linguagem de código:  Python  ( python )

Isso gerará a TypeErrorporque o counterobjeto não é iterável:

TypeError: 'Counter' object is not iterableLinguagem de código:  Python  ( python )

O seguinte adiciona o __getitem__()método à Counterclasse:

class Counter:
    def __init__(self):
        self.current = 0

    def __getitem__(self, index):
        if isinstance(index, int):
            self.current += 1
            return self.currentLinguagem de código:  Python  ( python )

Como Counterimplementa o __getitem__()método que retorna um elemento baseado em um índice, é uma sequência.

Agora, você pode usar a iter()função para obter o iterador do contador:

counter = Counter()

iterator = iter(counter)
print(type(iterator))Linguagem de código:  Python  ( python )

Saída:

<class 'iterator'>Linguagem de código:  Python  ( python )

Nesse caso, Python cria um objeto iterador e o retorna. Portanto, você pode usar o objeto iterador para iterar counter:

for _ in range(1, 4):
    print(next(iterator))Linguagem de código:  Python  ( python )

O seguinte adiciona a CounterIteratorclasse à Counterclasse e implementa o protocolo iterável:

class Counter:
    def __init__(self):
        self.current = 0

    def __getitem__(self, index):
        if isinstance(index, int):
            self.current += 1
            return self.current

    def __iter__(self):
        return self.CounterIterator(self)

    class CounterIterator:
        def __init__(self, counter):
            self.__counter = counter

        def __iter__(self):
            return self

        def __next__(self):
            self.__counter.current += 1
            return self.__counter.currentLinguagem de código:  Python  ( python )

Como funciona.

  • A classe Counter implementa o __iter__()método que retorna um iterador. O iterador de retorno é uma nova instância do CounterIterator.
  • A CounterIteratorclasse oferece suporte ao protocolo iterador implementando os métodos __iter__()e __next__().

Quando os métodos __iter__()and __getitem__()existem, a iter()função sempre usa o __iter__()método:

counter = Counter()

iterator = iter(counter)
print(type(iterator))Linguagem de código:  Python  ( python )

Saída:

<class '__main__.Counter.CounterIterator'>
1
2
3Linguagem de código:  Python  ( python )

Neste exemplo, a iter()função chama o __iter__()método em vez do __getitem__()método. É por isso que você vê CounterIteratorna saída.

A segunda forma da iter()função Python

O seguinte mostra a segunda forma da iter()função:

iter(callable, sentinel)Linguagem de código:  Python  ( python )

O iter(callable,sentinel)irá chamar um callable quando o next()método for chamado.

Ele retornará o valor retornado pelo callable ou gerará a exceção StopIteration se o resultado for igual ao valor sentinela.

Vamos dar um exemplo para entender como iter(callable, sentinel)funciona.

Primeiro, defina uma função que retorne fechamento:

def counter():
    count = 0

    def increase():
        nonlocal count
        count += 1
        return count

    return increase
Linguagem de código:  Python  ( python )

A counter()função retorna um fechamento. E o encerramento retorna um novo número inteiro começando em um quando é chamado.

Segundo, use a counter()função para mostrar os números de 1 a 3:

cnt = counter()

while True:
    current = cnt()
    print(current)
    if current == 3:
        breakLinguagem de código:  Python  ( python )

Saída:

1
2
3Linguagem de código:  Python  ( python )

Para torná-lo mais genérico, você pode usar um iterador.

Terceiro, defina um novo contador iterador:

class CounterIterator:
    def __init__(self, fn, sentinel):
        self.fn = fn
        self.sentinel = sentinel

    def __iter__(self):
        return self

    def __next__(self):
        current = self.fn()
        if current == self.sentinel:
            raise StopIteration

        return currentLinguagem de código:  Python  ( python )

O CounterIteratorconstrutor do aceita um callable fne um sentinel.

O __next__()método retorna o valor retornado pelo callable ( fn) ou gera uma StopIterationexceção se o valor de retorno for igual ao sentinela.

Veja a seguir como usar o CounterIterator:

cnt = counter()
iterator = CounterIterator(cnt, 4)
for count in iterator:
    print(count)Linguagem de código:  Python  ( python )

Saída:

1
2
3Linguagem de código:  Python  ( python )

Em vez de definir um novo iterador toda vez que quiser iterar valores retornados pelo callable, você pode usar a iter(callable, sentinel)função:

cnt = counter()
iterator = iter(cnt, 4)

for count in iterator:
    print(count)
Linguagem de código:  Python  ( python )

Saída:

1
2
3
Linguagem de código:  Python  ( python )

Use a função Python iter() para testar se um objeto é iterável

Para determinar se um objeto é iterável, você pode verificar se ele implementa o método __iter__()ou __getitem__().

No entanto, você pode usar a iter()função para testar se um objeto é iterável da seguinte maneira:

def is_iterable(object):
    try:
        iter(object)
    except TypeError:
        return False
    else:
        return TrueLinguagem de código:  Python  ( python )

Se o objeto não implementa nenhum __iter__()método nem __getitem__()método, a iter()função gera a TypeErrorexceção.

O seguinte mostra como usar a is_iterable()função:

print(is_iterable([1, 2, 3]))
print(is_iterable('Python iter'))
print(is_iterable(100))Linguagem de código:  Python  ( python )

Saída:

True
True
FalseLinguagem de código:  Python  ( python )

Resumo

  • Use a função Python iter()para obter um iterador de um objeto.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *