Dúvida: "for loops"

47 views
Skip to first unread message

José Casadei

unread,
Feb 25, 2014, 4:15:22 PM2/25/14
to programaded...@googlegroups.com
Tenho uma dúvida e vou colocar aqui. Se alguém puder ajudar, agradeço.

No capítulo 3 do livro, no item "3.2 For Loops" (isso não é uma string ...rs), há um exemplo de código:

x = 4
for j in range(x):
    for i in range(x):
        print i
        x = 2

O resultado é:

0
1
2
3
0
1
0
1
0
1

Eu entendi um aparte da resposta, não a outra. Eu entendi porque o programa me devolve como resposta "0, 1, 2, 3". Entendi também porque ele me devolve, na logo em seguida, "0, 1". Mas não entendi porque ele repete essa parte da resposta "0, 1" três vezes.

É isso.
Abs
José

Débora Setton Fernandes

unread,
Feb 25, 2014, 6:45:12 PM2/25/14
to José Casadei, programadedados2014_01
Oi José,

Bem interessante esse exercício!

Acho que uma das formas de entender a saída do programa é perceber que, cada vez que o loop interno termina e o valor de j aumenta, o código volta para a primeira linha do loop interno e avalia novamente o valor de x antes de decidir quantas vezes executar o seu bloco.

Logo na primeira iteração do loop interno, o valor de x passa a ser 2. Por isso, para todos outros valores de j a menos do primeiro valor (isso é, para j=1, j=2 e j=3), x vai ser 2 e, por isso, o loop interno só vai rodar duas vezes no restante das vezes, imprimindo somente 0 e 1.

Fiz sentido? :)

Repare que você poderia alcançar o mesmo resultado (mesmos "prints") com esse código:

x = 4
for j in range(x):
    for i in range(x):
        print(i)
    x = 2

As saídas são iguais, certo? Qual você diria que é a "melhor" forma, ou qual a diferença entre as duas?

[]s!


--
Você está recebendo esta mensagem porque se inscreveu no grupo "Aprendendo a Programar com o MIT e a Escola de Dados" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para programadedados20...@googlegroups.com.
Para postar neste grupo, envie um e-mail para programaded...@googlegroups.com.
Visite este grupo em http://groups.google.com/group/programadedados2014_01.
Para ver esta discussão na web, acesse https://groups.google.com/d/msgid/programadedados2014_01/0fe106d1-278a-4d8e-8a39-95b00d0e9306%40googlegroups.com.
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.

Débora Setton Fernandes

unread,
Feb 25, 2014, 6:52:25 PM2/25/14
to José Casadei, programadedados2014_01
Ah, uma dica: para entender um programa, use e abuse de prints :)

Tente executar essa versão (é o mesmo programa, com uns prints no meio do caminho):

x = 4
for j in range(x):
    print "---------------------------------------"
    print "Iniciando loop interno, com j=" + str(j)
    print "Valor de x=" + str(x) + ", portanto o print sera executado " + str(x) + " vezes."
    for i in range(x):
        print i
        print "Alterando o valor de x para 2."
        x = 2

Marco Túlio Pires

unread,
Feb 25, 2014, 7:09:22 PM2/25/14
to José Casadei, programadedados2014_01

José,

Deixa eu tentar te ajudar fazendo uma pergunta, ok?

Quantas vezes o looping de dentro, ou seja, o segundo "for", é avaliado, ou seja, é intepretado pelo computador?

Quantas vezes o looping de fora "roda"?

Acho que se você chegar na resposta dessa, você chega na da outra. Lembre-se que cada vez que uma função é interpretada, ela vai recalcular o valor de X.

Depois conta pra gente se conseguiu!

--

Marco Túlio Pires

unread,
Feb 25, 2014, 7:15:50 PM2/25/14
to José Casadei, programadedados2014_01

Ah, uma coisa que é boa prática entre pessoas que compartilham códigos e pode ser mais fácil que mandar os prints: http://pastebin.com - fica mais fácil de ler, pelo menos!

Vc vai lá, escolhe Python em "syntax highlighting" e cola o seu código. Clica em enviar e ele te devolve um link. Daí vc usa esse link pra compartilhar seu código!

Tipo assim: http://pastebin.com/rYYuSxDg

Pedro Markun

unread,
Feb 25, 2014, 7:15:56 PM2/25/14
to Marco Túlio Pires, José Casadei, programadedados2014_01

Pedro Markun

unread,
Feb 25, 2014, 7:20:40 PM2/25/14
to Marco Túlio Pires, José Casadei, programadedados2014_01

José Casadei

unread,
Feb 25, 2014, 7:30:26 PM2/25/14
to programaded...@googlegroups.com, José Casadei
oi, Débora, obrigado pelo esforço. Acho que entendi. Quando há a alteração de x (de 4 para 2), essa alteração ocorre somente no loop interno. Por isso, o x do loop externo, que já tinha sido vinculado como 4, exige que o loop maior seja repetido três vezes. É mais ou menos isso?
Abs
José

