Calcula a idade da pessoa em dias

Publicado por David Wilian Oliveira de Sousa (última atualização em 26/10/2011)

[ Hits: 16.819 ]

Homepage: http://respostasaoateismo.blogspot.com

Download idadeemdias.py




Esse programa é uma versão melhorada do script: http://www.vivaolinux.com.br/script/Calcula-quantos-dias-uma-pessoa-viveu/

Só que eu incluí várias verificações de data, deu pra brincar bastante com IFs e também com dicionários e com o módulo datetime.

  



Esconder código-fonte

# !/usr/bin/python
# Encoding: UTF-8
# Calcula quantos dias de vida uma pessoa teve dado o dia, mes e ano de seu nascimento.
# Autor: David Wilian Oliveira de Sousa - adaptado de Ewerton Tiago de Azevedo
# Data: 26-10-2011

#configurações iniciais
import datetime

hoje=datetime.date.today()

anoAtual= hoje.strftime("%Y")

meses = { 'janeiro' : 1 , 'fevereiro' : 2 , 'marco' : 3 , 'abril' : 4 , 'maio' : 5 , 'junho' : 6 , 'julho' : 7 , 'agosto' : 8 , 'setembro' : 9 , 'outubro' : 10 , 'novembro' : 11 , 'dezembro' : 12 }
meses1 = {  1 : 'janeiro' , 2 : 'fevereiro' , 3 : 'marco', 4 : 'abril' , 5 : 'maio' , 6 : 'junho', 7 : 'julho', 8 : 'agosto' , 9 : 'setembro' , 10 : 'outubro' , 11 : 'novembro' , 12 : 'dezembro' }

bissexto = False

#dados forncecidos

coletandodados = True

while coletandodados == True:
    dia= input("Digite o dia do seu nascimento \nExemplo: 31 \n" )

    mes= input("\n Digite o mes do seu nascimento (numero ou por extenso entre aspas)\nExemplos: 12 , 'agosto', 'marco'")
    print type(mes)
# #Testa se o mês existe
    if type(mes) is str:
        if meses.has_key(mes) == True:
            print mes in meses
            mes= meses[mes]
            print mes
        elif mes in meses == False:
            print "nome de mes invalido. Tente novamente."
            continue
# #Testa se o dia é compatível com o mês
    if type(mes) is int:
        if mes == 1 or mes == 3 or mes == 5 or mes == 7 or mes == 8 or mes == 10 or mes ==12:
            if dia > 31:
                print "Esse mes possui somente 31 dias."
                continue
        if mes == 4 or mes == 6 or mes == 9 or mes == 11:
            if dia > 30:
                print "Esse mes possui somente 30 dias."
                continue
        if mes == 2:
            if dia == 29:
                bissexto = True
                print "Sera verificado se o ano e bissexto"
            elif dia > 29:
                print "Fevereiro tem no maximo 29 dias!"
                continue

    ano=input("\n Digite o ano do seu nascimento (a partir de 1583) \n Exemplo: 1990 \n ")
    if ano < 1583:
        print "Nao e possivel calcular para antes de 1583, o calendario que usamos hoje nao existia."
        continue

# #Verifica se o ano é bissexto
    if bissexto == True:
        if ano % 100 == 0:
            if ano % 400 != 0:
                print "Esse ano nao e bissexto, portanto nao possui 29 de fevereiro."
                continue
        elif ano % 100 != 0:
            if ano % 4 != 0:
                print "Esse ano nao e bissexto, portanto nao possui 29 de fevereiro."
                continue

        print "Esse ano e bissexto."

#Verifica se a pessoa "nasceu no futuro":
    if ano > anoAtual:
        print "Voce nasceu no futuro?"
        continue

    print "Sua data de nascimento e: ", dia, "de", meses1[mes], "de", ano,  "\n"
    confirma = raw_input("Confirma sua data de nascimento (s/n)? ")
    if confirma == 's':
        coletandodados = False

