Astuto Posted August 12, 2016 at 10:01 AM Report #598106 Posted August 12, 2016 at 10:01 AM 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...
Astuto Posted August 12, 2016 at 11:10 AM Author Report #598109 Posted August 12, 2016 at 11:10 AM Antecipei-me e resolvi desta forma para quem tiver interesse 😛 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
pwseo Posted August 12, 2016 at 12:45 PM Report #598110 Posted August 12, 2016 at 12:45 PM 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?
Astuto Posted August 12, 2016 at 01:08 PM Author Report #598112 Posted August 12, 2016 at 01:08 PM (edited) Claro que sim estou sempre disposto a aprender e aceitar todas as criticas possíveis 😛 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 August 12, 2016 at 01:25 PM by Astuto
pwseo Posted August 12, 2016 at 03:21 PM Report #598120 Posted August 12, 2016 at 03:21 PM Claro que sim estou sempre disposto a aprender e aceitar todas as criticas possíveis 😛 Óptimo! Vou já descarregar uma lista de observações 😛 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. 1 Report
pwseo Posted August 12, 2016 at 03:37 PM Report #598121 Posted August 12, 2016 at 03:37 PM Aproveito para deixar uma solução com elementos mais avançados: http://ideone.com/021i43 (claro que chave() e chave_str() podiam ser a mesma função, mas eu quis separá-las de propósito)
Astuto Posted August 12, 2016 at 03:41 PM Author Report #598122 Posted August 12, 2016 at 03:41 PM Boas pwseo, Tas em grande haha....então melhor no promenor das estrelas que eu já nem sabia que eram 11 😛 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 😛 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.
pwseo Posted August 12, 2016 at 04:01 PM Report #598123 Posted August 12, 2016 at 04:01 PM Tas em grande haha....então melhor no promenor das estrelas que eu já nem sabia que eram 11 😛 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 😛 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 😉
Astuto Posted August 22, 2016 at 05:48 PM Author Report #598253 Posted August 22, 2016 at 05:48 PM É 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 😛
pwseo Posted August 22, 2016 at 08:16 PM Report #598259 Posted August 22, 2016 at 08:16 PM 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 🙂
Astuto Posted August 25, 2016 at 11:12 AM Author Report #598340 Posted August 25, 2016 at 11:12 AM 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?
POB Posted August 25, 2016 at 03:17 PM Report #598348 Posted August 25, 2016 at 03:17 PM (edited) 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 August 29, 2016 at 06:19 PM by thoga31 Remoção de conteúdo que originou SPAM/Publicidade
Dr_Lion Posted October 21, 2016 at 02:42 PM Report #599817 Posted October 21, 2016 at 02:42 PM (edited) 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 October 22, 2016 at 02:08 PM by pwseo syntax highlight
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now