Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Astuto

Loops

Recommended Posts

Astuto

Boas,

Comecei agora com python para iniciar na programação, então estava a experimentar um exemplo de app para gerar chaves de euromilhoes, no entanto não percebo no código porque um dos loops não funciona. Segue o código:

import random
def gerarChave(numchaves):
   numeros = 5
   estrelas = 2

   while numchaves > 0:
    while numeros > 0:
	    print ("Numeros da Sorte: %s" % random.randint(1,50))
	    numeros -= 1
    while estrelas > 0:
	    print ("Estrelas da sorte: %s" %random.randint(1, 9))
	    estrelas -= 1
    numchaves -= 1

numchaves = input('Introduzir o numero de chaves a jogar: \n')
print ('\n')
print ('Este e o sorteio da sorte com: %s chaves\n') % numchaves
gerarChave(numchaves)

O 1º loop que deve repetir o numero de chaves escolhido pelo user não está a funcionar, gera a primeira e não faz as seguintes...

Share this post


Link to post
Share on other sites
Astuto

Antecipei-me e resolvi desta forma para quem tiver interesse :P

import random
def gerar():
   numeros = 5
   estrelas = 2
   while numeros > 0:
    print ("Numeros da Sorte: %s" % random.randint(1,50))
    numeros -= 1
   while estrelas > 0:
    print ("Estrelas da sorte: %s" %random.randint(1, 9))
    estrelas -= 1
numchaves = input('Introduzir o numero de chaves a jogar: \n')
print ('\n')
while numchaves > 0:
   print ('Chave Num. %s\n' % numchaves)
   gerar()
   print ('\n')
   numchaves -= 1

Share this post


Link to post
Share on other sites
pwseo

Astuto,

O teu problema deve-se ao facto de que após a primeira iteração do loop externo, tanto numeros como estrelas terao o valor zero. A solução seria definir o seu valor logo na entrada da iteração, em vez de ser no início da função.

Outra coisa: há formas mais «pythónicas» de resolver este problema, estás interessado em saber?

Share this post


Link to post
Share on other sites
Astuto

Claro que sim estou sempre disposto a aprender e aceitar todas as criticas possíveis :P até que este tipo de app tem um prob, se gera umeros aleatorios pode gerar dois numeros iguais na mesma chave xD

Última versão:

import random
def gerar():
   numeros = random.sample(xrange(1, 50), 5)
   estrelas = random.sample(xrange(1, 9), 2)
   for i in numeros:
    print "Numero da sorte: %s" % i
    if i == i:
	    i = random.randint(1, 50)
   for x in estrelas:
    print "Estrelas da sorte: %s" % x
    if x == x:
	    x = random.randint(1, 9)
numchaves = input('Introduzir o numero de chaves a jogar: \n')
print ('\n')
while numchaves > 0:
   print ('Chave Num. %s\n' % numchaves)
   gerar()
   print ('\n')
   numchaves -= 1

Edited by Astuto

Share this post


Link to post
Share on other sites
pwseo

Claro que sim estou sempre disposto a aprender e aceitar todas as criticas possíveis :P

Óptimo! Vou já descarregar uma lista de observações :P

Mas para já comecemos com:

até que este tipo de app tem um prob, se gera umeros aleatorios pode gerar dois numeros iguais na mesma chave xD

Isso seria verdade se não estivesses a utilizar a função random.sample(); esta função devolve elementos aleatórios de uma lista sem repetição (a menos que a própria lista original contenha repetições).

Podes, no entanto, gerar duas chaves repetidas (mas sem números ou estrelas repetidas na mesma chave), embora tenhamos que admitir que isso seja raro.

E agora as restantes observações:

  • Estás a utilizar Python 2 por algum motivo em especial? Python 3 é geralmente a melhor escolha para quem está a começar
  • Por motivos estéticos (e uma vez que este é um programa pequeno) podes importar sample() e randint() directamente para o namespace principal, para que os possas usar directamente sem o prefixo random.:
    from random import sample, randint
    ...
    def gerar():
       numeros = sample(xrange(1, 50), 5)
       ...
    


  • Embora xrange() seja de facto mais eficiente que range() no Python 2, no teu caso isso é irrelevante porque estás a lidar com poucas listas de pouquíssimos elementos; muda isso para range() pois assim funciona também em Python 3.
  • Outro pormenor sobre range()/xrange(): a lista gerada vai de A até B-1, pelo que xrange(1, 50) é o mesmo que [1..49] -- o que significa que as tuas chaves nunca vão ter o número 50 nem a estrela 9:
    numeros = sample(range(1, 50+1), 5)
    


  • Hoje em dia o Euromilhões tem 11 estrelas (e não 9):
    estrelas = sample(range(1, 11+1), 2)
    


  • Tens que me explicar qual a função dos seguintes loops, especialmente a parte da condição i == i:
    for i in numeros:
       print "Numero da sorte: %s" % i
       if i == i:
           i = random.randint(1, 50)
    for x in estrelas:
       print "Estrelas da sorte: %s" % x
       if x == x:
           x = random.randint(1, 9)
    


  • Podes utilizar print() ou print('') em vez de seres tão literal com print('\n')
  • O teu ciclo principal é complicado e cheira demasiado a C. E que tal utilizares um loop for?
    for n in range(numchaves):
       ...
    


  • A tua função gerar() não deveria ter nenhum print(), mas sim um único return, através do qual devolveria a chave sob a forma de uma string ou uma lista de números e estrelas.