# Cálculos
# fica bem facil usando o modulo datetime

niver = datetime.date(ano, mes, dia)

idadeemdias = hoje - niver

print "Sua idade em dias e ", idadeemdias.days, "dias."

Scripts recomendados

Parar de Fumar

Herança em Python

Passgen

Bandwidth plugin para xchat

Script para Away com varias funções para xchat.


  

Comentários
[1] Comentário enviado por chroda em 27/10/2011 - 09:05h

cara, sou novato em python, mas tenho uma dúvida, qual a diferença entre usar raw_input e input??
outra coisa, vi que vc importou uma lib (datetime), como faz para saber seus métodos? existe algum jeito de 'olhar' dentro da lib para saber os métodos?

[2] Comentário enviado por david.sousarj em 27/10/2011 - 09:19h

No Python 2.7, a função input sereve para um valor de entrada numérico e raw_input serve para entradas de texto (strings). Entretanto, a input aceita entradas de texto se você digitar entre aspas. Foi isso que eu fiz no meu programa, como eu queria que o usuário entrasse número ou texto, pedi pra que ele digitasse o texto entre aspas. No python 3.2, o "raw_input" virou "input", e para usar a função que era "input" no original você deve usar uma combinação de funções, como eval(input()), int(input()) ou float(input()).

Para saber os métodos de um módulo, não sei se existe um jeito de fazer por comandos, mas qualquer coisa é só você olhar a documentação na internet. Geralmente é em inglês, mas tem muito material de consulta disponível. Por exemplo, para a datetime: http://docs.python.org/library/datetime.html

[3] Comentário enviado por chroda em 27/10/2011 - 09:57h

opa, obrigado pela resposta rápida, vou dar uma olhada na documentação.

[4] Comentário enviado por david.sousarj em 28/10/2011 - 13:05h

Ei rapaz, eu estava estudando um pouco hoje e descobri uma função que faz o que você queria. É a função dir(). Nesse caso, por exemplo, você pode digitar dir(datetime) ou dir(datetime.date) no interpretador python para descobrir os métodos e atributos presentes nessa lib. Mas eu não sei se tem como descobrir o que elas fazem...

Existe também a função help(), mas acho que ela serve mais para classes (estou começando a estudar classes agora).

Abraços

[5] Comentário enviado por chroda em 01/11/2011 - 17:24h

Olá David,

segui sua sugestão eis os testes rápidos no terminal..


>>> dir(datetime)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'datetime' is not defined
>>> dir(_datetime_)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name '_datetime_' is not defined
>>> dir('datetime')
['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_formatter_field_name_split', '_formatter_parser', 'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
>>> help()

Welcome to Python 2.7! This is the online help utility.

If this is your first time using Python, you should definitely check out
the tutorial on the Internet at http://docs.python.org/tutorial/.

Enter the name of any module, keyword, or topic to get help on writing
Python programs and using Python modules. To quit this help utility and
return to the interpreter, just type "quit".

To get a list of available modules, keywords, or topics, type "modules",
"keywords", or "topics". Each module also comes with a one-line summary
of what it does; to list the modules whose summaries contain a given word
such as "spam", type "modules spam".

help> quit

You are now leaving help and returning to the Python interpreter.
If you want to ask for help on a particular object directly from the
interpreter, you can type "help(object)". Executing "help('string')"
has the same effect as typing a particular string at the help> prompt.
>>> help(datetime)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'datetime' is not defined

hoje vou começar um livro de python, se eu achar algo assim, comento aqui.

[6] Comentário enviado por david.sousarj em 01/11/2011 - 18:10h

Eu acho que tem que fazer "import datetime" antes de usar dir() ou help().

[7] Comentário enviado por chroda em 02/11/2011 - 10:49h

Hehehe, bem coisa de novato esquecer de importar a lib e sair testando, obtive melhores resultados agora, valeeu!


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts