Quais são os usos do iter (callable, sentinel)?
Então, eu estava assistindo a palestra de Raymond HettingerTransformando código em belo e python linguístico e ele traz essa forma deiter
que eu nunca tinha conhecimento. Seu exemplo é o seguinte:
Ao invés de:
blocks = []
while True:
block = f.read(32)
if block == '':
break
blocks.append(block)
Usar:
blocks = []
read_block = partial(f.read, 32)
for block in iter(read_block, ''):
blocks.append(block)
Depois de verificar odocumentação doiter
, Encontrei um exemplo semelhante:
with open('mydata.txt') as fp:
for line in iter(fp.readline, ''):
process_line(line)
Isso me parece útil, mas eu queria saber se vocês, pythonistas, conhecem algum exemplo dessa construção que não envolva loops de leitura de E / S? Talvez na Biblioteca Padrão?
Eu posso pensar em exemplos bem elaborados, como o seguinte:
>>> def f():
... f.count += 1
... return f.count
...
>>> f.count = 0
>>> list(iter(f,20))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
>>>
Mas, obviamente, isso não é mais útil que as iteráveis internas. Além disso, parece-me um cheiro de código quando você está atribuindo estado a uma função. Nesse ponto, eu provavelmente deveria estar trabalhando com uma classe, mas se vou escrever uma classe, é melhor implementar o protocolo iterador para o que eu quiser realizar.