Tudo bem, essa lista enorme finalmente acabou de entrar na memória.
Mas lembre-se de nossos termos-chave, lembre-se de como ele disse que uma lista é iterável?
O que foi um iterável?
Bem, um iterável é qualquer objeto em Python, que podemos percorrer por baixo do capô, ele
tem o método Dundar ed.
Então, quando o objeto é criado, este iter nos permite ter um objeto iterável que
pode ser iterado para iterar algo ou iteração é o ato de pegar um item de um iterável, fazer algo nele e então ir
para o próximo.
Quando usamos loops como loops for ou while, chamamos isso de iteração.
É o próprio processo.
E geradores.
São realmente iteráveis, ou seja, tudo o que é um gerador é iterável e você pode iterar sobre eles, mas nem tudo
o que é.
Iterable é um gerador, por exemplo, um range é um gerador.
Portanto, isso sempre será iterável.
Mas uma lista é iterável, mas não é um gerador.
Portanto, um gerador é um subconjunto de um iterável.
Eu sei que são muitas palavras.
Espero que você ainda esteja comigo.
A diferença entre um gerador e um iterável regular é a maneira como os implementamos.
Deixe-me mostrar uma maneira geral de criar um gerador.
Vamos limpar este código e definir nosso próprio gerador e os geradores são geralmente funções assim como intervalo é uma
função, geradores geralmente são criados dessa maneira.
Então, digamos função de gerador.
E essa função geradora terá um loop for que fará um loop em um intervalo exatamente como fizemos
antes.
Mas a diferença aqui, vamos realmente trazer de volta o código que tínhamos anteriormente.
Ela vai comentar isso para que possamos ver em termos de diferença.
A função do gerador vai.
Crie, digamos, esses muitos itens.
Mas, em vez de retornar como faríamos em uma função normal, usaremos uma palavra-chave chamada
yield.
E aqui vamos render o I so o item.
Portanto, observe a diferença aqui.
Agora, se quisermos como aqui, podemos passar um número.
Assim, mas em vez de voltar.
E anexando essa lista e criando todos esses dados, vamos usar o ILD.
Agora, o que produz, você vê que yield pausa a função e volta a ela quando fazemos algo com ela, que é chamado
a seguir, algo que abordaremos em breve?
Então o rendimento diz, ei, pause a função, apenas ceda.
Eu dou e quando você me disser para continuar de novo, então eu continuarei.
Então, como podemos fazer isso?
Bem, posso dizer que vou usar o item na função do gerador.
Imprima o item.
Agora, aqui, o que vai acontecer é que vamos fazer um loop sobre a função do gerador e vamos passar
para a função do gerador, digamos mil por enquanto.
E vamos imprimir cada item na função do gerador porque é iterável.
Ele vai rodar e fazer um loop e para cada item neste número, então esse é o intervalo que iremos fornecer
por quê?
Portanto, ele continuará em loop e em loop.
E quando voltarmos, quando fizermos um loop.
Vamos executar isso e o rendimento.
Volta e corre de novo.
Deixe-me mostrar o que vou comentar sobre isso, comente também e apenas clique em Ron aqui.
Você viu que o que acabamos de fazer aqui é semelhante ao aqui embaixo, mas em vez de ter que criar
essa lista na memória, ela continuou um por um.
Tínhamos apenas um item na memória.
E usamos como queríamos, no nosso caso, tudo o que fizemos foi imprimir o item.
Vamos explorar um pouco mais essa palavra-chave de rendimento.
O que isso realmente faz?
Digamos que queremos multiplicar isso por dois, assim como fizemos aqui em nosso exemplo original com lista,
mas agora, em vez de fazer o loop for, vamos apenas chamar a função.
E digamos que G é igual à função do gerador e vamos dar 100.
Agora, se eu imprimir G e clicar em executar.
Você vê que eu recebo um objeto gerador.
Lembro que essa é apenas a maneira padrão em Python que podemos criar uma função
de gerador usando intervalo e a palavra-chave yield, mas essa palavra-chave yield nos dá algum poder porque se eu simplesmente retornar aqui.
Não vamos obter nada de especial, na verdade, vamos apenas obter um valor, em vez
de usar a palavra-chave yield.
O que podemos fazer é transformar isso em uma função geradora que pode funcionar bem, posso dizer o próximo
G.
Agora, se eu imprimir Next G aqui e clicar em executar.
Eu recebo zero.
Mas aqui está uma parte legal, se eu fizer NextG duas vezes e uma vez aqui e impresso.
Eu consigo.
Por que é que?
Lembre-se de que a palavra-chave eagle pausa a função.
Então, o que aconteceu aqui é que executei a função com cem.
O primeiro item no intervalo 100 era zero.
Direito.
Agora, aqui, antes mesmo de eu ser capaz de executar, isto é dito, ei, esta é uma função geradora, mas a primeira vez que
você a executa.
Dê a saída zero vezes para para que, na primeira vez em que executarmos essa função, eu clique em executar.
Vou ter certeza de mudar isso para I.
Este é apenas este ano.
Se eu executá-lo novamente assim, agora quero que você itere e vá para um.
Então, um vezes dois, o que é isso?
O quê, uma vez para me deixar consertar assim?
Certifique-se de que este seja I, eu consigo porque um vezes dois é dois, se eu executá-lo novamente e clicar em executar.
Eu consigo.
Você vê o rendimento, como eu disse antes, pausa a função e volta a ela na próxima chamada.
Portanto, se ele tiver uma palavra-chave de rendimento, ele se tornará um gerador.
Ele mantém o controle desse estado, o que chamamos de valor, e ele apenas mantém os dados mais recentes na memória,
por exemplo, porque ele lembra disso porque na última linha 14, se eu imprimir o Próximo G.
Lembre-se que anteriormente este eu era.
Bem, por enquanto, embora este trecho de código já tenha sido executado, se eu executá-lo na linha 14.
Eu tenho seis.
Porque três vezes dois, bem, é seis, lembre-se, porque é multiplicado por dois, então deixe-me perguntar uma coisa.
Se digamos que eu só faço um intervalo de um aqui, e sabe o que mais?
Vamos apenas remover a multiplicação por dois.
Se eu fizer isso e executar mais uma vez, então bem, mais de uma vez, o que acontecerá se eu clicar em executar aqui?
Recebo uma iteração de parada, veja a seguir pode ser chamado quantas vezes quisermos, quantas vezes até
que esse intervalo expire e quando excedermos o número de itens no intervalo.
Bem, temos uma iteração de parada, er.
Para nos informar disso, ei, você não pode mais ligar em seguida.
Chegamos ao fim da linha e quando usamos loops for com intervalos, ele realmente detecta isso por baixo do capô
para você.
Então, podemos executar uma função como esta, onde usamos range, mesmo que range seja um gerador, porque o loop for
diz automaticamente, ei, vou parar de fazer o loop assim que encontrar essa iteração de parada, mas isso
é escondido de nós como usuários.
Bem, esse conceito de geradores é muito difícil de entender, especialmente no início.
Então, você pode ter que olhar para isso algumas vezes.
Mas, nos próximos dois vídeos, quero convencê-lo de como eles são poderosos.
Eu verei no próximo por.