Marco Túlio Pires

unread,
Feb 25, 2014, 7:37:38 PM2/25/14
to José Casadei, programadedados2014_01

Matou, José! É isso mesmo!

--
Você está recebendo esta mensagem porque se inscreveu no grupo "Aprendendo a Programar com o MIT e a Escola de Dados" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para programadedados20...@googlegroups.com.
Para postar neste grupo, envie um e-mail para programaded...@googlegroups.com.
Visite este grupo em http://groups.google.com/group/programadedados2014_01.

José Casadei

unread,
Feb 25, 2014, 7:41:49 PM2/25/14
to programaded...@googlegroups.com, José Casadei

Não, acho que não entendi ...rs
pelo que o Marco escreveu, tanto o loop interno quanto o externo rodam 4 vezes. 
Depois de rodar 4 vezes no loop interno, e finalizar essa parte do código, volta pro loop externo (que rodará quatro vezes também).
No entanto, x está vinculado a 2 e por isso o loop interno acaba em duas voltas.

José Casadei

unread,
Feb 25, 2014, 8:10:23 PM2/25/14
to programaded...@googlegroups.com, José Casadei
 Bom, gente, li e reli as explicações e comentários aqui e também o trecho do livro sobre isso. Agora entendi porque o resultado (0,1) é impresso três vezes. Valeu. Amanhã tem mais pergunta, e mais complicada ...rs
Abs
José

Débora Fernandes

unread,
Feb 25, 2014, 8:26:06 PM2/25/14
to programaded...@googlegroups.com, José Casadei
Legal, José! Pode continuar mandando as perguntas, a gente se diverte =)

