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 TypeError
exceção.
O fluxograma a seguir ilustra como a iter()
função funciona:
Exemplos de funções Python iter()
O exemplo a seguir define uma Counter
classe 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 TypeError
porque o counter
objeto não é iterável:
TypeError: 'Counter' object is not iterable
Linguagem de código: Python ( python )
O seguinte adiciona o __getitem__()
método à Counter
classe:
class Counter:
def __init__(self):
self.current = 0
def __getitem__(self, index):
if isinstance(index, int):
self.current += 1
return self.current
Linguagem de código: Python ( python )
Como Counter
implementa 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 CounterIterator
classe à Counter
classe 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.current
Linguagem 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 doCounterIterator
. - A
CounterIterator
classe 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
3
Linguagem 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ê CounterIterator
na 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:
break
Linguagem de código: Python ( python )
Saída:
1
2
3
Linguagem 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 current
Linguagem de código: Python ( python )
O CounterIterator
construtor do aceita um callable fn
e um sentinel
.
O __next__()
método retorna o valor retornado pelo callable ( fn
) ou gera uma StopIteration
exceçã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
3
Linguagem 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 True
Linguagem 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 TypeError
exceçã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
False
Linguagem de código: Python ( python )
Resumo
- Use a função Python
iter()
para obter um iterador de um objeto.