Instrutor: Olá, e bem vindo de volta.
Neste vídeo estamos
falando de classes e iteradores de geradores.
Aqui vou mostrar uma aula que implementa
o gerador de 100 números que fizemos no último vídeo.
Então eu vou chamá-lo de FirstHundredGenerator.
Assim, e depois vamos definir um método init.
O que vai apenas iniciar o número como
zero e, em seguida, vamos definir um
próximo underscore, sublinhado, próximo método.
Quando você define um próximo método em uma
classe, qualquer objeto que você pode chamar próximo do meu objeto, como assim.
Então, isso é novamente, um método dunder
que permite que você chame o próximo nele.
Também diz ao Python algo muito importante.
Vamos ver isso daqui a pouco.
Então, se quiséssemos gerar 100 números, tudo o que temos
a fazer é obter auto-estima. número, devolvê-lo
e incrementá-lo por um.
Então, se eu. número é menor que
100, não vamos usar a palavra-chave yield aqui,
a propósito, porque você não precisa de um gerador de classes.
Desculpe, em uma dessas coisas. (risos) Só
não vou dizer nada que possa
ser mal interpretado como errado.
Só para não te confundir.
O que fazer é, se o número for
menor que 100, nós
colocamos isso em uma variável, então incrementamos o número em um,
e então retornamos o número atual, que
era o valor anterior, então
é zero.
Nós aumentamos a auto. número por um, retornamos zero.
OK.
Agora importante na classe,
temos que, se quisermos
parar de
retornar números, assim, não estamos usando um loop
aqui para nos parar quando chegarmos a 100.
Então, quando chegarmos a 100, temos
que lançar um erro especial chamado Stop Iteration.
Parar erro de iteração informa
ao Python que chegamos ao final desse gerador.
Estou dizendo gerador e estou vacilando um pouco, hum aqui.
Como esse é essencialmente um gerador, você começa no
zero, depois
decide se deseja retornar um novo número, obtém esse número,
depois o retorna e, em
seguida, o programa pára.
Mas seu objeto permanece e se lembra de si mesmo. número.
Então, se tivermos meu gen, e esse é nosso primeiro
cem gerador lá.
Meu gen. número é
claro zero no início.
Certo?
Vamos te mostrar isso.
Meu gen o número zero no começo.
Se você fizer o meu gen. próximo como assim, e
depois imprimir
o meu gen. número novamente, você
ganha um.
Isso faz sentido certo?
Porque o próximo método aqui é verificar se o número é
menor que 100 e,
em seguida, incrementá-lo em um.
Então tudo isso faz sentido.
Agora, para fazer com que se comporte
como um gerador, acabamos de dizer o próximo da minha
geração, assim.
Então podemos rodar isso de novo, e a mesma coisa sai.
É claro que o próximo
da minha geração está retornando o número que tinha antes de incrementá-lo.
Então, ao invés de imprimir meu gen. número aqui, podemos apenas
imprimir o próximo da minha geração, e aqui também podemos
imprimir o próximo da minha geração, e obteremos
a mesma saída, zero e um.
Na primeira vez que chamamos a seguir, obtemos o
valor atual, que é zero, mas aumentamos. número por um.
Da próxima vez que ligarmos
para o próximo, novamente, incrementos desse número em
um, mas retornaremos o valor anterior, que é um.
Então agora isso está se comportando exatamente como
um gerador e, na verdade, isso é um gerador.
Não está armazenando todos os valores até 100 em uma lista.
Está dando-lhes um por um.
Está gerando-os enquanto você chama a próxima função.
Desculpe, o próximo método.
By the way, dunder seguinte é novo em Python três.
Então, se você estiver
usando o Python dois, terá que definir o próximo sem o sublinhado.
Isso é apenas para o Python dois.
Se você estiver usando Python, use trés dunder a seguir.
Ok,
todos os objetos que têm este método dunder next
são chamados de iteradores.
Todos os geradores, como este, são iteradores,
mas não o contrário.
Então você pode ter iteradores que não geram números.
Por exemplo, se você modificar seu primeiro
gerador de números para retornar parte de uma lista
como, primeiro cem iterador, não gerador, você pode
ter um método init aqui, que
diz auto. números é,
um, dois, três, quatro, cinco.
Obviamente não é, não
primeiro cem, que é primeiro cinco iterador, eu sou zero.
Então esse é o índice que você vai começar a retornar.
Zero, e os números que estamos retornando
são de um a cinco.
Então, novamente, o próximo método aqui vai dizer se eu for
menos do que eu. números, retorne
eu. números I.
Certo?
Else raise stop iteration.
Desculpe, você não pode ver isso muito bem, mas
lá vamos nós.
Então, tudo o que estamos fazendo aqui é que não estamos gerando nada.
Estamos dizendo que se eu for menor
do que, a propósito, é claro que temos que fazer isso,
eu mais igual
a um e retorno atual.
Temos que incrementar um, e
temos que incrementar I por um, é claro.
Mais uma vez, não estamos gerando novos números.
Estamos mantendo o controle de que eu, o índice que estamos atualmente,
você tem que fazer isso de alguma forma para isso, isso
deve ser auto. Eu pelo caminho.
Você pode dizer que eu não preparei este exemplo, mas
eu queria mostrar rapidamente que
nem todos os geradores, nem todos os iteradores,
precisam ser geradores.
Nesse caso, você não está gerando os números,
você os está retornando de uma lista.
Então, apenas um exemplo rápido lá.
Você terá isso no código de exemplo da seção,
se me lembrar de adicioná-lo.
Então, aqui, o que fazemos quando definimos o próximo método, definimos
um iterador,
algo que você pode passar um por
um, chamando a próxima função.
Ele não precisa necessariamente gerar todos os seus números, mas pode, mas,
novamente, ele também pode retorná-los de uma lista, de um envio
ou de qualquer outro lugar.
Então, em Python é importante.
Iteradores são aqueles objetos que possuem
um próximo método dunder.
Você pode ligar em seguida sobre eles.
Nós nos temos um iterador, mas
não
podemos fazer por eu
em minha geração,
em minha geração.
Você não pode fazer isso.
Deixe-me dizer isso agora.
Se executarmos isso, você receberá um erro que diz: primeiro,
100 objetos geradores não são iteráveis,
mas eu disse que é um iterador e é um iterador.
O que um iterador significa é que
você pode chamar a
próxima função, e isso lhe dará o próximo valor.
Mas um iterador e um iterável são coisas diferentes.
Você pode iterar por um iterável
e o iterador é usado para obter o próximo valor
de uma sequência ou de valores gerados.
Então, o que temos aqui é um
iterador e não iterável.
Nós vamos aprender no próximo vídeo
como criar um iterável,
para que possamos passar por cima
dele, ou de fato fazer coisas como a soma de
minha geração, ou você sabe, o que quer que você queira fazer.
Lista do meu gen.
Essas coisas aqui precisam de um iterável e não de um iterador.
Então vamos fazer isso no próximo vídeo.
Eu te vejo lá.