2316
Comentário:
|
7752
|
Deleções são marcadas assim. | Adições são marcadas assim. |
Linha 4: | Linha 4: |
Programa para gerar CPF. Escrito por ralobao ( Kandalf ). | Programa para gerar números de CPF aleatoriamente. Escrito por ralobao (Kandalf) e com alterações de FelipeLessa. |
Linha 10: | Linha 10: |
#!/usr/bin/env python | |
Linha 13: | Linha 14: |
def gera_random(n): """ Funcao para gerar um inteiro randomico entre 0 e 9 """ return random.randint(1,9) |
# Mude para True para incluir debug DEBUG = False def debug(*string): """ Imprime para stderr (simples). """ # Eu sei que imports dentro de funcoes eh feio, # mas eh para tirar a carga do import no caso de eu nao querer debug import sys print >> sys.stderr, string def gera_random(): """ Funcao para gerar um inteiro aleatório entre 0 e n """ return random.randint(0, 9) |
Linha 25: | Linha 37: |
Linha 27: | Linha 39: |
n = 9 n1 = gera_random(n) n2 = gera_random(n) n3 = gera_random(n) n4 = gera_random(n) n5 = gera_random(n) n6 = gera_random(n) n7 = gera_random(n) n8 = gera_random(n) n9 = gera_random(n) |
n1 = gera_random() n2 = gera_random() n3 = gera_random() n4 = gera_random() n5 = gera_random() n6 = gera_random() n7 = gera_random() n8 = gera_random() n9 = gera_random() |
Linha 39: | Linha 50: |
#print n1,n2,n3,n4,n5,n6,n7,n8,n9 # Contas e mais contas, dividir pra fica mais bonitinho |
DEBUG and debug(n1, n2, n3, n4, n5, n6, n7, n8, n9) # Contas e mais contas, dividi pra fica mais bonitinho |
Linha 45: | Linha 56: |
a4 = n6 * 5 | a4 = n6 * 5 |
Linha 51: | Linha 62: |
Linha 56: | Linha 67: |
# Caso d1 for maior que 10, o que nao pode ele sera igualado a 0 if d1>=10: |
# Caso d1 seja maior que 10, o que não pode, ele deve ser # igualado a 0 if d1 >= 10: |
Linha 60: | Linha 72: |
Linha 62: | Linha 74: |
#print n1,n2,n3,n4,n5,n6,n7,n8,n9 |
DEBUG and debug(a1, a2, a3, a4, a5, a6, a7, a8, a9, d1) |
Linha 75: | Linha 87: |
Linha 79: | Linha 91: |
Linha 83: | Linha 95: |
Linha 85: | Linha 97: |
#print n1,n2,n3,n4,n5,n6,n7,n8,n9 # o esperado print final ... que magavilha return "%d%d%d%s%d%d%d%s%d%d%d%s%d%d" % (n1,n2,n3,'.',n4,n5,n6,'.',n7,n8,n9,'-',d1,d2) print cpf() |
DEBUG and debug(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, d2) # o esperado print final ... que maravilha return "%d%d%d.%d%d%d.%d%d%d-%d%d" % \ (n1, n2, n3, n4, n5, n6, n7, n8, n9, d1, d2) if __name__ == '__main__': # Temos os holofotes em nós, somos a atração principal! message = "Bem-vindo ao Gerador de CPFs" print '\t%s\n' % message, '\t%s\n' % ('=' * len(message)) user_response = raw_input('Ativar debug (responda "sim" ativar)? ') if user_response.lower().strip() == "sim": DEBUG = True try: n_cpfs = input('Quantos CPFs aleatórios devem ser gerados? ')) for i in xrange(n_cpfs): print cpf() if DEBUG: # Deixa o visual mais limpo except ValueError, x: print 'Valor inválido ("%s")' % x }}} ''Legal! Achei um jeito de treinar o uso de programação funcional em Python :) O código abaixo faz o mesmo que o acima, só que é menos legível/entendível/didático que o feito pelo Ruivaldo e pelo Lessa. Eu fiz ele porque precisava de um exemplo prático de onde é útil usar programação as funções map/reduce/filter/zip. Pra quem tiver interesse nessas funções eu recomendo uma olhada no PythonFuncional. -- OsvaldoSantanaNeto'' {{{ #!python def cpf_funcional(): n = [] for i in xrange(9): n.append(random.randint(0, 9)) # calcula digito 1 e acrescenta ao numero s = reduce(lambda x, y: x + y, \ map(lambda x, y: x * y, n, range(10, 1, -1))) d1 = 11 - s % 11 if d1 >= 10: d1 = 0 n.append(d1) # calcula digito 2 e acrescenta ao numero s = reduce(lambda x, y: x + y, \ map(lambda x, y: x * y, n, range(11, 1, -1))) d2 = 11 - s % 11 if d2 >= 10: d2 = 0 n.append(d2) return "%d%d%d.%d%d%d.%d%d%d-%d%d" % tuple(n) }}} ''Que tal a versão '''obscura''' em uma linha? (tã-tã-tã-tã...) -- FelipeLessa'' {{{ #!python def cpf_obscuro(): n = [random.randint(0,9) for a in range(9) ];\ o=11-(reduce(int.__add__,map(int.__mul__,n,range(10+len(n)-9,1,\ -1)))%11);n+=[(o>=10 and[0]or[o])[0]];o=11-(reduce(int.__add__, \ map(int.__mul__,n,range(10+len(n)-9,1,-1)))%11);n+=[(o>=10 and[0]\ or[o])[0]];return"%d%d%d.%d%d%d.%d%d%d-%d%d"%tuple(n) }}} ''Ok, você venceu! :) Só espero não ser o programador que vai manter esse código depois hehe :) -- OsvaldoSantanaNeto'' == Código limpo == {{{ #!python import random def cpf(): def calcula_digito(digs): s = 0 qtd = len(digs) for i in xrange(qtd): s += n[i] * (1+qtd-i) res = 11 - s % 11 if res >= 10: return 0 return res n = [random.randint(0,9) for i in xrange(9)] n.append(calcula_digito(n)) n.append(calcula_digito(n)) return "%d%d%d.%d%d%d.%d%d%d-%d%d" % tuple(n) |
Linha 98: | Linha 194: |
import sys | |
Linha 102: | Linha 197: |
}}} ''Falta só alguém fazer um {{{unittest}}} entre este CookBook e o VerificadorDeCpf, esse aqui gerando um milhão de números e o outro checando. Hehehe. -- FelipeLessa'' '' Valeu Felipe! Abraços meu camagada. Só pra consta tu testou o codigo após suas alterações ? Tipo reeditei pra ficar mais original e parecido com o codigo javascript que eu "parseei" -- RaLobao '' == Que tal uma interface gráfica usando tanto o "Código" acima como o "Código limpo"? == {{{ #!python #Estou utilizando o gerador de tela Eagle (http://www.gustavobarbieri.com.br/eagle/) #Apenas para estudo, o que vale é programar... # Adicionar o módulo no início do programa, após tê-lo instalado, claro. from eagle import * ... #Após o def cpf(): criar mais uma: def teste( app, table ): table = app[ "table-cpf" ] c = app[ "qtd" ] del table[:] for i in xrange(1,c+1): table += (i, cpf()) table.columns_autosize() #Logo após criar a aplicação gráfica em si: App( title="Gerador de CPF's", top=( Button(id="button", label="Gerar CPF", callback=teste), UIntSpin(id="qtd", label="Quantos CPF's:", min=1, value=1, ), ), left=( Table( "table-cpf", "Lista de CPF's", types=( str, str ), headers=( "Ordem", "CPF" ), ) ) ) run() #Comentar ou apagar toda a parte do if __name__ == '__main__': para baixo #Ao criar o programa use a extensão .pyw para não aparecer a "tela preta" atrás dele. #No site há muitas informações sobre a API, inclusive a própria API bem detalhada. #Última observação: minha primeira participação. |
|
Linha 109: | Linha 254: |
Nome do autor da Receita | Ruivaldo Neto, FelipeLessa (algumas alterações) |
Receita: Gerador de CPF
Programa para gerar números de CPF aleatoriamente. Escrito por ralobao (Kandalf) e com alterações de FelipeLessa.
Código
1 #!/usr/bin/env python
2 import random
3 import math
4
5 # Mude para True para incluir debug
6 DEBUG = False
7
8 def debug(*string):
9 """ Imprime para stderr (simples). """
10
11 # Eu sei que imports dentro de funcoes eh feio,
12 # mas eh para tirar a carga do import no caso de eu nao querer debug
13 import sys
14
15 print >> sys.stderr, string
16
17 def gera_random():
18 """ Funcao para gerar um inteiro aleatório entre 0 e n """
19 return random.randint(0, 9)
20
21 def mod(dividendo,divisor):
22 """ Funcao pra retornar o resto da divisao de dois numeros """
23 x = dividendo - (math.floor(dividendo/divisor)*divisor)
24 return round(x)
25
26 def cpf():
27 """ Funcao pra gerar o bendito cpf """
28
29 # Gera os numeros randonomicos ;)
30 n1 = gera_random()
31 n2 = gera_random()
32 n3 = gera_random()
33 n4 = gera_random()
34 n5 = gera_random()
35 n6 = gera_random()
36 n7 = gera_random()
37 n8 = gera_random()
38 n9 = gera_random()
39
40 # debugger purposes ;)
41 DEBUG and debug(n1, n2, n3, n4, n5, n6, n7, n8, n9)
42
43 # Contas e mais contas, dividi pra fica mais bonitinho
44 a1 = n9 * 2
45 a2 = n8 * 3
46 a3 = n7 * 4
47 a4 = n6 * 5
48 a5 = n5 * 6
49 a6 = n4 * 7
50 a7 = n3 * 8
51 a8 = n2 * 9
52 a9 = n1 * 10
53
54 # Soma os resultados de todas as contas anteriores e faz
55 # outra continha.. tudo regra do cpf, para ele ser valido :P
56 d1 = a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9
57 d1 = 11 - (mod(d1,11))
58
59 # Caso d1 seja maior que 10, o que não pode, ele deve ser
60 # igualado a 0
61 if d1 >= 10:
62 d1 = 0
63
64 # debugger purposes
65 DEBUG and debug(a1, a2, a3, a4, a5, a6, a7, a8, a9, d1)
66
67 # Mesma coisa da de cima so que agora pra variavel d2
68 a1 = d1 * 2
69 a2 = n9 * 3
70 a3 = n8 * 4
71 a4 = n7 * 5
72 a5 = n6 * 6
73 a6 = n5 * 7
74 a7 = n4 * 8
75 a8 = n3 * 9
76 a9 = n2 * 10
77 a10 = n1 * 11
78
79 # ... rola a barra de rolagem pra cima que tu vai entender :P
80 d2 = a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9 + a10
81 d2 = 11 - (mod(d2,11))
82
83 # chega de repeticao de codigo :)
84 if d2 >= 10:
85 d2 = 0
86
87 # debugger purposes
88 DEBUG and debug(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, d2)
89
90
91 # o esperado print final ... que maravilha
92 return "%d%d%d.%d%d%d.%d%d%d-%d%d" % \
93 (n1, n2, n3, n4, n5, n6, n7, n8, n9, d1, d2)
94
95
96
97 if __name__ == '__main__':
98 # Temos os holofotes em nós, somos a atração principal!
99
100 message = "Bem-vindo ao Gerador de CPFs"
101 print '\t%s\n' % message, '\t%s\n' % ('=' * len(message))
102
103 user_response = raw_input('Ativar debug (responda "sim" ativar)? ')
104 if user_response.lower().strip() == "sim":
105 DEBUG = True
106
107 try:
108 n_cpfs = input('Quantos CPFs aleatórios devem ser gerados? '))
109 for i in xrange(n_cpfs):
110 print cpf()
111 if DEBUG:
112 # Deixa o visual mais limpo
113 print
114 except ValueError, x:
115 print 'Valor inválido ("%s")' % x
Legal! Achei um jeito de treinar o uso de programação funcional em Python O código abaixo faz o mesmo que o acima, só que é menos legível/entendível/didático que o feito pelo Ruivaldo e pelo Lessa. Eu fiz ele porque precisava de um exemplo prático de onde é útil usar programação as funções map/reduce/filter/zip. Pra quem tiver interesse nessas funções eu recomendo uma olhada no PythonFuncional. -- OsvaldoSantanaNeto
1 def cpf_funcional():
2
3 n = []
4 for i in xrange(9):
5 n.append(random.randint(0, 9))
6
7 # calcula digito 1 e acrescenta ao numero
8 s = reduce(lambda x, y: x + y, \
9 map(lambda x, y: x * y, n, range(10, 1, -1)))
10 d1 = 11 - s % 11
11 if d1 >= 10:
12 d1 = 0
13 n.append(d1)
14
15 # calcula digito 2 e acrescenta ao numero
16 s = reduce(lambda x, y: x + y, \
17 map(lambda x, y: x * y, n, range(11, 1, -1)))
18 d2 = 11 - s % 11
19 if d2 >= 10:
20 d2 = 0
21 n.append(d2)
22
23 return "%d%d%d.%d%d%d.%d%d%d-%d%d" % tuple(n)
Que tal a versão obscura em uma linha? (tã-tã-tã-tã...) -- FelipeLessa
1 def cpf_obscuro(): n = [random.randint(0,9) for a in range(9) ];\
2 o=11-(reduce(int.__add__,map(int.__mul__,n,range(10+len(n)-9,1,\
3 -1)))%11);n+=[(o>=10 and[0]or[o])[0]];o=11-(reduce(int.__add__, \
4 map(int.__mul__,n,range(10+len(n)-9,1,-1)))%11);n+=[(o>=10 and[0]\
5 or[o])[0]];return"%d%d%d.%d%d%d.%d%d%d-%d%d"%tuple(n)
Ok, você venceu! Só espero não ser o programador que vai manter esse código depois hehe -- OsvaldoSantanaNeto
Código limpo
1 import random
2
3 def cpf():
4 def calcula_digito(digs):
5 s = 0
6 qtd = len(digs)
7 for i in xrange(qtd):
8 s += n[i] * (1+qtd-i)
9 res = 11 - s % 11
10 if res >= 10: return 0
11 return res
12 n = [random.randint(0,9) for i in xrange(9)]
13 n.append(calcula_digito(n))
14 n.append(calcula_digito(n))
15 return "%d%d%d.%d%d%d.%d%d%d-%d%d" % tuple(n)
Exemplo de uso
Falta só alguém fazer um unittest entre este CookBook e o VerificadorDeCpf, esse aqui gerando um milhão de números e o outro checando. Hehehe. -- FelipeLessa
Valeu Felipe! Abraços meu camagada. Só pra consta tu testou o codigo após suas alterações ? Tipo reeditei pra ficar mais original e parecido com o codigo javascript que eu "parseei" -- RaLobao
Que tal uma interface gráfica usando tanto o "Código" acima como o "Código limpo"?
1 #Estou utilizando o gerador de tela Eagle (http://www.gustavobarbieri.com.br/eagle/)
2 #Apenas para estudo, o que vale é programar...
3
4 # Adicionar o módulo no início do programa, após tê-lo instalado, claro.
5 from eagle import *
6 ...
7
8 #Após o def cpf(): criar mais uma:
9 def teste( app, table ):
10 table = app[ "table-cpf" ]
11 c = app[ "qtd" ]
12 del table[:]
13 for i in xrange(1,c+1):
14 table += (i, cpf())
15 table.columns_autosize()
16
17 #Logo após criar a aplicação gráfica em si:
18 App(
19 title="Gerador de CPF's",
20 top=(
21 Button(id="button", label="Gerar CPF", callback=teste),
22 UIntSpin(id="qtd",
23 label="Quantos CPF's:",
24 min=1,
25 value=1,
26 ),
27 ),
28 left=(
29 Table( "table-cpf", "Lista de CPF's",
30 types=( str, str ),
31 headers=( "Ordem", "CPF" ),
32 )
33 )
34 )
35
36 run()
37
38 #Comentar ou apagar toda a parte do if __name__ == '__main__': para baixo
39 #Ao criar o programa use a extensão .pyw para não aparecer a "tela preta" atrás dele.
40 #No site há muitas informações sobre a API, inclusive a própria API bem detalhada.
41 #Última observação: minha primeira participação.
Volta para CookBook.
Ruivaldo Neto, FelipeLessa (algumas alterações)