Só um comentário: eu achei sensacional a ferramenta que o Pedro postou aqui, e que alguém já tinha postado em outra thread (http://www.pythontutor.com/visualize.html). 

Eu não conhecia, mas que coisa demais para entender o programa! Você chegou a testar lá?

[]s!

José Casadei

unread,
Feb 26, 2014, 6:40:34 AM2/26/14
to programaded...@googlegroups.com, José Casadei
Oi, Débora,

Eu praticamente só estou utilizando essa ferramente (esse 'visualize'). Dá pra usar aqui no trabalho também. Eu vi que o Pedro publicou aqui. O Tom tinha colocado lá no bloco de notas.

(estou apanhando adoidado para entender a conversão para números binários)

Abs
José

José Casadei

unread,
Feb 26, 2014, 7:21:09 AM2/26/14
to programaded...@googlegroups.com, José Casadei

Bom, umas aulinhas do Youtube já me fizeram entender os números binários por vários métodos ... rs. Vamos ao trabalho, agora. Abs

José Casadei

unread,
Feb 26, 2014, 7:34:32 AM2/26/14
to programaded...@googlegroups.com, José Casadei
oi, Débora, só agora vi sua pergunta no fim da explicação. Acho que seu exemplo é melhor, mais eficiente, pois o loop interno vai demorar menor (uma etapa a menos). No seu exemplo, o código manda imprimir 'i' e depois já reinicia o loop. No exemplo que dei, o código manda imprimir 'i', manda vincular o novo valor de 'x' e só depois disso reinicia o loop.
É isso?
Abs
José

Pedro Markun

unread,
Feb 26, 2014, 7:45:49 AM2/26/14
to José Casadei, programadedados2014_01
Buenas,

não sei exatamente qual o perfil da galera aqui - mas especialmente pra 'jornalistas de dados' essa é uma questão muito comum e que vale ficar atento.

Muitas vezes quando você vai fazer cruzamento de dados em Python (p.ex 'encontrar todos os bens de cada candidato nas bases do TSE') essa ordem dos fatores importa muito! Com 3 repetições a diferença de desempenho é irrelevante... mas quando você começa a falar de milhares de itens cruzado com milhares de itens... a coisa começa a pesar mais!

(Pra quem não sacou as aplicações práticas do for essa é uma.)

[]'s
Pedro Markun
ps: Se você ficar confuso ao ler essa mensagem. Ignore e guarde num cantinho, volte daqui a algumas aulas e talvez faça mais sentido - estou meio que queimando etapa, mas é que depois vou esquece de comentar :P


--
Você está recebendo esta mensagem porque se inscreveu no grupo "Aprendendo a Programar com o MIT e a Escola de Dados" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para programadedados20...@googlegroups.com.
Para postar neste grupo, envie um e-mail para programaded...@googlegroups.com.
Visite este grupo em http://groups.google.com/group/programadedados2014_01.

Marco Túlio Pires

unread,
Feb 26, 2014, 9:14:32 AM2/26/14
to pedro, José Casadei, programadedados2014_01

Pedro, muito bem lembrado!

No último encontro chegamos a falar rapidamente sobre a complexidade de alguns programas e como é importante entender essas etapas, justamente por causa do excelente exemplo que deu! Os computadores são bons de fazer conta, mas dependendo dos dados que você  cruza as coisas ficam bem complexas. Daí a importância de entender as vantagens e desvantagens de cada abordagem e como elas funcionam, pra vc refletir se o que vc está pretendendo é possível ou vale a pena perseguir.

Isabel Malzoni

unread,
Feb 27, 2014, 9:44:02 AM2/27/14
to programaded...@googlegroups.com, José Casadei
Olá, pessoal,

Essa é a minha primeira postagem aqui, mas venho acompanhando o grupo desde o início do curso.
Sou editora de livros e tenho nenhuma experiência com programação, mas sempre tive muita vontade de aprender e agora estou me arriscando, com muito empenho, neste curso. Mas vejo que me faltam conhecimentos básicos e isso atrapalha. Mas as dicas de vcs têm sido preciosas. Achei uma pena não ter conseguido ir aos encontros presenciais ainda, mas no próximo estarei lá sem falta! 

Estou escrevendo aqui, abaixo do post do José Casadei, porque empaquei pela primeira vez no curso justamente noProblema 2C da L3. 
"3. Write a while loop that sums the values 1 through end, inclusive. end is a variable that we define for you. So, for example, if we define end to be 6, your code should print out the result:
21

which is 1 + 2 + 3 + 4 + 5 + 6.

For problems such as these, do not include raw_input statements or define the variable end. Our automating testing will provide a value of end for you - so write your code in the following box assumingend is already defined."

Sinceramente, estou sem saber até por onde começar. Alguém que tiver um tempo poderia me dar uma dica? Eu já estava me achando por ter acertado os problemas anteriores ( rs), mas agora empaquei...

Obrigada desde já e, qq coisa, até semana que vem!

Abs,
Isabel

Em terça-feira, 25 de fevereiro de 2014 21h37min38s UTC-3, Marco Túlio Pires escreveu:

Matou, José! É isso mesmo!

On Feb 25, 2014 9:30 PM, "José Casadei" <jrca...@gmail.com> wrote:
oi, Débora, obrigado pelo esforço. Acho que entendi. Quando há a alteração de x (de 4 para 2), essa alteração ocorre somente no loop interno. Por isso, o x do loop externo, que já tinha sido vinculado como 4, exige que o loop maior seja repetido três vezes. É mais ou menos isso?
Abs
José

--
Você está recebendo esta mensagem porque se inscreveu no grupo "Aprendendo a Programar com o MIT e a Escola de Dados" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para programadedados2014_01+unsub...@googlegroups.com.

Pedro Markun

unread,
Feb 27, 2014, 9:56:03 AM2/27/14
to Isabel Malzoni, programadedados2014_01, José Casadei
Isabel,

tem vários jeitos de preparar esse neston.

Mas o truque é você fazer um loop que rode n (= end) vezes e cada vez soma a própria 'contagem do numero de vezes' ao resultado final.

[]'s
Pedro Markun


Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para programadedados20...@googlegroups.com.

Para postar neste grupo, envie um e-mail para programaded...@googlegroups.com.
Visite este grupo em http://groups.google.com/group/programadedados2014_01.

Marco Túlio Pires

unread,
Feb 27, 2014, 10:10:24 AM2/27/14
to Pedro Markun, Isabel Malzoni, programadedados2014_01, José Casadei
Isabel, 

Pegando carona no que o Pedro disse, tente escrever com suas próprias palavras quais são os passos que o programa precisa seguir para resolver o problema. Por exemplo (o caractere # permite incluir comentários no código. Tudo digitado após o # é ignorado pelo interpretador):

#Atribuir valor a variavel "end"

#Atribuir valor zero a variavel de controle

#executar loop que rode um número "end" de vezes

#para cada vez que o loop rodar, somar o valor de "end" ao valor da variável de controle

#quando o loop terminar, imprimir o valor da variavel de controle

Lembrando que pra esse exercício, você pode descartar a primeira linha, que define um valor à variável "end". Você vai usá-la em seus testes, pra ver se o código está correto.

Essa forma de estruturar o problema em passos antes de escrever o código é uma prática conhecida como pseudo-código. Ele tira o peso de pensar em linguagem de programação e facilita o fluxo de criatividade. É como se você estivesse falando com um amigo ou algo assim. Depois que você estruturar o problema dessa forma, você pode ir escrevendo a(s) linha(s) de código abaixo das instruções que você colocou!

Abração





Para obter mais opções, acesse https://groups.google.com/groups/opt_out.



--
Marco Túlio Pires :: journohacker :: @mtrpires

Isabel Malzoni

unread,
Feb 27, 2014, 1:50:13 PM2/27/14
to Marco Túlio Pires, Pedro Markun, programadedados2014_01, José Casadei
Obrigada Pedro e Marco Túlio,

Vou tentar mais uma vez seguindo as dicas de vocês!

Grata,
Isabel

Reply all
Reply to author
Forward
0 new messages