Código em Python

163 views
Skip to first unread message

Diogenes

unread,
Feb 18, 2014, 7:23:43 AM2/18/14
to hackerspacesp
Fiquei de fazer um bolão aqui na empresa. Entao, escrevi esse  código para gerar os palpites.

Estou enviando, porque sei que muita gente, assim como eu,  está estudando Python. Por isso críticas e sugestões são bem vindas :)

Para gerar um jogo de 10 números execute:  ./sorteia.py 10

Segue o código:

#!/usr/bin/python
import sys, random

def getNumSena():
    num = "%d%d"%(random.randrange(0,6), random.randrange(0,10))
    if num == "00":
        num = "60"
    return num

def sorteiaQtd(qtd):
    lista=[]
    while (len(lista) < qtd):
        num = getNumSena()
        if not num in lista:
            lista.append(num)
    lista.sort()
    return lista

def main(argv):
    print sorteiaQtd(int(argv[0]))

if __name__ == "__main__":
    main(sys.argv[1:])

[]s



Clodonil Trigo

unread,
Feb 18, 2014, 7:54:14 AM2/18/14
to hacker...@googlegroups.com
Olá Diogenes,

Consegui estragar o seu código:

==========================
#!/usr/bin/python
import sys, random

class Milhao:
def __init__(self):
  self.lista=[]

def getNumSena(self):
  num = "%d%d"%(random.randrange(0,6), random.randrange(0,10))
  if num == "00":
num = "60"
  return num

def sorteiaQtd(self,qtd):
  while (len(self.lista) < qtd):
num = self.getNumSena()
if not num in self.lista:
self.lista.append(num)
  self.lista.sort()


def jogo(self,argv):
  self.sorteiaQtd(int(argv[0]))
           return self.lista


if __name__ == "__main__":
    s=Milhao()
    print "Jogo: "
    for n in s.jogo(sys.argv[1:]):
       sys.stdout.write("%s-" %(n))
    print "\n"

======================================


Crítica dos mestres....

Clodonil Trigo


--
.--. .- .-. .- .--. --- ... - .- .-. . ... -.-. .-. . ...- .- .--. .- .-. .- .... .- -.-. -.- . .-. ... .--. .- -.-. . ... .--. .- - --. --- --- --. .-.. . --. .-. --- ..- .--. ... -.. --- - -.-. --- --
Regras da Lista: http://garoa.net.br/wiki/Lista:LeiaAntesDeClicarNoSend
Para mais informações sobre o Garoa Hacker Clube acesse http://garoa.net.br
Maiores opções sobre o Google Groups, visite: http://groups.google.com/group/hackerspacesp
.--. .- .-. .- -- .- .. ... .. -. ..-. --- .-. -- .- . ... .- -.-. . ... ... . --- .-- .. -.- ..
Epoch 0 <=> Fundação: 1298244863 s ~ 2.408064*10^52 tP (tempos de Planck)
 

Diogenes

unread,
Feb 18, 2014, 9:29:44 AM2/18/14
to hackerspacesp
Clodonil,
Legal a saída ser uma string, mas esse traço depois do último número, dá a impressão de não estar completo


Luciano Ramalho

unread,
Feb 18, 2014, 10:08:24 AM2/18/14
to hacker...@googlegroups.com
Legal, Diógenes, grato por compartilhar!

O recomendado nas listas de Python é sempre colocar seu código no
pastebin [1], gist [2], bpaste [3] ou similar, e mandar apenas o link
para a lista. Assim o código fica corretamente indentado e também
colorizado, facilitando a leitura e a colaboração!

[1] http://pastebin.com/
[2] https://gist.github.com
[3] http://bpaste.net/

[ ]s
Luciano
Luciano Ramalho
Twitter: @ramalhoorg

Professor em: http://python.pro.br
Twitter: @pythonprobr

Marco Túlio Pires

unread,
Feb 18, 2014, 10:15:07 AM2/18/14
to hacker...@googlegroups.com
Tem muito tempo que não faço alguma coisa em python (não testei o código), mas acho que seguiria algo nessa linha: https://gist.github.com/anonymous/9072871
Marco Túlio Pires :: journohacker :: @mtrpires

Luciano Ramalho

