associação pythonbrasil[11] django zope/plone planet Início Logado como (Entrar)

Diferenças para "GeradorDeCpf"

Diferenças entre as versões de 13 e 14
Revisão 13e 2004-03-09 20:28:33
Tamanho: 6189
Editor: FelipeLessa
Comentário: Melhorei a lógica baseado no codigo q alguem colocou e dividi em 80 colunas.
Revisão 14e 2004-07-07 16:21:39
Tamanho: 6207
Comentário:
Deleções são marcadas assim. Adições são marcadas assim.
Linha 4: Linha 4:
Programa para gerar números de CPF aleatoriamente. Escrito por ralobao ( Kandalf ) e com alterações de FelipeLessa. Programa para gerar números de CPF aleatoriamente. Escrito por ralobao (Kandalf) e com alterações de FelipeLessa.
Linha 34: Linha 34:

Linha 70: Linha 68:
    # Caso d1 seja maior que 10, o que não pode, ele deve ser igualado a 0     # Caso d1 seja maior que 10, o que não pode, ele deve ser
    #
igualado a 0
Linha 102: Linha 101:
    return "%d%d%d.%d%d%d.%d%d%d-%d%d" % (n1, n2, n3, n4, n5, n6, n7, n8, n9, d1, d2)     return "%d%d%d.%d%d%d.%d%d%d-%d%d" % \
           
(n1, n2, n3, n4, n5, n6, n7, n8, n9, d1, d2)
Linha 112: Linha 112:
    user_response = raw_input('Ativar debug (responda "sim", "yes", "1" ou "true" para ativar)? ')
    if user_response.lower().strip() in ("sim", "yes", "1", "true"):
    user_response = raw_input('Ativar debug (responda "sim" ativar)? ')
    if user_response.lower().strip() == "sim":
Linha 117: Linha 117:
        for i in xrange(int(raw_input('Quantos CPFs aleatórios devem ser gerados? '))):         n_cpfs = input('Quantos CPFs aleatórios devem ser gerados? '))
        for i in xrange(n_cpfs
):
Linha 137: Linha 138:
    s = reduce(lambda x, y: x + y, map(lambda x, y: x * y, n, range(10, 1, -1)))     s = reduce(lambda x, y: x + y, \
          
map(lambda x, y: x * y, n, range(10, 1, -1)))
Linha 144: Linha 146:
    s = reduce(lambda x, y: x + y, map(lambda x, y: x * y, n, range(11, 1, -1)))     s = reduce(lambda x, y: x + y, \
          
map(lambda x, y: x * y, n, range(11, 1, -1)))
Linha 154: Linha 157:
{{{
#!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)

{{{
#!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)

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

   1 # Exemplo de como usar
   2 import geradorcpf
   3 print geradorcpf.cpf()

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

Volta para CookBook.


Ruivaldo Neto, FelipeLessa (algumas alterações)