Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #59 da revista programar. Faz já o download aqui!

Astuto

Loops

Mensagens Recomendadas

Astuto    0
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...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Astuto    0
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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo    223
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?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Astuto    0
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

Editado por Astuto

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo    223
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.

  • Voto 1

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Astuto    0
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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo    223
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 ;)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Astuto    0
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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo    223
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 :)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Astuto    0
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?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
POB    0
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.

Editado por 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/

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Dr_Lion    5
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"

 

Editado por pwseo
syntax highlight

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.