unread,
Feb 18, 2014, 10:28:48 AM2/18/14
to hacker...@googlegroups.com
Oi, Marco, grato pela contribuição.

Porém seu código não está correto sintaticamente: existem problemas de
indentação (linhas 7 e 12, talvez outras também).

Dica para todo mundo que começa com Python: configure seu editor para que:

(1) a tecla TAB gere 4 espaços (e não um caracere \t);
(2) todos os \t sejam convertidos em espaços ao salvar o arquivo;

Nunca misture indentação com tabs e espaços em seu código. Python
aceita o caractere \t para indentar, porém este caractere pode ser
exibido com diferentes larguras conforme o editor, por isso a
recomendação é usar sempre 4 espaços.

O uso de indentação para delimitar blocos em Python é um pequeno
obstáculo inicial, mas uma vez superado o benefício é a grande
legibilidade de Python como um verdadeiro "pseudo código executável".

"""
Oddly enough, Python's use of whitespace stopped feeling unnatural
after about twenty minutes. I just indented code, pretty much as I
would have done in a C program anyway, and it worked.
"""
Eric Raymond, autor de A Catedral e o Bazar
http://www.linuxjournal.com/article/3882

[ ]s
Luciano

Marco Túlio Pires

unread,
Feb 18, 2014, 11:34:35 AM2/18/14
to hacker...@googlegroups.com
Ei Luciano, obrigado pelos comentários! Olha como ficou no meu editor de texto... será que ele está mal configurado?? Ou teria sido um problema na hora de dar o paste? Abraços!




calc.png

Sergio Augusto Vladisauskis

unread,
Feb 18, 2014, 11:36:11 AM2/18/14
to Garoa Hacker Clube
Provavelmente o parte aqui no email desconfigurou tudo, tente postar os próximos no paste.bin da vida...

--
Sergio Augusto Vladisauskis ☂
-> Oportunix IT Services Brasil - ME
-> Site: http://www.facebook.com/oportunix
-> Fone: +55 (11) 4221-8163
-> Móvel: +55 (11) 9-5308-7965 [Vivo]
-> Skype: oportunix
-> Registered Linux User: 305281

Marco Túlio Pires

unread,
Feb 18, 2014, 11:39:14 AM2/18/14
to hacker...@googlegroups.com
Se bem que no "def main()" os argumentos estão com dois tabs em vez de um :P

Diogenes

unread,
Feb 18, 2014, 11:56:21 AM2/18/14
to hackerspacesp
Luciano,
Agradeço as dicas.
Segue o link do pastebin: http://pastebin.com/w9iH14rm

Marco Túlio Pires

