Re: geradores não funcionam com syper

15 views
Skip to first unread message

Lucas Castro

unread,
May 15, 2018, 10:38:15 AM5/15/18
to grup...@googlegroups.com
Olá, Caio. Tudo bem?

Rodei aqui o código que você mostrou e ele teve uma saída diferente:

>>> def geradores():
...     for i in range(3):
...         print('aqui')
...     yield 'andre'
...     yield 'luis'
...     yield 'souza'
...
>>> x= geradores()
>>>
>>> print(next(x))
aqui
aqui
aqui
andre

--

a explicação é: 
  • "aqui" foi impresso 3 vezes por causa do for i in range(3)
  • o resultado de range(3) é  [0, 1, 2], portanto o for roda 3 vezes
  • andre foi impresso uma vez por que o next(x) foi chamado apenas uma vez e o primeiro yield retorna 'andre' pro next que foi chamado

Me explica qual a sua expectativa de funcionamento da saída que eu posso mostrar um exemplo do código que atenda a essa expectativa pra facilitar seu entendimento.

Abraço




On Tue, May 15, 2018 at 9:44 AM Caio Katarn <caio....@gmail.com> wrote:
Amigos vi um video que um cara ao explicar geradores fez o código:

def geradores():
    yield 'abacaxi'
    yield '13'
    yield [1,2,3]'
x= geradores()

depois ele dava um next(x) e a cada vez a saída resultava:
>>>abacaxi
>>>13
>>>[1,2,3]

fiz o código no spyder:

def geradores():
    for i in range(3):
        print('aqui')
    yield 'andre'
    yield 'luis'
    yield 'souza'

x= geradores()   

print(next(x))

e a saída é apenas:

>>>andre
>>>andre
>>>andre

alguém sabe me explicar por que?

--
Você recebeu essa mensagem porque está inscrito no grupo "Grupo de usuários Python - RN" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para grupy-rn+u...@googlegroups.com.
Para postar nesse grupo, envie um e-mail para grup...@googlegroups.com.
Acesse esse grupo em https://groups.google.com/group/grupy-rn.
Para mais opções, acesse https://groups.google.com/d/optout.

Caio Katarn

unread,
May 15, 2018, 11:54:49 AM5/15/18
to Grupo de usuários Python - RN
Oi Lucas na verdade eu que copiei errado a saída foi a mesma, mais estou com muita dificuldade de entender geradores, eu simplesmente não consigo entender, tentei fazer o codigo:

def aqui():
    for i in range(5):
        conta+=5
    yield conta

x= aqui()

print(next(x))

e pensei que ele iria exibir:

>>>5
>>>10
>>>15
>>>20
>>>25
>>>30

mais ele dá erro e não mostra nada, dá este erro:

UnboundLocalError: local variable 'conta' referenced before assignment

Pode me ajudar?

Caio Katarn

unread,
May 15, 2018, 12:19:17 PM5/15/18
to Grupo de usuários Python - RN
Consegui entender o meu problema era identação, eu colocava o Yield na mesma linha que o Def na função e não dentro da instrução FOR.


Em terça-feira, 15 de maio de 2018 11:38:15 UTC-3, Lucas Castro escreveu:

Lucas Castro

unread,
May 15, 2018, 1:52:03 PM5/15/18
to grup...@googlegroups.com
Ah, que ótimo! 

Tem mais alguma coisa que você quer ajuda pra entender?

Caio Katarn

unread,
May 17, 2018, 8:53:44 AM5/17/18
to Grupo de usuários Python - RN
Olá Lucas têm sim, fiz o código:

def funca():
   
    for i in range(5):
        print("andre denovo %s"%(i))
        yield i

next(funca())

e a saída sendo:

>>>andre denovo 0

e se eu compilar denovo sai:

>>>andre denovo 0

ao invés de:

>>>andre denovo 1

o que esta errado?

Caio Katarn

unread,
May 17, 2018, 9:15:18 AM5/17/18
to Grupo de usuários Python - RN
Lucas dei uma olhada aqui e se eu instanciar a função Funciona! acho que next() só funciona se instanciar e eu estava colocando a própria função nele.


Em terça-feira, 15 de maio de 2018 11:38:15 UTC-3, Lucas Castro escreveu:

Lucas Castro

unread,
May 21, 2018, 10:37:38 AM5/21/18
to grup...@googlegroups.com
Caio, uma dica: 

O next é bom apenas pra entender o conceito do generator. Em geral é raro a gente precisar chamar o next. 
Segue um uso mais comum do generator:

def meu_gerador():
    for i in range(5):
        print("Debug - Calculo: %s*%s = %s" % (i,i,i*i))
        yield i*i

quadrado = meu_gerador()

for q in quadrado:
    print "Resultado: %s" % q

---------

É possível obter resultado similar com o seguinte código:

quadrado = (i*i for i in range(5))

for q in quadrado:
print "Resultado: %s" % q

Caio Katarn

unread,
Jun 5, 2018, 8:33:25 AM6/5/18
to Grupo de usuários Python - RN
Ok obrigado.!
Reply all
Reply to author
Forward
0 new messages