2° Desafio de projeto: Otimizando o Sistema Bancário com Funções Python - Explicação Passo a Passo
- #Python
Este artigo detalha a criação do sistema bancário simples em Python que utilizei no desafio 2 no bootcamp NTT DATA - Engenharia de Dados com Python. Se você é iniciante na programação, esta explicação irá guiá-lo por cada etapa do código, mostrando como as funções e estruturas de controle trabalham juntas para criar um programa funcional.
Introdução
O objetivo do código é simular operações bancárias básicas, como depósitos, saques, exibição de extratos, e a criação de novas contas e usuários. O sistema é interativo, pedindo ao usuário que escolha a operação desejada através de um menu.
Estrutura do Código
O código é dividido em várias funções, cada uma responsável por uma tarefa específica no sistema. Vamos entender cada uma dessas funções e como elas se conectam para formar o sistema completo.
1. A Função menu()
```python
import textwrap
def menu():
menu = """
----------------- MENU ------------------
[d] Depositar
[s] Sacar
[e] Extrato
[nc] Nova Conta
[lc] Lista Contas
[nu] Novo Usuário
[q] Sair
=> """
return input(textwrap.dedent(menu))
```
A função menu() exibe um conjunto de opções que o usuário pode escolher para realizar uma operação no sistema. A função usa textwrap.dedent() para remover qualquer indentação desnecessária, garantindo que o menu seja exibido corretamente na tela.
- Entrada: Não recebe nenhuma entrada específica.
- Saída: Retorna a escolha do usuário, que será usada para determinar a próxima ação.
2. A Função depositar()
```python
def depositar(saldo, valor, extrato, /):
if valor > 0:
saldo += valor
extrato += f"Depósito: R$ {valor:.2f}\n"
print("\n Depósito Realizado. ")
else:
print("\n Operação Inválida. ")
return saldo, extrato
```
A função depositar() é responsável por adicionar um valor ao saldo da conta do usuário. Ela verifica se o valor do depósito é positivo e, em caso afirmativo, atualiza o saldo e o extrato.
- Entrada: saldo (saldo atual), valor (quantia a ser depositada), extrato (histórico de transações).
- Saída: Retorna o saldo atualizado e o extrato com a nova transação registrada.
3. A Função sacar()
```python
def sacar(*, saldo, valor, extrato, limite, num_saques, limite_saques):
sem_saldo = valor > saldo
sem_limite = valor > limite
sem_saque = num_saques >= limite_saques
if sem_saldo:
print("\n Saldo Insuficiente. ")
elif sem_limite:
print("\n Sem Limite. ")
elif sem_saque:
print("\n Número de Saques Excedido. ")
elif valor > 0:
saldo -= valor
extrato += f"Saque: R$ {valor:.2f}\n"
num_saques += 1
print("\n Saque Realizado ")
else:
print("\n Operação Inválida ")
return saldo, extrato
```
A função sacar() permite ao usuário retirar dinheiro da conta, mas com algumas verificações importantes: se há saldo suficiente, se o valor do saque não excede o limite, e se o número de saques permitidos não foi ultrapassado.
- Entrada: saldo, valor, extrato, limite (valor máximo permitido por saque), num_saques (número de saques realizados), limite_saques (número máximo de saques permitidos).
- Saída: Retorna o saldo e o extrato atualizados após o saque.
4. A Função exibir_extrato()
```python
def exibir_extrato(saldo, *, extrato):
print("\n------------------------ EXTRATO ----------------------")
print("Não Foram Realizadas Movimentações." if not extrato else extrato)
print(f"\n Saldo: R$ {saldo:.2f}")
print("---------------------------------------------------------")
```
A função exibir_extrato() mostra todas as transações realizadas na conta e o saldo atual. Se não houver transações, uma mensagem informando que nenhuma movimentação foi realizada é exibida.
- Entrada: saldo, extrato.
- Saída: Exibe o extrato e o saldo na tela.
5. A Função novo_usuario()
```python
def novo_usuario(usuarios):
cpf = input("CPF (22222222222): ")
usuario = filtrar_usuario(cpf, usuarios)
if usuario:
print("\n Usuário já cadastrado ")
return
nome = input("Nome Completo: ")
data_nascimento = input("Digite a data de nascimento: (dd-mm-aaaa): ")
endereco = input("Digite o Endereco")
bairro = input("Digite o Bairro: ")
cidade = input("Digite a Cidade: ")
uf = input("Digite o Estado: ")
usuarios.append({"nome": nome, "data_nascimento": data_nascimento, "cpf": cpf, "endereco": endereco, "bairro": bairro, "cidade": cidade, "estado": uf})
print("\n Usuário Cadastrado com Sucesso ")
```
A função novo_usuario() permite que novos usuários sejam cadastrados no sistema. Ela coleta informações como CPF, nome, data de nascimento e endereço.
- Entrada: usuarios (lista de usuários já cadastrados).
- Saída: Atualiza a lista de usuários com o novo registro.
6. A Função filtrar_usuario()
```python
def filtrar_usuario(cpf, usuarios):
usuarios_filtrados = [usuario for usuario in usuarios if usuario['cpf'] == cpf]
return usuarios_filtrados[0] if usuarios_filtrados else None
```
A função filtrar_usuario() busca um usuário na lista de usuários com base no CPF fornecido. Se o usuário existir, ele é retornado.
- Entrada: cpf, usuarios.
- Saída: Retorna o usuário encontrado ou None se o usuário não existir.
7. A Função criar_conta()
```python
def criar_conta(agencia, numero_conta, usuarios):
cpf = input("CPF: ")
usuario = filtrar_usuario(cpf, usuarios)
if usuario:
print("\n Conta criada com sucesso! ")
return {"agencia": agencia, "num_conta": numero_conta, "usuario": usuario}
print("\n Usuário não encontrado. ")
```
A função criar_conta() cria uma nova conta associada a um usuário existente. Cada conta tem um número único e está vinculada ao usuário através do CPF.
- Entrada: agencia, numero_conta, usuarios.
- Saída: Retorna um dicionário com as informações da nova conta, ou None se o usuário não for encontrado.
8. A Função list_contas()
```python
def list_contas(contas):
for conta in contas:
linha = f"""
Agência: {conta['agencia']}
Conta: {conta['num_conta']}
Titular: {conta['usuario']['nome']}
"""
print("=" * 100)
print(textwrap.dedent(linha))
```
A função list_contas() exibe todas as contas existentes no sistema, mostrando detalhes como a agência, número da conta e nome do titular.
- Entrada: contas.
- Saída: Exibe as informações de cada conta na tela.
9. A Função Principal main()
```python
def main():
LIM_SAQUES = 3
AGENCIA = "0001"
saldo = 0
limite = 500
extrato = ""
num_saques = 0
usuarios = []
contas = []
while True:
opcao = menu()
if opcao == "d":
valor = float(input("Informe o valor do depósito: "))
saldo, extrato = depositar(saldo, valor, extrato)
elif opcao == "s":
valor = float(input("Informe o valor do saque: "))
saldo, extrato = sacar(
saldo=saldo,
valor=valor,
extrato=extrato,
limite=limite,
num_saques=num_saques,
limite_saques=LIM_SAQUES,
)
elif opcao == "e":
exibir_extrato(saldo, extrato=extrato)
elif opcao == "nu":
novo_usuario(usuarios)
elif opcao == "nc":
numero_conta = len(contas) + 1
conta = criar_conta(AGENCIA, numero_conta, usuarios)
if conta:
contas.append(conta)
elif opcao == "lc":
list_contas(contas)
elif opcao == "q":
break
else:
print("Operação inválida.")
```
A função main() é o núcleo do programa. Ela define variáveis importantes, como o limite de saques e o saldo inicial, e controla o fluxo do programa
através de um loop while True. A cada iteração, o programa exibe o menu e executa a função correspondente à escolha do usuário.
- Entrada: Nenhuma entrada externa direta, mas depende das escolhas do usuário no menu.
- Saída: Controla todo o fluxo do programa.
Conclusão
Este código, apesar de simples, oferece uma base sólida para entender conceitos importantes de programação como funções, controle de fluxo, e manipulação de listas e strings em Python. Com o entendimento deste código, pude expandir minhas habilidades e criar programas ainda mais complexos e úteis.