unread,
Feb 18, 2014, 12:02:43 PM2/18/14
to hacker...@googlegroups.com
Fiz algumas alterações, esse funciona (testei aqui: http://repl.it/languages/Python):

http://pastebin.com/eTCdDZnY

retorna uma lista com dez números aleatórios entre 0 e 99.

Eric Hideki

unread,
Feb 18, 2014, 12:21:17 PM2/18/14
to hacker...@googlegroups.com
No começo do ano passado criei um post falando sobre onde arranjar respostas para suas dúvidas sobre Python - http://ericstk.wordpress.com/2013/01/02/onde-encontrar-respostas-para-suas-duvidas-em-python/

Ele já está desatualizado(Internet é algo engraçado, o tempo de duração é muito curto), mas talvez dê ideias bacanas de onde arranjar suporte.

Felizmente o pessoal do Garoa tanto quanto o da Python Brasil são muito receptivos e bacanas.

Grande abraço!

DQ

unread,
Feb 18, 2014, 12:22:49 PM2/18/14
to hacker...@googlegroups.com
Não vai dar para eu escrever o código e testar agora (tenho que trabalhar um pouco!) mas eu pensei em uma forma diferente de fazer o sorteio, simulando o funcionamento real:
  • Preencha uma lista com os números de 1 a 60
  • Para cada número a sortear, gere um número aleatório de 0 até o comprimento atual da lista - 1, pegue o elemento correspondente (número sorteado) e tire ele da lista.
Se quiser, pode colocar os números sorteados em outra lista e ordená-la antes de imprimir.

DQ

kern

unread,
Feb 18, 2014, 12:47:51 PM2/18/14
to hacker...@googlegroups.com
DQ++

Eu também faria dessa forma.

Luciano Ramalho

unread,
Feb 18, 2014, 12:50:26 PM2/18/14
to hacker...@googlegroups.com
2014-02-18 14:22 GMT-03:00 DQ <d.qu...@yahoo.com>:
> Preencha uma lista com os números de 1 a 60
> Para cada número a sortear, gere um número aleatório de 0 até o comprimento
> atual da lista - 1, pegue o elemento correspondente (número sorteado) e tire
> ele da lista.
>
> Se quiser, pode colocar os números sorteados em outra lista e ordená-la
> antes de imprimir.

Acho legal a idéia do DQ.

Em meu curso Objetos Pythonicos eu apresento uma classe Tombola
(tômbola é um daqueles globos usados para sortear números em um bingo
ou rifa).

O código está no slide 50:
https://speakerdeck.com/ramalho/objetos-pythonicos-compacto-2013

Alguns slides antes eu discuto o conceito e a interface (API) de uma
tômbola. Claro que é um exemplo apenas didático, e fica um tanto
verboso como uma classe tentando simular ainda mais o funcionamento de
uma tômbola real. No caso, em vez de sortear um item da sequência, eu
embaralho a sequência no método *misturar* e em *sortear* eu sempre
retiro o último. É como se *misturar* acionasse a manivela da tômbola,
e *sortear* apenas liberasse a bola que já está no gargalo pronta para
sair.

O método list.pop também aceita uma posição, eu poderia omitir o
método *misturar* e implementar *sortear* desta maneira:

def sortear(self):
posicao = random.randrange(len(self.itens))
return self.itens.pop(posicao)

(não fiz um gist porque é um trecho bem curto de código)

[ ]s
Luciano

Danilo J. S. Bellini

unread,
Feb 25, 2014, 5:33:16 PM2/25/14
to hacker...@googlegroups.com
A ideia do DQ é bem parecida com o algoritmo do Shuffle (Fisher-Yates-Knuth). Há duas diferenças:

  1. O shuffle troca de posição uma sorteada com a "próxima" iterando por todas as posições (normalmente de trás para frente para ajudar com a geração de números aleatórios, já que isso ocorre uma vez para cada posição e o esta não poderá mais ser sorteada após definida).
  2. O resultado do shuffle seria uma lista embaralhada, ao invés de um gerador

Em termos de desempenho, o gerador terá a vantagem de ser lazy, parando o shuffle quando não há mais necessidade de novos valores, mas a versão discutida na lista tem a desvantagem de fazer remoções no meio de uma lista (o que não é lá algo tão eficiente como gostaríamos que fosse). Mas a segunda desvantagem é possível eliminar:

from random import randrange
def shuffled(iterable):
data = list(iterable)
for idx in range(len(data) - 1, -1, -1):
ridx = randrange(idx + 1)
if ridx != idx:
data[idx], data[ridx] = data[ridx], data[idx]
yield data[idx]

Dá para usar com a AudioLazy:

from audiolazy import Stream
random_elements = Stream(shuffled(range(30)))

E usar algumas coisas úteis, por exemplo:

>>> random_elements.take(10)
[17, 29, 23, 4, 28, 14, 11, 2, 10, 25]
>>> (2 ** random_elements).take(5)
[4096, 65536, 512, 8, 4194304]

Danilo J. S. Bellini
---------------
"It is not our business to set up prohibitions, but to arrive at conventions." (R. Carnap)

Leonardo Santagada

unread,
Feb 25, 2014, 5:55:38 PM2/25/14
to hacker...@googlegroups.com
Quando sorteios randomicos começam a envolver shuffle eu sempre gosto de postar o pedaço da documentação do python:

"
random.shuffle(x[, random])¶
Shuffle the sequence x in place. The optional argument random is a 0-argument function returning a random float in [0.0, 1.0); by default, this is the function random().

Note that for even rather small len(x), the total number of permutations of x is larger than the period of most random number generators; this implies that most permutations of a long sequence can never be generated.
"


Se eu lembro bem a small nesse contexto é se for mais de 100 elementos na lista... mas né, to só usando a minha memória bem falha.
Leonardo Santagada
Reply all
Reply to author
Forward
0 new messages