Só para dar uma sugestão de melhoria:
Para gerar nomes, você pode escolher 10 letras minúsculas aleatórias com random.choices
(a partir do Python 3.6), e title
para que a primeira letra fique maiúscula:
from random import choices
def gerar_nome():
return ''.join(map(chr, choices(range(97, 123), k=10))).title()
Claro que isso vai gerar “nomes” como “Bvfzwdjoac” ou “Lhqtrkdxhh”, e só usei chr
porque o exercício pede, pois eu acho que poderia usar as letras diretamente:
from random import choices
from string import ascii_lowercase # todas as letras minúsculas
def gerar_nome(tamanho=10): # tamanho configurável
return ''.join(choices(ascii_lowercase, k=tamanho)).title()
Se bem que, como o nome vai ser usado para construir o email, talvez seja melhor deixar tudo em minúsculas, e só usar title()
para inserir na lista de tuplas. Ou criar uma função que já retorna ambos:
def gerar_nome_email(tamanho=10):
nome = ''.join(choices(ascii_lowercase, k=tamanho))
# retorna uma tupla com o nome e email
return nome.title(), f'{nome}@xyz.com.br'
Para o dia e mês, basta usar randint
:
from random import randint
def gerar_dia_mes():
mes = randint(1, 12)
dias = 31
if mes in (4, 6, 9, 11):
dias = 30
elif mes == 2:
dias = 29 # não vai verificar ano bissexto
# retorna uma tupla com o dia e mês
return randint(1, dias), mes
Como não é pedido o ano, não estou verificando ano bissexto, então vou assumir que fevereiro pode ter 29 dias.
Assim, basta usar estas funções para preencher a lista com 100 pessoas:
from random import choices, randint
from string import ascii_lowercase
def gerar_nome_email(tamanho=10):
nome = ''.join(choices(ascii_lowercase, k=tamanho))
# retorna uma tupla com o nome e email
return nome.title(), f'{nome}@xyz.com.br'
def gerar_dia_mes():
mes = randint(1, 12)
dias = 31
if mes in (4, 6, 9, 11):
dias = 30
elif mes == 2:
dias = 29 # não vai verificar ano bissexto
# retorna uma tupla com o dia e mês
return randint(1, dias), mes
pessoas = []
for _ in range(100):
# como cada função retorna uma tupla, a "soma" delas é outra tupla
pessoas.append(gerar_nome_email() + gerar_dia_mes())
Ou, se quiser, use uma list comprehension, bem mais sucinta e pythônica:
pessoas = [ gerar_nome_email() + gerar_dia_mes() for _ in range(100) ]
E depois, pedimos para que o usuário digite o dia e mês, e verificamos quem faz aniversário:
dia_atual = int(input('dia atual: '))
mes_atual = int(input('mês atual: '))
print(f'Aniversariantes do dia {dia_atual:02}/{mes_atual:02}:')
for nome, email, dia, mes in pessoas:
if dia == dia_atual and mes == mes_atual:
print(nome)
Como pessoas
é uma lista de tuplas, no for
eu já posso criar variáveis que correspondem aos elementos de cada tupla (for nome, email, dia, mes ...
).
Repare também no uso de f-string para formatar os valores ({dia_atual:02}
já preenche com zero à esquerda caso necessário).
E vale lembrar que input
retorna uma string, por isso eu faço int(input(...))
para converter para número.
Mas isso não valida caso seja digitado algo inválido (se digitar por exemplo “xyz”, dá erro). O exercício não chegou a pedir, mas daria para fazer algo bem simples:
def ler_numero(mensagem, minimo, maximo):
while True:
try:
valor = int(input(mensagem))
if minimo <= valor <= maximo: # valor dentro da faixa, OK
return valor
else:
print(f'Valor deve ser entre {minimo} e {maximo}')
except ValueError:
print('você não digitou um número')
mes_atual = ler_numero('mês atual: ', 1, 12)
dias = 31
if mes_atual in (4, 6, 9, 11):
dias = 30
elif mes_atual == 2:
dias = 29 # não vai verificar ano bissexto
dia_atual = ler_numero('dia atual: ', 1, dias)
Por fim, a lógica para ver quantos dias tem no mês está repetida (é a mesma que fiz na função gerar_dia_mes
), então ela também poderia estar em uma função específica (fica como “exercício para o leitor” )