Para já penso que é tudo.

  • Vote 1

Share this post


Link to post
Share on other sites
Astuto

Boas pwseo,

Tas em grande haha....então melhor no promenor das estrelas que eu já nem sabia que eram 11 :P

No que leva ao motivo da versão do python foi mesmo ao acaso de procura no google alguns codigos...

a ideia do loop i ==i era caso de existir um random igual a outro na mesma lista, gerar novamente uma chave :P

Mas gostei da informação :) obrigado pelas dicas, eu apenas tenho uma semana de python e não souprogramador de nada sei um pouco de varias linguagens mas queria fixar uma...e então escolhi python.

Share this post


Link to post
Share on other sites
pwseo

Tas em grande haha....então melhor no promenor das estrelas que eu já nem sabia que eram 11 :P

Por mero acaso a minha namorada estava a preencher um ao meu lado e reparei que tinha 11 estrelas. Também não sabia (como não jogo).

a ideia do loop i ==i era caso de existir um random igual a outro na mesma lista, gerar novamente uma chave :P

Mas repara, i == i é sempre verdade em qualquer contexto, pelo que deixa de ser uma condição -- vai acontecer sempre. E o código que se segue, apesar de ser sempre executado, não tem efeito, isto porque i é uma variável temporária que só existe dentro do ciclo. Mesmo que lhe atribuas um valor aleatório, mal passes à iteração seguinte o valor anterior é descartado.

e então escolhi python.

Escolheste muito bem. Só falta usares a versão 3 em vez da 2 ;)

Share this post


Link to post
Share on other sites
Astuto

É bom ter pessoas com boa vontade de explicar, acredita que não é fácil nem toda a gente tem esse dom e quando é situações tipo o meu caso q acorda e hj quero aprender a programar e pego em python que no meu grupo de colegas nenhum programa em python não se torna tão fácil...para incentivar comprei um livro não sei se conheces. 

PROGRAMAÇÃO EM PYTHON. INTRODUÇÃO À PROGRAMAÇÃO UTILIZANDO MÚLTIPLOS PARADIGMAS

AUTOR:  JOÃO PAVÃO MARTINS

 

Assim vou tentando seguir um caminho :P

Share this post


Link to post
Share on other sites
pwseo

Não conheço o livro porque não cheguei a ler nenhum sobre Python, mas pelo título até pode ser que seja bom, uma vez que fala em múltiplos paradigmas de programação e isso é importante para teres uma ideia mais abrangente (e agnóstica em termos de linguagem) da programação. Quando à disponibilidade e vontade de explicar, pelo menos da minha parte, estás à vontade; não tenho problema em ajudar quem tem de facto vontade de aprender.

Naquilo que eu souber e conseguir ajudar, podes sempre perguntar sem problema. De certeza que há mais pessoas aqui no fórum dispostas a fazer o mesmo :)

Share this post


Link to post
Share on other sites
Astuto

De uma maneira básica qual é o objectivo de se usar classes quando as funções são praticamente a mesma coisa...ou estou errado?

Share this post


Link to post
Share on other sites
POB

Boas,

 

Classes é algo completamente diferente de funções. Uma coisa não tem mesmo nada a haver com outra!

Falas em classes quando estas a utilizar o paradigma de programação orientada a objectos.  Uma classe é uma estrutura que abstrai um conjunto de objetos com características similares. Por exemplo a Class Pessoa, a pessoa tem um nome, uma idade, um genero, etc. 

 

Uma função é aquilo que tu estás a utilizar nos comentários anteriores.

Edited by thoga31
Remoção de conteúdo que originou SPAM/Publicidade

Porque programar é para todos, aprende já e com os conteúdos que mais gostas!

Sabe mais em https://www.facebook.com/ProgramarOBasico/

Share this post


Link to post
Share on other sites
Dr_Lion

Só uma dica, estás a programar à "lá C". Em python não se usa while, a menos que estejas á espera de um acontecimento com um tempo indefinido, por exemplo esperares que o utilizador pressione a tecla "X". em que estás a ler tecla a tecla e quando for X faz algo específico!

 

Para as tuas situações tanto de números como estrelas... (por acaso estes já corrigiste na versão seguinte) mas também para o número de chaves usa antes:
 

chaves = 2

for variavel in range(chaves):
    print "iteracao",variavel

print "este ciclo teve duas iteracoes"

 

Edited by pwseo
syntax highlight

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.