GithubHelp home page GithubHelp logo

trilha-python-dio's Introduction

Trilha Python DIO

trilha-python-dio's People

Contributors

falvojr avatar guicarvalho avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

trilha-python-dio's Issues

Entrega Desafio Bancário

menu = """

[d] Depositar
[s] Sacar
[e] Extrato
[q] Sair

-> """

saldo = 0
limite = 500
extrato = ""
numero_saques = 0
LIMITE_SAQUES = 3

while True:

opcao = input(menu)

if opcao == "d":
    valor = float(input("Informe o valor do depósito: "))

    if valor > 0:
        saldo += valor
        extrato += f"Depósito: R$ {valor:.2f}\n"

    else:
        print("Operação falhou! O valor informado é inválido.")
    
elif opcao == "s":
    valor = float(input("Informe o valor do saque: "))

    excedeu_saldo = valor > saldo

    excedeu_limite = valor > limite

    excedeu_saques = numero_saques >= LIMITE_SAQUES

    if excedeu_saldo:
        print("Operação falhou! Você não tem saldo suficiente.")

    elif excedeu_limite:
        print("Operação falhou! O valor do saque excede o limite.")

    elif excedeu_saques:
        print("Operação falhou! Números máximo de saques excedido.")

    elif valor > 0:
        saldo -= valor
        extrato += f"Saque: R$ {valor:.2f}\n"
        numero_saques += 1

    else:
        print("Operação falhou! Ovalor informado é inválido.")
    
elif opcao == "e":
    print("\n================ EXTRATO ================")
    print("Não foram realizadas movimentações." if not extrato else extrato)
    print(f"\nSaldo: R$ {saldo:.2f}")
    print("=========================================")

elif opcao == "q":
    break

else:
    print("Operação inválida, por favor selecionenovamente a operação desejada.")

Sistema Bancário Simples

menu = """

[d] Depositar
[s] Sacar
[e] Extrato
[q] Sair

=> """

saldo = 0
limite = 500
extrato = ""
numero_saques = 0
LIMITE_SAQUES = 3

while True:

opcao = input(menu)

if opcao == "d":
    valor = float(input("Informe o valor do depósito: "))

    if valor > 0:
        saldo += valor
        extrato += f"Depósito: R$ {valor:.2f}\n"

    else:
        print("Operação falhou! O valor informado é inválido.")

elif opcao == "s":
    valor = float(input("Informe o valor do saque: "))

    excedeu_saldo = valor > saldo

    excedeu_limite = valor > limite

    excedeu_saques = numero_saques >= LIMITE_SAQUES

    if excedeu_saldo:
        print("Operação falhou! Saldo suficiente.")

    elif excedeu_limite:
        print("Operação falhou! O valor do saque excede o limite.")

    elif excedeu_saques:
        print("Operação falhou! Número máximo de saques excedido.")

    elif valor > 0:
        saldo -= valor
        extrato += f"Saque: R$ {valor:.2f}\n"
        numero_saques += 1

    else:
        print("Operação falhou! O valor informado é inválido.")

elif opcao == "e":
    print("\n================ EXTRATO ================")
    print("Não foram realizadas movimentações." if not extrato else extrato)
    print(f"\nSaldo: R$ {saldo:.2f}")
    print("==========================================")

elif opcao == "q":
    break

else:
    print("Operação inválida, por favor selecione novamente a operação desejada.")

Desafio Sistema Bancário V1

menu = """

[d] Depositar
[s] Sacar
[e] Extrato
[q] Sair

=> """

saldo = 0
limite = 500
extrato = ""
numero_saques = 0
LIMITE_SAQUES = 3

while True:

opcao = input(menu)

if opcao == "d":
    valor = float(input("informe o valor do deposito: "))

    if valor > 0:
        saldo += valor
        extrato += f"Depósito: R$ {valor:.2f}\n"

    else:
        print("Operação falhou! O valor informado é inválido.")

elif opcao == "s":
    valor = float(input("informe o valor do saque: "))

    excedeu_saldo = valor > saldo

    excedeu_limite = valor > limite

    excedeu_saques = numero_saques >= LIMITE_SAQUES

    if excedeu_saldo:
        print("Operação falhou! Você não tem saldo suficiente. ")

    elif excedeu_limite:
        print("Operação falhou! O valor do saque excede o limite. ")

    elif excedeu_saques:
        print("Operação falhou! Numero maximo de saques excedidos. ")
        
    elif valor >0:
        saldo-= valor
        extrato += f"Saque: R$ {valor:.2f}\n"
        numero_saques += 1

    else:
        print("Operação falhou! O valor informado é inválido.")

elif opcao == "e":
    print("\n================EXTRATO================")
    print("Não foram realizadas movimentações." if not extrato else extrato)
    print(f"\nSaldo: R$ {saldo:.2f}")
    print("  =======================================")

elif opcao == "q":
    break

else:
    print("Operação inválida! Por vafor selecione novamente a opação desejada.")

Criando um Sistema Bancário com Python

menu = """

[1] Depositar
[2] Sacar
[3] Extrato
[0] Sair

=> """

saldo = 0
limite = 500
extrato = ""
numero_saques = 0
LIMITE_SAQUES = 3

while True:

opcao = input(menu)

if opcao == "1":
    valor = float(input("Informe o valor do depósito: "))

    if valor > 0:
        saldo += valor
        extrato += f"Depósito: R$ {valor:.2f}\n"

    else:
        print("Operação falhou! O valor informado é inválido.")

elif opcao == "2":
    valor = float(input("Informe o valor do saque: "))

    excedeu_saldo = valor > saldo

    excedeu_limite = valor > limite

    excedeu_saques = numero_saques >= LIMITE_SAQUES

    if excedeu_saldo:
        print("Operação falhou! Você não tem saldo suficiente.")

    elif excedeu_limite:
        print("Operação falhou! O valor do saque excede o limite.")

    elif excedeu_saques:
        print("Operação falhou! Número máximo de saques excedido.")

    elif valor > 0:
        saldo -= valor
        extrato += f"Saque: R$ {valor:.2f}\n"
        numero_saques += 1

    else:
        print("Operação falhou! O valor informado é inválido.")

elif opcao == "3":
    print("\n================ EXTRATO ================")
    print("Não foram realizadas movimentações." if not extrato else extrato)
    print(f"\nSaldo: R$ {saldo:.2f}")
    print("==========================================")

elif opcao == "0":
    break

else:
    print("Operação inválida, por favor selecione novamente a operação desejada.")

#Criando um sistema bancario

#Criando um sistema bancario
menu= """

[d] Deposito
[s] Sacar
[e] Extrato
[q] Sair
=>"""

saldo = 0
limite = 500
extrato=""
numero_saques=0
LIMITE_SAQUES=3

while True:
opcao = input (menu)

if opcao == "d":
valor = float(input("Qual valor voce deseja depositar? "))

if valor >0:
  saldo += valor
  extrato += f"Deposito no valor de R$ {valor:.2f}\n"

else:
  print("Valor informado é invalido")

elif opcao == "s":
valor = float(input("Qual o valor você deseja sacar? "))

    excedeu_saldo = valor>saldo
    excedeu_limite = valor>limite
    excedeu_saques = numero_saques >= LIMITE_SAQUES

    if excedeu_saldo:
      print("Saldo insuficiente. ")
    
    elif excedeu_limite:
      print("Limite de valor para saque diario atingido.")
    
    elif excedeu_saques:
      print("Limite de saques diarios atingidos.")
    
    elif valor > 0:
      saldo -=valor
      extrato += f"Saque no valor de R$ {valor:.2f}\n"
      numero_saques += 1

    else:
      print("Valor informado é invalido.")

elif opcao == "e":
print("\n----------------Extrato----------------")
print("Não ouve nemhuma movimentação." if not extrato else extrato)
print(f"Seu saldo é de R${saldo:.2f}")
print("--------------------------------------------")

elif opcao =="q":
break

else:
print("Operação nao realizada, opção inserida invalida")

Entrega de desafio

import textwrap

def menu():

menu = """\n

========== MENU ===========

[d]\tDepositar

[s]\tSacar

[e]\tExtrato

[nc]\tNova conta

[lc]\tListar contas

[nu]\tNovo usuário

[q] \tSair

=> """

return input(textwrap.dedent(menu))

def depositar(saldo, valor, extrato, /):

if valor > 0:

    saldo += valor

    extrato += f"Depósito:\tR${valor:.2f}\n"

    print("\n===Depósito realizado com sucesso!===")

else:

    print("\n@@@ Operação falhou, o valor informado é inválido.@@@")



return saldo, extrato

def sacar(*, saldo, valor, extrato, limite, numero_saques, limite_saques):

excedeu_saldo = valor > saldo

excedeu_limite = valor > limite

excedeu_saques = numero_saques >= limite_saques



if excedeu_saldo:

    print("\n@@@ Operação falhou! Você não tem saldo suficiente. @@@")



elif excedeu_limite:

    print("\n@@@ Operação falhou! O valor de saque excede o limite. @@@ ")



elif excedeu_saques:

    print("\n@@@ Operação falhou! Numero maximo de saques excedido. @@@")



elif valor > 0:

    saldo -= valor

    extrato += f"Saque:\t\tR$ {valor:.2f}\n"

    numero_saques += 1

    print("\n=== Saque realizado com sucesso! ===")



else:

    print("\n@@@ Operação falhou! Numero maximo de saques excedido. @@@")





return saldo, extrato

def exibir_extrato(saldo, /, *, extrato):

print("\n =================EXTRATO================")

print("Não foram realizadas movimentações. " if not extrato else extrato)

print(f"\nSaldo:\t\t R$ {saldo:.2f}")

print("================================")

def criar_usuario(usuarios):

cpf = input("Informe o CPF (somente número): ")

usuario = filtrar_usuario(cpf, usuarios)



if usuario:

    print("\n@@@ Já existe usuário com esse CPF! @@@")

    return



nome = input("Informe o nome completo: ")

data_nascimento = input("Informe a data de nascimento (dd-mm-aaaa): ")

endereco = input ("Informe o endereço (logradouro, nro - bairro - cidade/sigla)")



usuarios.append({"nome": nome, "data_nascimento": data_nascimento, "cpf": cpf, "endereco": endereco}) 



print("=== Usuario criado com sucesso! ===")

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

def criar_conta(agencia, numero_conta, usuarios):

cpf = input("Informe o CPF do usuário: ")

usuario = filtrar_usuario(cpf, usuarios)



if usuario:

    print("\n=== Conta criada com sucesso! ===")

    return {"agencia": agencia, "numero_conta": numero_conta, "usuario": usuario}



print("\@@@ Usuário não encontrado, fluxo de criação de conta encerrado! @@@")

def listar_contas(contas):

for conta in contas:

    linha = f"""\

        Agência:\t{conta['agencia']}

        C/C:\t\t{conta['numero_conta']}

        Titular:\t{conta['usuario']['nome']}

    """

    print("=" * 100)

    print(textwrap.dedent(linha))

def main():

LIMITE_SAQUES = 3

AGENCIA = "0001"



saldo = 0

limite = 500

extrato = ""

numero_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,

            numero_saques=numero_saques,

            limite_saques=LIMITE_SAQUES,

        )



    elif opcao == "e":

        exibir_extrato(saldo, extrato=extrato)



    elif opcao == "nu":

        criar_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":

        listar_contas(contas)



    elif opcao == "q":

        break



    else:



        print("Operação inválida, por favor selecione a opção desejada novamente.")            

main()

sistema bancário aprimorado!

from datetime import datetime, timedelta

class ContaBancaria:
def init(self, numero, titular, senha):
self.numero = numero
self.titular = titular
self.saldo = 0
self.limite_saque = 500
self.limite_transferencia = 1000
self.extrato = ""
self.numero_saques = 0
self.limite_saques = 3
self.limite_diario_saques = 1000
self.saques_dia = 0
self.historico_transacoes = []
self.senha = senha
self.ultimo_reset_diario = datetime.now()

def autenticar(self, senha):
    return self.senha == senha

def resetar_limites_diarios(self):
    agora = datetime.now()
    if agora - self.ultimo_reset_diario > timedelta(days=1):
        self.saques_dia = 0
        self.numero_saques = 0
        self.ultimo_reset_diario = agora

def registrar_transacao(self, tipo, valor):
    transacao = {
        "tipo": tipo,
        "valor": valor,
        "data": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    }
    self.historico_transacoes.append(transacao)

def depositar(self, valor):
    self.resetar_limites_diarios()
    if valor > 0:
        self.saldo += valor
        self.extrato += f"Depósito: R$ {valor:.2f}\n"
        self.registrar_transacao("Depósito", valor)
        return f"Depósito de {valor:.2f} concluído :)"
    else:
        return "Operação falhou :(. O valor informado é inválido."

def sacar(self, valor):
    self.resetar_limites_diarios()
    if valor <= 0:
        return "Operação falhou :(. O valor informado é inválido."
    elif valor > self.saldo:
        return "Operação falhou :(. Você não tem saldo suficiente."
    elif valor > self.limite_saque:
        return "Operação falhou :(. O valor do saque excede o limite."
    elif self.numero_saques >= self.limite_saques:
        return "Operação falhou :(. Número máximo de saques excedido."
    elif self.saques_dia + valor > self.limite_diario_saques:
        return "Operação falhou :(. Você excedeu o limite diário de saques."
    else:
        self.saldo -= valor
        self.extrato += f"Saque: R$ {valor:.2f}\n"
        self.numero_saques += 1
        self.saques_dia += valor
        self.registrar_transacao("Saque", valor)
        return f"Saque de {valor:.2f} realizado com sucesso."

def exibir_extrato(self):
    extrato = "\n        EXTRATO        \n"
    extrato += "Não foram realizadas movimentações." if not self.extrato else self.extrato
    extrato += f"\nSaldo: R$ {self.saldo:.2f}\n        "
    return extrato

def exibir_historico_transacoes(self):
    historico = "\n        HISTÓRICO DE TRANSAÇÕES        \n"
    if not self.historico_transacoes:
        historico += "Não foram realizadas transações."
    else:
        for transacao in self.historico_transacoes:
            historico += f"{transacao['data']} - {transacao['tipo']}: R$ {transacao['valor']:.2f}\n"
    historico += "        "
    return historico

def transferir(self, valor, conta_destino):
    self.resetar_limites_diarios()
    if valor <= 0:
        return "Operação falhou :(. O valor informado é inválido."
    elif valor > self.saldo:
        return "Operação falhou :(. Você não tem saldo suficiente."
    elif valor > self.limite_transferencia:
        return "Operação falhou :(. O valor da transferência excede o limite."
    else:
        self.saldo -= valor
        conta_destino.saldo += valor
        self.extrato += f"Transferência: R$ {valor:.2f} para conta {conta_destino.numero}\n"
        conta_destino.extrato += f"Transferência: R$ {valor:.2f} da conta {self.numero}\n"
        self.registrar_transacao("Transferência Enviada", valor)
        conta_destino.registrar_transacao("Transferência Recebida", valor)
        return f"Transferência de {valor:.2f} para conta {conta_destino.numero} realizada com sucesso."

Gerenciamento de contas

contas = {}

def criar_conta(numero, titular, senha):
if numero in contas:
return "Número de conta já existente. Tente outro número."
else:
contas[numero] = ContaBancaria(numero, titular, senha)
return f"Conta {numero} criada com sucesso para {titular}."

def selecionar_conta(numero, senha):
conta = contas.get(numero)
if conta and conta.autenticar(senha):
return conta
else:
return None

Menus

menu_principal = """
[c] Criar Conta
[s] Selecionar Conta
[S] Sair

"""

menu_conta = """
[d] Depositar
[s] Sacar
[e] Extrato
[h] Histórico de Transações
[t] Transferir
[S] Sair

"""

Loop principal do sistema

while True:
opcao = input(menu_principal)

if opcao == "c":
    numero = input("Informe o número da conta: ")
    titular = input("Informe o nome do titular: ")
    senha = input("Crie uma senha: ")
    print(criar_conta(numero, titular, senha))

elif opcao == "s":
    numero = input("Informe o número da conta: ")
    senha = input("Informe a senha: ")
    conta = selecionar_conta(numero, senha)
    if conta:
        while True:
            opcao_conta = input(menu_conta)

            if opcao_conta == "d":
                valor = float(input("Informe o valor do depósito: "))
                print(conta.depositar(valor))

            elif opcao_conta == "s":
                valor = float(input("Informe o valor do saque: "))
                print(conta.sacar(valor))

            elif opcao_conta == "e":
                print(conta.exibir_extrato())

            elif opcao_conta == "h":
                print(conta.exibir_historico_transacoes())

            elif opcao_conta == "t":
                valor = float(input("Informe o valor da transferência: "))
                numero_destino = input("Informe o número da conta destino: ")
                conta_destino = contas.get(numero_destino)
                if conta_destino:
                    print(conta.transferir(valor, conta_destino))
                else:
                    print("Conta destino não encontrada.")

            elif opcao_conta == "S":
                break

            else:
                print("Operação Inválida. Selecione a operação desejada.")

elif opcao == "S":
    break

else:
    print("Operação Inválida. Selecione a operação desejada.")

Desafio Modelando o Sistema Bancário em POO com Python

import textwrap
from abc import ABC, abstractclassmethod, abstractproperty
from datetime import datetime

class Cliente:
def init(self, endereco):
self.endereco = endereco
self.contas = []

def realizar_transacao(self, conta, transacao):
    transacao.registrar(conta)

def adicionar_conta(self, conta):
    self.contas.append(conta)

class PessoaFisica(Cliente):
def init(self, nome, data_nascimento, cpf, endereco):
super().init(endereco)
self.nome = nome
self.data_nascimento = data_nascimento
self.cpf = cpf

class Conta:
def init(self, numero, cliente):
self._saldo = 0
self._numero = numero
self._agencia = "0001"
self._cliente = cliente
self._historico = Historico()

@classmethod
def nova_conta(cls, cliente, numero):
    return cls(numero, cliente)

@property
def saldo(self):
    return self._saldo

@property
def numero(self):
    return self._numero

@property
def agencia(self):
    return self._agencia

@property
def cliente(self):
    return self._cliente

@property
def historico(self):
    return self._historico

def sacar(self, valor):
    saldo = self.saldo
    excedeu_saldo = valor > saldo

    if excedeu_saldo:
        print("\n@@@ Operação falhou! Você não tem saldo suficiente. @@@")

    elif valor > 0:
        self._saldo -= valor
        print("\n=== Saque realizado com sucesso! ===")
        return True

    else:
        print("\n@@@ Operação falhou! O valor informado é inválido. @@@")

    return False

def depositar(self, valor):
    if valor > 0:
        self._saldo += valor
        print("\n=== Depósito realizado com sucesso! ===")
    else:
        print("\n@@@ Operação falhou! O valor informado é inválido. @@@")
        return False

    return True

class ContaCorrente(Conta):
def init(self, numero, cliente, limite=500, limite_saques=3):
super().init(numero, cliente)
self._limite = limite
self._limite_saques = limite_saques

def sacar(self, valor):
    numero_saques = len(
        [transacao for transacao in self.historico.transacoes if transacao["tipo"] == Saque.__name__]
    )

    excedeu_limite = valor > self._limite
    excedeu_saques = numero_saques >= self._limite_saques

    if excedeu_limite:
        print("\n@@@ Operação falhou! O valor do saque excede o limite. @@@")

    elif excedeu_saques:
        print("\n@@@ Operação falhou! Número máximo de saques excedido. @@@")

    else:
        return super().sacar(valor)

    return False

def __str__(self):
    return f"""\
        Agência:\t{self.agencia}
        C/C:\t\t{self.numero}
        Titular:\t{self.cliente.nome}
    """

class Historico:
def init(self):
self._transacoes = []

@property
def transacoes(self):
    return self._transacoes

def adicionar_transacao(self, transacao):
    self._transacoes.append(
        {
            "tipo": transacao.__class__.__name__,
            "valor": transacao.valor,
            "data": datetime.now().strftime("%d-%m-%Y %H:%M:%s"),
        }
    )

class Transacao(ABC):
@Property
@abstractproperty
def valor(self):
pass

@abstractclassmethod
def registrar(self, conta):
    pass

class Saque(Transacao):
def init(self, valor):
self._valor = valor

@property
def valor(self):
    return self._valor

def registrar(self, conta):
    sucesso_transacao = conta.sacar(self.valor)

    if sucesso_transacao:
        conta.historico.adicionar_transacao(self)

class Deposito(Transacao):
def init(self, valor):
self._valor = valor

@property
def valor(self):
    return self._valor

def registrar(self, conta):
    sucesso_transacao = conta.depositar(self.valor)

    if sucesso_transacao:
        conta.historico.adicionar_transacao(self)

def menu():
menu = """\n
================ MENU ================
[d]\tDepositar
[s]\tSacar
[e]\tExtrato
[nc]\tNova conta
[lc]\tListar contas
[nu]\tNovo usuário
[q]\tSair
=> """
return input(textwrap.dedent(menu))

def filtrar_cliente(cpf, clientes):
clientes_filtrados = [cliente for cliente in clientes if cliente.cpf == cpf]
return clientes_filtrados[0] if clientes_filtrados else None

def recuperar_conta_cliente(cliente):
if not cliente.contas:
print("\n@@@ Cliente não possui conta! @@@")
return

# FIXME: não permite cliente escolher a conta
return cliente.contas[0]

def depositar(clientes):
cpf = input("Informe o CPF do cliente: ")
cliente = filtrar_cliente(cpf, clientes)

if not cliente:
    print("\n@@@ Cliente não encontrado! @@@")
    return

valor = float(input("Informe o valor do depósito: "))
transacao = Deposito(valor)

conta = recuperar_conta_cliente(cliente)
if not conta:
    return

cliente.realizar_transacao(conta, transacao)

def sacar(clientes):
cpf = input("Informe o CPF do cliente: ")
cliente = filtrar_cliente(cpf, clientes)

if not cliente:
    print("\n@@@ Cliente não encontrado! @@@")
    return

valor = float(input("Informe o valor do saque: "))
transacao = Saque(valor)

conta = recuperar_conta_cliente(cliente)
if not conta:
    return

cliente.realizar_transacao(conta, transacao)

def exibir_extrato(clientes):
cpf = input("Informe o CPF do cliente: ")
cliente = filtrar_cliente(cpf, clientes)

if not cliente:
    print("\n@@@ Cliente não encontrado! @@@")
    return

conta = recuperar_conta_cliente(cliente)
if not conta:
    return

print("\n================ EXTRATO ================")
transacoes = conta.historico.transacoes

extrato = ""
if not transacoes:
    extrato = "Não foram realizadas movimentações."
else:
    for transacao in transacoes:
        extrato += f"\n{transacao['tipo']}:\n\tR$ {transacao['valor']:.2f}"

print(extrato)
print(f"\nSaldo:\n\tR$ {conta.saldo:.2f}")
print("==========================================")

def criar_cliente(clientes):
cpf = input("Informe o CPF (somente número): ")
cliente = filtrar_cliente(cpf, clientes)

if cliente:
    print("\n@@@ Já existe cliente com esse CPF! @@@")
    return

nome = input("Informe o nome completo: ")
data_nascimento = input("Informe a data de nascimento (dd-mm-aaaa): ")
endereco = input("Informe o endereço (logradouro, nro - bairro - cidade/sigla estado): ")

cliente = PessoaFisica(nome=nome, data_nascimento=data_nascimento, cpf=cpf, endereco=endereco)

clientes.append(cliente)

print("\n=== Cliente criado com sucesso! ===")

def criar_conta(numero_conta, clientes, contas):
cpf = input("Informe o CPF do cliente: ")
cliente = filtrar_cliente(cpf, clientes)

if not cliente:
    print("\n@@@ Cliente não encontrado, fluxo de criação de conta encerrado! @@@")
    return

conta = ContaCorrente.nova_conta(cliente=cliente, numero=numero_conta)
contas.append(conta)
cliente.contas.append(conta)

print("\n=== Conta criada com sucesso! ===")

def listar_contas(contas):
for conta in contas:
print("=" * 100)
print(textwrap.dedent(str(conta)))

def main():
clientes = []
contas = []

while True:
    opcao = menu()

    if opcao == "d":
        depositar(clientes)

    elif opcao == "s":
        sacar(clientes)

    elif opcao == "e":
        exibir_extrato(clientes)

    elif opcao == "nu":
        criar_cliente(clientes)

    elif opcao == "nc":
        numero_conta = len(contas) + 1
        criar_conta(numero_conta, clientes, contas)

    elif opcao == "lc":
        listar_contas(contas)

    elif opcao == "q":
        break

    else:
        print("\n@@@ Operação inválida, por favor selecione novamente a operação desejada. @@@")

main()

Vou te mandar o codigo. Espero que ajude

class UsuarioTelefone:
def init(self, nome, numero, plano):
self.__nome = nome
self.__numero = numero
self.__plano = plano

@property
def nome(self):
    return self.__nome

@property
def numero(self):
    return self.__numero

@property
def plano(self):
    return self.__plano

def __str__(self):
    return f"Usuário {self.nome} criado com sucesso."

Entrada:

nome = input()
numero = input()
plano = input()

Crie um novo objeto UsuarioTelefone com os dados fornecidos:

usuario = UsuarioTelefone(nome, numero, plano)

print(usuario)

Desafio "Otimizando o Sistema Bancário com Funções Python"

import textwrap

def menu():
menu = """\n
================ MENU ================
[d]\tDepositar
[s]\tSacar
[e]\tExtrato
[nc]\tNova conta
[lc]\tListar contas
[nu]\tNovo usuário
[q]\tSair
=> """
return input(textwrap.dedent(menu))

def depositar(saldo, valor, extrato, /):
if valor > 0:
saldo += valor
extrato += f"Depósito:\tR$ {valor:.2f}\n"
print("\n=== Depósito realizado com sucesso! ===")
else:
print("\n@@@ Operação falhou! O valor informado é inválido. @@@")

return saldo, extrato

def sacar(*, saldo, valor, extrato, limite, numero_saques, limite_saques):
excedeu_saldo = valor > saldo
excedeu_limite = valor > limite
excedeu_saques = numero_saques >= limite_saques

if excedeu_saldo:
    print("\n@@@ Operação falhou! Você não tem saldo suficiente. @@@")

elif excedeu_limite:
    print("\n@@@ Operação falhou! O valor do saque excede o limite. @@@")

elif excedeu_saques:
    print("\n@@@ Operação falhou! Número máximo de saques excedido. @@@")

elif valor > 0:
    saldo -= valor
    extrato += f"Saque:\t\tR$ {valor:.2f}\n"
    numero_saques += 1
    print("\n=== Saque realizado com sucesso! ===")

else:
    print("\n@@@ Operação falhou! O valor informado é inválido. @@@")

return saldo, extrato

def exibir_extrato(saldo, /, *, extrato):
print("\n================ EXTRATO ================")
print("Não foram realizadas movimentações." if not extrato else extrato)
print(f"\nSaldo:\t\tR$ {saldo:.2f}")
print("==========================================")

def criar_usuario(usuarios):
cpf = input("Informe o CPF (somente número): ")
usuario = filtrar_usuario(cpf, usuarios)

if usuario:
    print("\n@@@ Já existe usuário com esse CPF! @@@")
    return

nome = input("Informe o nome completo: ")
data_nascimento = input("Informe a data de nascimento (dd-mm-aaaa): ")
endereco = input("Informe o endereço (logradouro, nro - bairro - cidade/sigla estado): ")

usuarios.append({"nome": nome, "data_nascimento": data_nascimento, "cpf": cpf, "endereco": endereco})

print("=== Usuário criado com sucesso! ===")

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

def criar_conta(agencia, numero_conta, usuarios):
cpf = input("Informe o CPF do usuário: ")
usuario = filtrar_usuario(cpf, usuarios)

if usuario:
    print("\n=== Conta criada com sucesso! ===")
    return {"agencia": agencia, "numero_conta": numero_conta, "usuario": usuario}

print("\n@@@ Usuário não encontrado, fluxo de criação de conta encerrado! @@@")

def listar_contas(contas):
for conta in contas:
linha = f"""
Agência:\t{conta['agencia']}
C/C:\t\t{conta['numero_conta']}
Titular:\t{conta['usuario']['nome']}
"""
print("=" * 100)
print(textwrap.dedent(linha))

def main():
LIMITE_SAQUES = 3
AGENCIA = "0001"

saldo = 0
limite = 500
extrato = ""
numero_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,
            numero_saques=numero_saques,
            limite_saques=LIMITE_SAQUES,
        )

    elif opcao == "e":
        exibir_extrato(saldo, extrato=extrato)

    elif opcao == "nu":
        criar_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":
        listar_contas(contas)

    elif opcao == "q":
        break

    else:
        print("Operação inválida, por favor selecione novamente a operação desejada.")

main()

Comentar melhor o código do desafio

Sugiro dividir o código em partes de acordo com as funções, por exemplo:

**# ================= Função de Criar Usuário ==================== #**
def criar_usuario(usuarios):
    cpf = input("Informe o CPF (somente número): ")
    usuario = filtrar_usuario(cpf, usuarios)

    if usuario:
        print("\n@@@ Já existe usuário com esse CPF! @@@")
        return

    nome = input("Informe o nome completo: ")
    data_nascimento = input("Informe a data de nascimento (dd-mm-aaaa): ")
    endereco = input("Informe o endereço (logradouro, nro - bairro - cidade/sigla estado): ")

    usuarios.append({"nome": nome, "data_nascimento": data_nascimento, "cpf": cpf, "endereco": endereco})

    print("=== Usuário criado com sucesso! ===")

**# ================= Função Filtrar Usuários ==================== #**
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

**# ================= Função Criar Conta ================ #**
def criar_conta(agencia, numero_conta, usuarios):
    cpf = input("Informe o CPF do usuário: ")
    usuario = filtrar_usuario(cpf, usuarios)

    if usuario:
        print("\n=== Conta criada com sucesso! ===")
        return {"agencia": agencia, "numero_conta": numero_conta, "usuario": usuario}

    print("\n@@@ Usuário não encontrado, fluxo de criação de conta encerrado! @@@")

**# ================= Função Lista Conta ================= #**
def listar_contas(contas):
    for conta in contas:
        linha = f"""\
            Agência:\t{conta['agencia']}
            C/C:\t\t{conta['numero_conta']}
            Titular:\t{conta['usuario']['nome']}
        """
        print("=" * 100)
        print(textwrap.dedent(linha))

Isso ajuda na leitura e organização me determinadas IDE's como o Google Colaboratory

Desafio do projeto "Criando um sistema bancário com Python

menu = """

[d] Depositar
[s] Sacar
[e] Extrato
[q] Sair

=> """

saldo = 0
limite = 500
extrato = ""
numero_saques = 0
LIMITE_SAQUES = 3

while True:

opcao = input(menu)

if opcao == "d":
    valor = float(input("Informe o valor do depósito: "))

    if valor > 0:
        saldo += valor
        extrato += f"Depósito: R$ {valor:.2f}\n"

    else:
        print("Operação falhou! O valor informado é inválido.")

elif opcao == "s":
    valor = float(input("Informe o valor do saque: "))

    excedeu_saldo = valor > saldo

    excedeu_limite = valor > limite

    excedeu_saques = numero_saques >= LIMITE_SAQUES

    if excedeu_saldo:
        print("Operação falhou! Você não tem saldo suficiente.")

    elif excedeu_limite:
        print("Operação falhou! O valor do saque excede o limite.")

    elif excedeu_saques:
        print("Operação falhou! Número máximo de saques excedido.")

    elif valor > 0:
        saldo -= valor
        extrato += f"Saque: R$ {valor:.2f}\n"
        numero_saques += 1

    else:
        print("Operação falhou! O valor informado é inválido.")

elif opcao == "e":
    print("\n================ EXTRATO ================")
    print("Não foram realizadas movimentações." if not extrato else extrato)
    print(f"\nSaldo: R$ {saldo:.2f}")
    print("==========================================")

elif opcao == "q":
    break

else:
    print("Operação inválida, por favor selecione novamente a operação desejada.")

sistema bancario -Dio-Python-melhoria

import textwrap

def depositar(saldo, valor, extrato):
if valor > 0:
saldo += valor
extrato += f"Depósito:\tR$ {valor:.2f}\n"
print("\n=== Depósito realizado com sucesso! ===")
else:
print("\n@@@ Operação falhou! O valor informado é inválido. @@@")

return saldo, extrato

def sacar(*, saldo, valor, extrato, limite, numero_saques, limite_saques):
excedeu_saldo = valor > saldo
excedeu_limite = valor > limite
excedeu_saques = numero_saques >= limite_saques

if excedeu_saldo:
    print("\n@@@ Operação falhou! Você não tem saldo suficiente. @@@")

elif excedeu_limite:
    print("\n@@@ Operação falhou! O valor do saque excede o limite. @@@")

elif excedeu_saques:
    print("\n@@@ Operação falhou! Número máximo de saques excedido. @@@")

elif valor > 0:
    saldo -= valor
    extrato += f"Saque:\t\tR$ {valor:.2f}\n"
    numero_saques += 1
    print("\n=== Saque realizado com sucesso! ===")

else:
    print("\n@@@ Operação falhou! O valor informado é inválido. @@@")

return saldo, extrato, numero_saques

def exibir_extrato(saldo, extrato):
print("\n================ EXTRATO ================")
if not extrato:
print("Não foram realizadas movimentações.")
else:
print(extrato)
print(f"\nSaldo:\t\tR$ {saldo:.2f}")
print("==========================================")

def criar_usuario(usuarios):
cpf = input("Informe o CPF (somente números): ")
usuario = filtrar_usuario(cpf, usuarios)

if usuario:
    print("\n@@@ Já existe usuário com esse CPF! @@@")
    return

nome = input("Informe o nome completo: ")
data_nascimento = input("Informe a data de nascimento (dd-mm-aaaa): ")
endereco = input("Informe o endereço (logradouro, nro - bairro - cidade/sigla estado): ")

usuarios.append({"nome": nome, "data_nascimento": data_nascimento, "cpf": cpf, "endereco": endereco})

print("=== Usuário criado com sucesso! ===")

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

def criar_conta(agencia, numero_conta, usuarios):
cpf = input("Informe o CPF do usuário: ")
usuario = filtrar_usuario(cpf, usuarios)

if usuario:
    print("\n=== Conta criada com sucesso! ===")
    return {"agencia": agencia, "numero_conta": numero_conta, "usuario": usuario}

print("\n@@@ Usuário não encontrado, fluxo de criação de conta encerrado! @@@")

def listar_contas(contas):
for conta in contas:
linha = f"""
Agência:\t{conta['agencia']}
C/C:\t\t{conta['numero_conta']}
Titular:\t{conta['usuario']['nome']}
"""
print("=" * 100)
print(textwrap.dedent(linha))

def menu():
print("\n=== MENU ===")
print("d - Depositar")
print("s - Sacar")
print("e - Exibir Extrato")
print("nu - Novo Usuário")
print("nc - Nova Conta")
print("lc - Listar Contas")
print("q - Sair")

return input("Escolha uma opção: ").lower()

def main():
LIMITE_SAQUES = 3
AGENCIA = "0001"

saldo = 0
limite = 500
extrato = ""
numero_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, numero_saques = sacar(
            saldo=saldo,
            valor=valor,
            extrato=extrato,
            limite=limite,
            numero_saques=numero_saques,
            limite_saques=LIMITE_SAQUES,
        )

    elif opcao == "e":
        exibir_extrato(saldo, extrato)

    elif opcao == "nu":
        criar_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":
        listar_contas(contas)

    elif opcao == "q":
        break

    else:
        print("Operação inválida, por favor selecione novamente a operação desejada.")

main()

Desafio: Sistema Bancario

#Variáveis iniciais
saldo = 0
limite = 500
extrato = ""
numero_saques = 0
LIMITE_SAQUES = 3

#Tela de menu inicial
#Loop infinito para que o usuário possa realizar várias operações

while True:
print("BANCO XZ")
print("\n[1] Depositar")
print("[2] Sacar")
print("[3] Extrato")
print("[4] Sair")

opcao = input("Escolha uma opção: ")

if opcao == "1":
    valor = float(input("Informe o valor do depósito: "))

    if valor > 0:
        saldo += valor
        extrato += f"Depósito: R$ {valor:.2f}\n"
    else:
        print("Operação falhou! O valor informado é inválido.")

elif opcao == "2":
    valor = float(input("Informe o valor do saque: "))

    excedeu_saldo = valor > saldo
    excedeu_limite = valor > limite
    excedeu_saques = numero_saques >= LIMITE_SAQUES

    if excedeu_saldo:
        print("Operação falhou! Saldo insuficiente.")
    elif excedeu_limite:
        print("Operação falhou! Valor do saque excede o limite.")
    elif excedeu_saques:
        print("Operação falhou! Número máximo de saques atingido.")
    elif valor > 0:
        saldo -= valor
        extrato += f"Saque: R$ {valor:.2f}\n"
        numero_saques += 1
    else:
        print("Operação falhou! O valor informado é inválido.")

elif opcao == "3":
    print("\n================ EXTRATO ================")
    print("Não foram realizadas movimentações." if not extrato else extrato)
    print(f"\nSaldo: R$ {saldo:.2f}")
    print("==========================================")

elif opcao == "4":
    break

else:
    print("Opção inválida. Escolha novamente.")

Banco_interface

desafio banco aprimorado

def menu():
menu = """\n
================ MENU ================
[1]Depositar
[2]Sacar
[3]Extrato
[4]Novo usuário
[5]Nova conta
[6]Sair
=> """
return input((menu))

def depositar(saldo, valor, extrato, /):
if valor > 0:
saldo += valor
extrato += f"Depósito:\tR$ {valor:.2f}\n"
print("\n=== Depósito realizado com sucesso! ===")
else:
print("\n O valor informado é inválido.")

return saldo, extrato

def sacar(*, saldo, valor, extrato, limite, numero_saques, limite_saques):
excedeu_saldo = valor > saldo
excedeu_limite = valor > limite
excedeu_saques = numero_saques >= limite_saques

if excedeu_saldo:
    print("\n saldo insuficiente.")

elif excedeu_limite:
    print("\n valor de saque diário excedido.")

elif excedeu_saques:
    print("\nNúmero máximo de saques excedido.")

elif valor > 0:
    saldo -= valor
    extrato += f"Saque:\t\tR$ {valor:.2f}\n"
    numero_saques += 1
    print("\nSaque realizado com sucesso!!!")

else:
    print("\n O valor informado é inválido.")

return saldo, extrato

def exibir_extrato(saldo, /, *, extrato):
print("\n================ EXTRATO ================")
print("Não foram realizadas movimentações." if not extrato else extrato)
print(f"\nSaldo: R$ {saldo:.2f}")
print("==========================================")

def criar_usuario(usuarios):
cpf = input("Informe o CPF (somente número): ")
usuario = filtrar_usuario(cpf, usuarios)

if usuario:
    print("\n usuário já cadastrado")
    return

nome = input("Informe o nome completo: ")
data_nascimento = input("Informe a data de nascimento (dd-mm-aaaa): ")
endereco = input("Informe o endereço (logradouro, nro - bairro - cidade/sigla estado): ")

usuarios.append({"nome": nome, "data_nascimento": data_nascimento, "cpf": cpf, "endereco": endereco})

print(" Usuário criado com sucesso!")

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

def criar_conta(agencia, numero_conta, usuarios):
cpf = input("Informe o CPF do usuário: ")
usuario = filtrar_usuario(cpf, usuarios)

if usuario:
    print("\n=== Conta criada com sucesso! ===")
    return {"agencia": agencia, "numero_conta": numero_conta, "usuario": usuario}

print("\nUsuário não encontrado!")

def main():
LIMITE_SAQUES = 3
AGENCIA = "0001"

saldo = 0
limite = 500
extrato = ""
numero_saques = 0
usuarios = []
contas = []

while True:
    opcao = menu()

    if opcao == "1":
        valor = float(input("Informe o valor do depósito: "))

        saldo, extrato = depositar(saldo, valor, extrato)

    elif opcao == "2":
        valor = float(input("Informe o valor do saque: "))

        saldo, extrato = sacar(
            saldo=saldo,
            valor=valor,
            extrato=extrato,
            limite=limite,
            numero_saques=numero_saques,
            limite_saques=LIMITE_SAQUES,
        )

    elif opcao == "3":
        exibir_extrato(saldo, extrato=extrato)

    elif opcao == "4":
        criar_usuario(usuarios)

    elif opcao == "5":
        numero_conta = len(contas) + 1
        conta = criar_conta(AGENCIA, numero_conta, usuarios)

        if conta:
            contas.append(conta)

   
    elif opcao == "6":
        break

    else:
        print("Operação inválida, por favor selecione novamente a operação desejada.")

main()

numero_saques não esta sendo alimentado no código.

Ao realizar testes no meu código para entregar no projeto, verifiquei que minha variável "numero_saques" não estava sendo alimentada no programa e consequentemente poderia fazer a quantidade de saques que quisesse. Ao conferir este código, vi que também esta assim.

Segue correção que encontrei para solucionar esta situação:

1º - Adicionar o parametro (numero_saques) no return da função sacar:

return saldo, extrato, numero_saques

2º - Adicionar a chamada (numero_saques) na função main no bloco da opção correspondente ao saque "s":

saldo, extrato, numero_saques = sacar( saldo=saldo, valor=valor, extrato=extrato, limite=limite, numero_saques=numero_saques, limite_saques=LIMITE_SAQUES, )

Desafio - Otimizando o Sistema Bancário

import textwrap

def menu():
menu = """
============ MENU ===========
[1] Depositar
[2] Sacar
[3] Extrato
[4] Nova conta
[5] Listar contas
[6] Novo usuário
[0] Sair
"""
return input(textwrap.dedent(menu))

def depositar(saldo, valor, extrato):
if valor > 0:
saldo += valor
extrato += f"Depósito:\tR$ {valor:.2f}\n"
print("\n**** Depósito realizado com sucesso! ****")
else:
print("\n### Operação falhou! O valor informado é inválido. ###")
return saldo, extrato

def sacar(*, saldo, valor, extrato, limite, numero_saques, limite_saques):
excedeu_saldo = valor > saldo
excedeu_limite = valor > limite
excedeu_saques = numero_saques > limite_saques

if excedeu_saldo:
    print("\n**** Operação falhou! Você não tem saldo suficiente. ****")

elif excedeu_limite:
    print("\n&&&& Operação falhou! O valor do saque excedeu o limite. &&&&")

elif excedeu_saques:
    print("\n@@@ Operação falhou! Número máximo de saques excedido. @@@")

elif valor > 0:
    saldo -= valor
    extrato += f"Saque:\t\tR$  {valor:.2f}\n"
    numero_saques += 1
    print("\n%%%% Saque realizado com sucesso! %%%%")

else: 
    print("\n#### Operação falhou! O valor informado é inválido. ####")

return saldo, extrato

def exibir_extrato(saldo, /, *, extrato):
print("\n============= EXTRATO ================")
print("Não foram realizados movimentações." if not extrato else extrato)
print(f"\nSaldo:\t\tR$ {saldo:.2f}")
print("==================================")

def criar_usuario(usuarios):
cpf = input("Informe o CPF (somente número): ")
usuario = filtrar_usuario(cpf, usuarios)

if usuario:
    print("\n===Já existe usuário com esse CPF!===")
    return

nome = input("Informe o nome completo: ")
data_nascimento = input("Informe a data de nascimento (dd-mm-aaaa): ")
endereco = input("Informe o endereço (lograduro, nro - bairro - cidade/sigla estado): ")

usuarios.append({"nome": nome, "data_nascimento": data_nascimento, "cpf": cpf, "endereco": endereco})

print("===Usuário criado com sucesso!===")

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

def criar_conta(agencia, numero_conta, usuarios):
cpf = input("Informe o CPF do usuário: ")
usuario = filtrar_usuario(cpf, usuarios)

if usuario:
    print("\n=== Conta criada com sucesso! ===")
    return {"agencia": agencia, "numero_conta": numero_conta, "usuario": usuario}

print("\n# Usuário não encontrado, fluxo de criação de conta encerrado! #")

def listar_contas(contas):
for conta in contas:
linha = f"""
Agência:\t{conta['agencia']}
C/C:\t\t{conta['numero_conta']}
Titular:\t{conta['usuario']['nome']}
"""
print("=" * 100)
print(textwrap.dedent(linha))

def main():
LIMITE_SAQUES = 3
AGENCIA = "0001"

saldo = 0
limite = 500
extrato = ""
numero_saques = 0
usuarios = []
contas = []

while True:
    opcao = menu()

    if opcao == "1":
        valor = float(input("Informe o valor do depósito: "))

        saldo, extrato = depositar(saldo, valor, extrato)
    
    elif opcao == "2":
        valor = float(input("Informe o valor do saque: "))

        saldo, extrato = sacar(
            saldo=saldo,
            valor=valor,
            extrato=extrato,
            limite=limite,
            numero_saques=numero_saques,
            limite_saques=LIMITE_SAQUES,
        )
    
    elif opcao == "3":
        exibir_extrato(saldo, extrato=extrato)
    
    elif opcao == "6":
        criar_usuario(usuarios)
    
    elif opcao == "4":
        numero_conta = len(contas) + 1
        conta = criar_conta(AGENCIA, numero_conta, usuarios)

        if conta:
            contas.append(conta)

    elif opcao == "5":
        listar_contas(contas)
    
    elif opcao == "0":
        break

    else:
        print("Operação inválido, por favor selecione novamente a operação desejada.")

main()

desafio 2 - Otimizando um sistema bancário com python

importar data e hora importar quebra de texto importar re

menu = """ [d] Depositar [s] Sair [e] Extrair [nu] Novo Usuário [nc] Nova Conta [lc] Listar Contas [q] Sair => """

class Conta: def init (self, agência, numero_conta, usuário): self.agencia = agência self.numero_conta = numero_conta self.usuario = usuário self.saldo = 0 self.limite = 500 self.extrato = [] self.numero_saques = 0 self.LIMITE_SAQUES = 3

def depositar(self): valor = float(input("Informe o valor do depósito: ")) if valor > 0: self.saldo += valor self.extrato.append((datetime.datetime.now(), "Depósito", valor)) print("\n=== Depósito realizado com sucesso! ===") else: print("\n@@@ Operação falhou! O valor informado é inválido. @@@")

def sacar(self):
valor = float(input("Informe o valor do saque: "))
excedeu_saldo = valor > self.saldo
excedeu_limite = valor > self.limite
excedeu_saques = self.numero_saques >= self.LIMITE_SAQUES

if excedeu_saldo:
    print("\n@@@ Operação falhou! Você não tem saldo suficiente. @@@")
elif excedeu_limite:
    print("\n@@@ Operação falhou! O valor do saque excedeu o limite. @@@")
elif excedeu_saques:
    print("\n@@@ Operação falhou! Número máximo de saques excedidos. @@@")
elif valor > 0:
    self.saldo -= valor
    self.extrato.append((datetime.datetime.now(), "Saque", valor))
    self.numero_saques += 1
    print("\n=== Saque realizado com sucesso! ===")
else:
    print("\n@@@ Operação falhou! O valor informado é inválido. @@@")

def exibir_extrato(self):
print("\n================ EXTRATO ================")
if not self.extrato:
print("Não foram realizadas movimentações.")
else:
for data, operacao, valor in self.extrato:
print(f"{data.strftime('%d/%m/%Y %H:%M:%S')} - {operacao}: R$ {valor:.2f}")
print(f"\nSaldo:\t\tR$ {self.saldo:.2f}")
print("==========================================")
def criar_usuario(usuários): cpf = input("Informe o CPF (alguns números): ") usuario = filtrar_usuario(cpf, usuarios)

if usuário: print("\n@@@ Já existe usuário com esse CPF! @@@") return

nome = input("Informe o nome completo: ") data_nascimento = input("Informe a data de nascimento (dd-mm-aaaa): ") endereco = input("Informe o endereço (logradouro, nro - bairro - cidade/sigla estado): ")

usuarios.append( { "nome": nome, "data_nascimento": data_nascimento, "cpf": cpf, "endereco": endereco, } ) print("=== Usuário criado com sucesso! ===")

def filtrar_usuario(cpf, usuarios): usuarios_filtrados = [usuario para usuario em usuarios if usuario["cpf"] == cpf] return usuarios_filtrados[0] if usuarios_filtrados else Nenhum

def criar_conta(agencia, numero_conta, usuários): cpf = input("Informe o CPF do usuário: ") usuário = filtrar_usuario(cpf, usuários)

if usuário: print("\n=== Conta criada com sucesso! ===") return { "agencia": agencia, "numero_conta": numero_conta, "usuario": usuario, }

print("\n@@@ Usuário não encontrado, fluxo de criação de conta encerrado! @@@") return None # Retorna None se o usuário não for encontrado

def listar_contas(contas): for conta em contas: linha = f""" Agência:\t{conta['agencia']} C/C:\t\t{conta['numero_conta']} Titular:\t{conta['usuario']['nome']} """ print("=" * 100) print(textwrap.dedent(linha))

def main():
LIMITE_SAQUES = 3
AGENCIA = "0001"

usuarios = []
contas = []

while True:
opcao = input(menu)

if opcao == "d":
    cpf = input("Informe o CPF do titular da conta: ")
    conta = filtrar_usuario(cpf, contas)

    if conta:
        conta.depositar()  # Chama o método depositar da instância da conta
    else:
        print("\n@@@ Conta não encontrada! @@@")
elif opcao == "s":
    cpf = input("Informe o CPF do titular da conta: ")
    conta = filtrar_usuario(cpf, contas)

    if conta:
        conta.sacar()  # Chama o método sacar da instância da conta
    else:
        print("\n@@@ Conta não encontrada! @@@")
elif opcao == "e":
    cpf = input("Informe o CPF do titular da conta: ")
    conta = filtrar_usuario(cpf, contas)

    if conta:
        conta.exibir_extrato()  # Chama o método exibir_extrato da instância da conta
    else:
        print("\n@@@ Conta não encontrada! @@@")
elif opcao == "nu":
    criar_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":
    listar_contas(contas)
elif opcao == "q":
    break
else:
    print("Operação inválida, por favor selecione novamente a operação desejada.")

if nome == " principal ": main()

Operadores de comparação

adicionei informações que podem ser importantes principalmente para quem está começando (igual eu), no código:

saldo = 200  # valor do saldo
saque = 200  # valor do saque

print("Igualdade ", saldo == saque)  # Verifica se o saldo é igual ao saque
print("Diferença ", saldo != saque)  # Verifica se o saldo é diferente do saque
print("Maior que ", saldo > saque)  # Verifica se o saldo é maior que o saque
print("Maior ou igual ", saldo >= saque)  # Verifica se o saldo é maior ou igual ao saque
print("Menor que ", saldo < saque)  # Verifica se o saldo é menor que o saque
print("Menor ou igual ", saldo <= saque)  # Verifica se o saldo é menor ou igual ao saque

Desafio V1- Modelando o Sistema Bancário em POO com Python

DESAFIO DIO

  • Uso de classes abstratas: A utilização de classes abstratas Transação e Cliente permite a criação de subclasses específicas (como Saque, Deposito, PessoaFisica) com herança, promovendo organização e reuso de código.

  • Propriedades e métodos bem definidos: As propriedades (saldo, numero, agencia, etc.) e métodos (sacar, depositar, registrar) possuem descrições claras e estão bem implementados.

from abc import ABC, abstractclassmethod, abstractproperty
from datetime import datetime


class Cliente:
    def __init__(self, endereco):
        self.endereco = endereco
        self.contas = []

    def realizar_transacao(self, conta, transacao):
        transacao.registrar(conta)

    def adicionar_conta(self, conta):
        self.contas.append(conta)


class PessoaFisica(Cliente):
    def __init__(self, nome, data_nascimento, cpf, endereco):
        super().__init__(endereco)
        self.nome = nome
        self.data_nascimento = data_nascimento
        self.cpf = cpf


class Conta:
    def __init__(self, numero, cliente):
        self._saldo = 0
        self._numero = numero
        self._agencia = "0001"
        self._cliente = cliente
        self._historico = Historico()

    @classmethod
    def nova_conta(cls, cliente, numero):
        return cls(numero, cliente)

    @property
    def saldo(self):
        return self._saldo

    @property
    def numero(self):
        return self._numero

    @property
    def agencia(self):
        return self._agencia

    @property
    def cliente(self):
        return self._cliente

    @property
    def historico(self):
        return self._historico

    def sacar(self, valor):
        saldo = self.saldo
        excedeu_saldo = valor > saldo

        if excedeu_saldo:
            print("\n@@@ Operação falhou! Você não tem saldo suficiente. @@@")

        elif valor > 0:
            self._saldo -= valor
            print("\n=== Saque realizado com sucesso! ===")
            return True

        else:
            print("\n@@@ Operação falhou! O valor informado é inválido. @@@")

        return False

    def depositar(self, valor):
        if valor > 0:
            self._saldo += valor
            print("\n=== Depósito realizado com sucesso! ===")
        else:
            print("\n@@@ Operação falhou! O valor informado é inválido. @@@")
            return False

        return True


class ContaCorrente(Conta):
    def __init__(self, numero, cliente, limite=500, limite_saques=3):
        super().__init__(numero, cliente)
        self.limite = limite
        self.limite_saques = limite_saques

    def sacar(self, valor):
        numero_saques = len(
            [transacao for transacao in self.historico.transacoes if transacao["tipo"] == Saque.__name__]
        )

        excedeu_limite = valor > self.limite
        excedeu_saques = numero_saques >= self.limite_saques

        if excedeu_limite:
            print("\n@@@ Operação falhou! O valor do saque excede o limite. @@@")

        elif excedeu_saques:
            print("\n@@@ Operação falhou! Número máximo de saques excedido. @@@")

        else:
            return super().sacar(valor)

        return False

    def __str__(self):
        return f"""\
            Agência:\t{self.agencia}
            C/C:\t\t{self.numero}
            Titular:\t{self.cliente.nome}
        """


class Historico:
    def __init__(self):
        self._transacoes = []

    @property
    def transacoes(self):
        return self._transacoes

    def adicionar_transacao(self, transacao):
        self._transacoes.append(
            {
                "tipo": transacao.__class__.__name__,
                "valor": transacao.valor,
                "data": datetime.now().strftime("%d-%m-%Y %H:%M:%s"),
            }
        )


class Transacao(ABC):
    @property
    @abstractproperty
    def valor(self):
        pass

    @abstractclassmethod
    def registrar(self, conta):
        pass


class Saque(Transacao):
    def __init__(self, valor):
        self._valor = valor

    @property
    def valor(self):
        return self._valor

    def registrar(self, conta):
        sucesso_transacao = conta.sacar(self.valor)

        if sucesso_transacao:
            conta.historico.adicionar_transacao(self)


class Deposito(Transacao):
    def __init__(self, valor):
        self._valor = valor

    @property
    def valor(self):
        return self._valor

    def registrar(self, conta):
        sucesso_transacao = conta.depositar(self.valor)

        if sucesso_transacao:
            conta.historico.adicionar_transacao(self)

Desafio Bancário com PYTHON- Entregando projeto.

menu = """
[d]Depositar
[s]Sacar
[e]Extrato
[q]Sair

=> """
saldo=0
limite= 500
extrato= ""
numero_saque= 0
LIMITE_SAQUE=3

while True:
opcao=input(menu)
if opcao== "d":
valor= float(input("Qual o valor que deseja depositar?"))
if valor > 0:
saldo += valor
extrato += f"Deposito: R${valor:.2f}\n"

     else:
        print("Operação falhou: o valor informado é inválido ")
    
elif opcao== "s":
    valor = float(input("Qual o valor do saque?"))
    
    excedeu_saldo = valor > saldo
    excedeu_limite = valor > limite
    excedeu_saques= numero_saque >= LIMITE_SAQUE
    if excedeu_saldo:
        print("Operação falhou! você não tem saldo sulficiente.")
        
    elif excedeu_limite:
        print("Operação falhou, o valor do saque excede o limite!")
        
    elif excedeu_saques:
        print("Operação falhou! Numero máximo de saques excedido.")
        
    elif valor>0:
        saldo -= valor
        extrato += f"Saque: R$ {valor:.2f}\n"
        numero_saque += 1
        
    else:
        print("Operação falhou, valor inserido inválido.")
        
elif opcao=="e":
    print("\n================EXTRATO================")
    print("  Não foram realizada movimentações! " if not extrato else extrato)
    print(f"\nSaldo: R$ {saldo:.2f}")
    print("============================================")
    
elif opcao=="q":
    break

else:
    print("Operação inválida, por favor selacione novamente a operação desejada.")

Extrato

menu = """

[d] Depositar
[s] Sacar
[e] Extrato
[q] Sair

-> """

saldo = 0
limite = 500
extrato = ""
numero_saques = 0
LIMITE_SAQUES = 3

while True:

opcao = input(menu) if opcao == "d": valor = float(input("Informe o valor do depósito: ")) if valor > 0: saldo += valor extrato += f"Depósito: R$ {valor:.2f}\n" else: print("Operação falhou! O valor informado é inválido.") elif opcao == "s": valor = float(input("Informe o valor do saque: ")) excedeu_saldo = valor > saldo excedeu_limite = valor > limite excedeu_saques = numero_saques >= LIMITE_SAQUES if excedeu_saldo: print("Operação falhou! Você não tem saldo suficiente.") elif excedeu_limite: print("Operação falhou! O valor do saque excede o limite.") elif excedeu_saques: print("Operação falhou! Números máximo de saques excedido.") elif valor > 0: saldo -= valor extrato += f"Saque: R$ {valor:.2f}\n" numero_saques += 1 else: print("Operação falhou! Ovalor informado é inválido.") elif opcao == "e": print("\n================ EXTRATO ================") print("Não foram realizadas movimentações." if not extrato else extrato) print(f"\nSaldo: R$ {saldo:.2f}") print("=========================================") elif opcao == "q": break else: print("Operação inválida, por favor selecionenovamente a operação desejada.")

Explorando POO com Python 1 / 3 - Criando uma Classe de Usuário

Boa tarde .

Alguem tem a resolução desse desafio ?

Não estou conseguindo resolver ...

Vamos criar uma classe chamada UsuarioTelefone para representar um usuário de telefone. Você pode definir um método especial e depois aplicar conceitos de encapsulamento nos atributos dentro da classe. Lembre-se que, cada usuário terá um nome, um número de telefone e um plano associado, neste desafio, simulamos três planos, sendo: Plano Essencial Fibra, Plano Prata Fibra e Plano Premium Fibra.

Entrada
Nome do usuário, número de telefone e plano.

Saída
Mensagem indicando que o usuário foi criado com sucesso.

Entrada | Saída
Ana(11) 91111-1111 Usuário Ana criado com sucesso.
Plano Essencial Fibra |

Sofia(22) 92222-2222 Usuário Ana criado com sucesso.
Plano Prata Fibra

Pedro(33) 93333-3333 Usuário Ana criado com sucesso.
Plano Premium Fibra


TODO: Crie uma classe UsuarioTelefone.

TODO: Defina um método especial __init__, que é o construtor da classe.

O método __init__, irá inicializar os atributos da classe: nome, numero e plano.

# TODO: Aplique o conceito de encapsulamento, onde os atributos serão encapsulados dentro da classe.
  

# A classe `UsuarioTelefone` define um método especial `__str__`, que retorna uma representação em string do objeto.
def __str__(self):
    return f"Usuário {self.nome} criado com sucesso."

Entrada:

nome = input()
numero = input()
plano = input()

TODO: Crie um novo objeto UsuarioTelefone com os dados fornecidos:

print(usuario)

Desafio V2- Modelando o Sistema Bancário em POO com Python

DESAFIO DIO

  • Classes Abstratas: A utilização de classes abstratas Transação e Cliente permite a criação de subclasses específicas (como Saque, Deposito, PessoaFisica) com herança, promovendo organização e reuso de código.

  • Encapsulamento: Os dados privados das classes são encapsulados utilizando o underline (_) na frente dos atributos, seguindo boas práticas de programação.

  • Propriedades e métodos bem definidos: As propriedades (saldo, numero, agencia, etc.) e métodos (sacar, depositar, registrar) possuem descrições claras e estão bem implementados.

import textwrap
from abc import ABC, abstractclassmethod, abstractproperty
from datetime import datetime


class Cliente:
    def __init__(self, endereco):
        self.endereco = endereco
        self.contas = []

    def realizar_transacao(self, conta, transacao):
        transacao.registrar(conta)

    def adicionar_conta(self, conta):
        self.contas.append(conta)


class PessoaFisica(Cliente):
    def __init__(self, nome, data_nascimento, cpf, endereco):
        super().__init__(endereco)
        self.nome = nome
        self.data_nascimento = data_nascimento
        self.cpf = cpf


class Conta:
    def __init__(self, numero, cliente):
        self._saldo = 0
        self._numero = numero
        self._agencia = "0001"
        self._cliente = cliente
        self._historico = Historico()

    @classmethod
    def nova_conta(cls, cliente, numero):
        return cls(numero, cliente)

    @property
    def saldo(self):
        return self._saldo

    @property
    def numero(self):
        return self._numero

    @property
    def agencia(self):
        return self._agencia

    @property
    def cliente(self):
        return self._cliente

    @property
    def historico(self):
        return self._historico

    def sacar(self, valor):
        saldo = self.saldo
        excedeu_saldo = valor > saldo

        if excedeu_saldo:
            print("\n@@@ Operação falhou! Você não tem saldo suficiente. @@@")

        elif valor > 0:
            self._saldo -= valor
            print("\n=== Saque realizado com sucesso! ===")
            return True

        else:
            print("\n@@@ Operação falhou! O valor informado é inválido. @@@")

        return False

    def depositar(self, valor):
        if valor > 0:
            self._saldo += valor
            print("\n=== Depósito realizado com sucesso! ===")
        else:
            print("\n@@@ Operação falhou! O valor informado é inválido. @@@")
            return False

        return True


class ContaCorrente(Conta):
    def __init__(self, numero, cliente, limite=500, limite_saques=3):
        super().__init__(numero, cliente)
        self._limite = limite
        self._limite_saques = limite_saques

    def sacar(self, valor):
        numero_saques = len(
            [transacao for transacao in self.historico.transacoes if transacao["tipo"] == Saque.__name__]
        )

        excedeu_limite = valor > self._limite
        excedeu_saques = numero_saques >= self._limite_saques

        if excedeu_limite:
            print("\n@@@ Operação falhou! O valor do saque excede o limite. @@@")

        elif excedeu_saques:
            print("\n@@@ Operação falhou! Número máximo de saques excedido. @@@")

        else:
            return super().sacar(valor)

        return False

    def __str__(self):
        return f"""\
            Agência:\t{self.agencia}
            C/C:\t\t{self.numero}
            Titular:\t{self.cliente.nome}
        """


class Historico:
    def __init__(self):
        self._transacoes = []

    @property
    def transacoes(self):
        return self._transacoes

    def adicionar_transacao(self, transacao):
        self._transacoes.append(
            {
                "tipo": transacao.__class__.__name__,
                "valor": transacao.valor,
                "data": datetime.now().strftime("%d-%m-%Y %H:%M:%s"),
            }
        )


class Transacao(ABC):
    @property
    @abstractproperty
    def valor(self):
        pass

    @abstractclassmethod
    def registrar(self, conta):
        pass


class Saque(Transacao):
    def __init__(self, valor):
        self._valor = valor

    @property
    def valor(self):
        return self._valor

    def registrar(self, conta):
        sucesso_transacao = conta.sacar(self.valor)

        if sucesso_transacao:
            conta.historico.adicionar_transacao(self)


class Deposito(Transacao):
    def __init__(self, valor):
        self._valor = valor

    @property
    def valor(self):
        return self._valor

    def registrar(self, conta):
        sucesso_transacao = conta.depositar(self.valor)

        if sucesso_transacao:
            conta.historico.adicionar_transacao(self)


def menu():
    menu = """\n
    ================ MENU ================
    [d]\tDepositar
    [s]\tSacar
    [e]\tExtrato
    [nc]\tNova conta
    [lc]\tListar contas
    [nu]\tNovo usuário
    [q]\tSair
    => """
    return input(textwrap.dedent(menu))


def filtrar_cliente(cpf, clientes):
    clientes_filtrados = [cliente for cliente in clientes if cliente.cpf == cpf]
    return clientes_filtrados[0] if clientes_filtrados else None


def recuperar_conta_cliente(cliente):
    if not cliente.contas:
        print("\n@@@ Cliente não possui conta! @@@")
        return

    # FIXME: não permite cliente escolher a conta
    return cliente.contas[0]


def depositar(clientes):
    cpf = input("Informe o CPF do cliente: ")
    cliente = filtrar_cliente(cpf, clientes)

    if not cliente:
        print("\n@@@ Cliente não encontrado! @@@")
        return

    valor = float(input("Informe o valor do depósito: "))
    transacao = Deposito(valor)

    conta = recuperar_conta_cliente(cliente)
    if not conta:
        return

    cliente.realizar_transacao(conta, transacao)


def sacar(clientes):
    cpf = input("Informe o CPF do cliente: ")
    cliente = filtrar_cliente(cpf, clientes)

    if not cliente:
        print("\n@@@ Cliente não encontrado! @@@")
        return

    valor = float(input("Informe o valor do saque: "))
    transacao = Saque(valor)

    conta = recuperar_conta_cliente(cliente)
    if not conta:
        return

    cliente.realizar_transacao(conta, transacao)


def exibir_extrato(clientes):
    cpf = input("Informe o CPF do cliente: ")
    cliente = filtrar_cliente(cpf, clientes)

    if not cliente:
        print("\n@@@ Cliente não encontrado! @@@")
        return

    conta = recuperar_conta_cliente(cliente)
    if not conta:
        return

    print("\n================ EXTRATO ================")
    transacoes = conta.historico.transacoes

    extrato = ""
    if not transacoes:
        extrato = "Não foram realizadas movimentações."
    else:
        for transacao in transacoes:
            extrato += f"\n{transacao['tipo']}:\n\tR$ {transacao['valor']:.2f}"

    print(extrato)
    print(f"\nSaldo:\n\tR$ {conta.saldo:.2f}")
    print("==========================================")


def criar_cliente(clientes):
    cpf = input("Informe o CPF (somente número): ")
    cliente = filtrar_cliente(cpf, clientes)

    if cliente:
        print("\n@@@ Já existe cliente com esse CPF! @@@")
        return

    nome = input("Informe o nome completo: ")
    data_nascimento = input("Informe a data de nascimento (dd-mm-aaaa): ")
    endereco = input("Informe o endereço (logradouro, nro - bairro - cidade/sigla estado): ")

    cliente = PessoaFisica(nome=nome, data_nascimento=data_nascimento, cpf=cpf, endereco=endereco)

    clientes.append(cliente)

    print("\n=== Cliente criado com sucesso! ===")


def criar_conta(numero_conta, clientes, contas):
    cpf = input("Informe o CPF do cliente: ")
    cliente = filtrar_cliente(cpf, clientes)

    if not cliente:
        print("\n@@@ Cliente não encontrado, fluxo de criação de conta encerrado! @@@")
        return

    conta = ContaCorrente.nova_conta(cliente=cliente, numero=numero_conta)
    contas.append(conta)
    cliente.contas.append(conta)

    print("\n=== Conta criada com sucesso! ===")


def listar_contas(contas):
    for conta in contas:
        print("=" * 100)
        print(textwrap.dedent(str(conta)))


def main():
    clientes = []
    contas = []

    while True:
        opcao = menu()

        if opcao == "d":
            depositar(clientes)

        elif opcao == "s":
            sacar(clientes)

        elif opcao == "e":
            exibir_extrato(clientes)

        elif opcao == "nu":
            criar_cliente(clientes)

        elif opcao == "nc":
            numero_conta = len(contas) + 1
            criar_conta(numero_conta, clientes, contas)

        elif opcao == "lc":
            listar_contas(contas)

        elif opcao == "q":
            break

        else:
            print("\n@@@ Operação inválida, por favor selecione novamente a operação desejada. @@@")


main()

Criando um Sistema Bancário com Python - **Alterando enquanto aprendo**

saldo = 0
limite = 500
extrato = ""
numero_saques = 0
LIMITE_SAQUES = 3

#Contas cadastradas no Sistema: Joao:234 e Maria:432

print("Olá, Seja Bem-Vindo(a)")

while True:
    print("Por favor, insira o codigo de sua conta")
    conta = input()

    if conta == "234":
        print("Como vai, Joao? Deseja ver seu Saldo")
        saldo = 5000
        
        verificar = input().upper()
        if verificar == ("S"):
            print(f"Seu saldo e de {saldo}")
        break

    elif conta == "432":
        print("Como vai, Maria? Deseja ver seu Saldo")
        saldo = 1200

        verificar = input("").upper()
        if verificar == ("S"):
            print (f"Seu saldo e de {saldo}")
        break

    else:
        print("Conta não encontrada.")


menu = """

[d] Depositar
[s] Sacar
[e] Extrato
[q] Sair

=> """

while True:

    opcao = input(menu)

    if opcao == "d":
        valor = float(input("Informe o valor do depósito: "))

        if valor > 0:
            saldo += valor
            extrato += f"Depósito: R$ {valor:.2f}\n"

        else:
            print("Operação falhou! O valor informado é inválido.")

    elif opcao == "s":
        valor = float(input("Informe o valor do saque: "))

        excedeu_saldo = valor > saldo

        excedeu_limite = valor > limite

        excedeu_saques = numero_saques >= LIMITE_SAQUES

        if excedeu_saldo:
            print("Operação falhou! Você não tem saldo suficiente.")

        elif excedeu_limite:
            print("Operação falhou! O valor do saque excede o limite.")

        elif excedeu_saques:
            print("Operação falhou! Número máximo de saques excedido.")

        elif valor > 0:
            saldo -= valor
            extrato += f"Saque: R$ {valor:.2f}\n"
            numero_saques += 1

        else:
            print("Operação falhou! O valor informado é inválido.")

    elif opcao == "e":
        print("\n================ EXTRATO ================")
        print("Não foram realizadas movimentações." if not extrato else extrato)
        print(f"\nSaldo: R$ {saldo:.2f}")
        print("==========================================")

    elif opcao == "q":
        break

    else:
        print("Operação inválida, por favor selecione novamente a operação desejada.")

sistema bancario 2

import textwrap

def depositar(saldo, valor, extrato):
if valor > 0:
saldo += valor
extrato += f"Depósito:\tR$ {valor:.2f}\n"
print("\n=== Depósito realizado com sucesso! ===")
else:
print("\n@@@ Operação falhou! O valor informado é inválido. @@@")

return saldo, extrato
def sacar(*, saldo, valor, extrato, limite, numero_saques, limite_saques):
excedeu_saldo = valor > saldo
excedeu_limite = valor > limite
excedeu_saques = numero_saques >= limite_saques

if excedeu_saldo:
print("\n@@@ Operação falhou! Você não tem saldo suficiente. @@@")

elif excedeu_limite:
print("\n@@@ Operação falhou! O valor do saque excede o limite. @@@")

elif excedeu_saques:
print("\n@@@ Operação falhou! Número máximo de saques excedido. @@@")

elif valor > 0:
saldo -= valor
extrato += f"Saque:\t\tR$ {valor:.2f}\n"
numero_saques += 1
print("\n=== Saque realizado com sucesso! ===")

else:
print("\n@@@ Operação falhou! O valor informado é inválido. @@@")

return saldo, extrato, numero_saques
def exibir_extrato(saldo, extrato):
print("\n================ EXTRATO ================")
if not extrato:
print("Não foram realizadas movimentações.")
else:
print(extrato)
print(f"\nSaldo:\t\tR$ {saldo:.2f}")
print("==========================================")

def criar_usuario(usuarios):
cpf = input("Informe o CPF (somente números): ")
usuario = filtrar_usuario(cpf, usuarios)

if usuario:
print("\n@@@ Já existe usuário com esse CPF! @@@")
return

nome = input("Informe o nome completo: ")
data_nascimento = input("Informe a data de nascimento (dd-mm-aaaa): ")
endereco = input("Informe o endereço (logradouro, nro - bairro - cidade/sigla estado): ")

usuarios.append({"nome": nome, "data_nascimento": data_nascimento, "cpf": cpf, "endereco": endereco})

print("=== Usuário criado com sucesso! ===")
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

def criar_conta(agencia, numero_conta, usuarios):
cpf = input("Informe o CPF do usuário: ")
usuario = filtrar_usuario(cpf, usuarios)

if usuario:
print("\n=== Conta criada com sucesso! ===")
return {"agencia": agencia, "numero_conta": numero_conta, "usuario": usuario}

print("\n@@@ Usuário não encontrado, fluxo de criação de conta encerrado! @@@")
def listar_contas(contas):
for conta in contas:
linha = f"""
Agência:\t{conta['agencia']}
C/C:\t\t{conta['numero_conta']}
Titular:\t{conta['usuario']['nome']}
"""
print("=" * 100)
print(textwrap.dedent(linha))

def menu():
print("\n=== MENU ===")
print("d - Depositar")
print("s - Sacar")
print("e - Exibir Extrato")
print("nu - Novo Usuário")
print("nc - Nova Conta")
print("lc - Listar Contas")
print("q - Sair")

return input("Escolha uma opção: ").lower()
def main():
LIMITE_SAQUES = 3
AGENCIA = "0001"

saldo = 0
limite = 500
extrato = ""
numero_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, numero_saques = sacar(
        saldo=saldo,
        valor=valor,
        extrato=extrato,
        limite=limite,
        numero_saques=numero_saques,
        limite_saques=LIMITE_SAQUES,
    )

elif opcao == "e":
    exibir_extrato(saldo, extrato)

elif opcao == "nu":
    criar_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":
    listar_contas(contas)

elif opcao == "q":
    break

else:
    print("Operação inválida, por favor selecione novamente a operação desejada.")

Entrega de Desafio - Sistema Bancário

from datetime import datetime

menu = """
[d] Depositar
[s] Sacar
[e] Extrato
[a] Alterar Senha
[q] Sair

=> """

def formatar_extrato(extrato):
return "\n".join([f"{transacao['data']} - {transacao['descricao']}: R$ {transacao['valor']:.2f}" for transacao in extrato])

saldo = 0
limite = 500
extrato = []
numero_saques = 0
LIMITE_SAQUES = 3

nome = input("Por favor, informe seu nome: ")
senha = input("Crie uma senha para sua conta: ")
print(f"Bem-vindo ao Banco Python, {nome}!")

while True:
opcao = input(menu).lower().strip()

if opcao == "d":
    try:
        valor = float(input("Informe o valor do depósito: R$ "))

        if valor > 0:
            saldo += valor
            extrato.append({"data": datetime.now().strftime("%d/%m/%Y %H:%M:%S"), "descricao": "Depósito", "valor": valor})
            print(f"Depósito de R$ {valor:.2f} realizado com sucesso, {nome}!")

        else:
            print("Operação falhou! O valor informado é inválido.")
    except ValueError:
        print("Operação falhou! Por favor, insira um valor numérico válido.")

elif opcao == "s":
    try:
        senha_informada = input("Digite sua senha: ")
        if senha_informada != senha:
            print("Senha incorreta! Operação não autorizada.")
            continue

        valor = float(input("Informe o valor do saque: R$ "))

        excedeu_saldo = valor > saldo
        excedeu_limite = valor > limite
        excedeu_saques = numero_saques >= LIMITE_SAQUES

        if excedeu_saldo:
            print("Operação falhou! Você não tem saldo suficiente.")

        elif excedeu_limite:
            print("Operação falhou! O valor do saque excede o limite.")

        elif excedeu_saques:
            print("Operação falhou! Número máximo de saques excedido.")

        elif valor > 0:
            saldo -= valor
            extrato.append({"data": datetime.now().strftime("%d/%m/%Y %H:%M:%S"), "descricao": "Saque", "valor": valor})
            numero_saques += 1
            print(f"Saque de R$ {valor:.2f} realizado com sucesso, {nome}!")

        else:
            print("Operação falhou! O valor informado é inválido.")
    except ValueError:
        print("Operação falhou! Por favor, insira um valor numérico válido.")

elif opcao == "e":
    senha_informada = input("Digite sua senha: ")
    if senha_informada != senha:
        print("Senha incorreta! Operação não autorizada.")
        continue

    print("\n================ EXTRATO ================")
    if not extrato:
        print("Não foram realizadas movimentações.")
    else:
        print(formatar_extrato(extrato))
    print(f"\nSaldo: R$ {saldo:.2f}")
    print("==========================================")

elif opcao == "a":
    senha_informada = input("Digite sua senha atual: ")
    if senha_informada == senha:
        nova_senha = input("Digite sua nova senha: ")
        senha = nova_senha
        print("Senha alterada com sucesso!")
    else:
        print("Senha incorreta! Operação não autorizada.")

elif opcao == "q":
    print(f"Obrigado por usar o Banco Python, {nome}. Até logo!")
    break

else:
    print("Operação inválida, por favor selecione novamente a operação desejada.")

Desafio 1

from abc import ABC, abstractclassmethod, abstractproperty
from datetime import datetime

class Cliente:
def init(self, endereco):
self.endereco = endereco
self.contas = []

def realizar_transacao(self, conta, transacao):
    transacao.registrar(conta)

def adicionar_conta(self, conta):
    self.contas.append(conta)

class PessoaFisica(Cliente):
def init(self, nome, data_nascimento, cpf, endereco):
super().init(endereco)
self.nome = nome
self.data_nascimento = data_nascimento
self.cpf = cpf

class Conta:
def init(self, numero, cliente):
self._saldo = 0
self._numero = numero
self._agencia = "0001"
self._cliente = cliente
self._historico = Historico()

@classmethod
def nova_conta(cls, cliente, numero):
    return cls(numero, cliente)

@property
def saldo(self):
    return self._saldo

@property
def numero(self):
    return self._numero

@property
def agencia(self):
    return self._agencia

@property
def cliente(self):
    return self._cliente

@property
def historico(self):
    return self._historico

def sacar(self, valor):
    saldo = self.saldo
    excedeu_saldo = valor > saldo

    if excedeu_saldo:
        print("\n@@@ Saldo insuficiente. @@@")

    elif valor > 0:
        self._saldo -= valor
        print("\n=== Saque realizado com sucesso! ===")
        return True

    else:
        print("\n@@@ Operação falhou! O valor digitado é inválido. @@@")

    return False

def depositar(self, valor):
    if valor > 0:
        self._saldo += valor
        print("\n=== Depósito realizado com sucesso! ===")
    else:
        print("\n@@@ Operação falhou! O valor digitado é inválido. @@@")
        return False

    return True

class ContaCorrente(Conta):
def init(self, numero, cliente, limite=500, limite_saques=3):
super().init(numero, cliente)
self.limite = limite
self.limite_saques = limite_saques

def sacar(self, valor):
    numero_saques = len(
        [transacao for transacao in self.historico.transacoes if transacao["tipo"] == Saque.__name__]
    )

    excedeu_limite = valor > self.limite
    excedeu_saques = numero_saques >= self.limite_saques

    if excedeu_limite:
        print("\n@@@ Operação falhou! O valor do saque excedeu o limite. @@@")

    elif excedeu_saques:
        print("\n@@@ Operação falhou! Número máximo de saques excedido. @@@")

    else:
        return super().sacar(valor)

    return False

def __str__(self):
    return f"""\
        Agência:\t{self.agencia}
        C/C:\t\t{self.numero}
        Titular:\t{self.cliente.nome}
    """

class Historico:
def init(self):
self._transacoes = []

@property
def transacoes(self):
    return self._transacoes

def adicionar_transacao(self, transacao):
    self._transacoes.append(
        {
            "tipo": transacao.__class__.__name__,
            "valor": transacao.valor,
            "data": datetime.now().strftime("%d-%m-%Y %H:%M:%s"),
        }
    )

class Transacao(ABC):
@Property
@abstractproperty
def valor(self):
pass

@abstractclassmethod
def registrar(self, conta):
    pass

class Saque(Transacao):
def init(self, valor):
self._valor = valor

@property
def valor(self):
    return self._valor

def registrar(self, conta):
    sucesso_transacao = conta.sacar(self.valor)

    if sucesso_transacao:
        conta.historico.adicionar_transacao(self)

class Deposito(Transacao):
def init(self, valor):
self._valor = valor

@property
def valor(self):
    return self._valor

def registrar(self, conta):
    sucesso_transacao = conta.depositar(self.valor)

    if sucesso_transacao:
        conta.historico.adicionar_transacao(self)

Correção

no desafio V_2. ao compilar, a função de depósito apresenta alguns erros. Maiormente causado pela inserção da data. Seria interessante um programa sem a data, e outro com. Para que o erro seja resolvido e o conhecimento aproveitado quando alguém tentar baixar e executar o código para teste. Dado que o código está todo correto!

Desafio do projeto: "Otimizando o Sistema Bancário com Funções Python"

Neste projeto o professor apresentou as possíveis configurações do código e a partir dos códigos apresentados foi possível fazer o exercício da replicação, compreendendo a lógica da programação e a funcionalidade dos códigos bem como o funcionamento do Python. Segue abaixo o código baseado na aula do desafio do projeto e em seguida a execução que fiz com exemplos que fui utilizando.

import textwrap

def menu():
    menu = """\n
    ============ MENU ===========
    [d]\tDepositar
    [s]\tSacar
    [e]\tExtrato
    [nc]\tNova conta
    [lc]\tListar contas
    [nu]\tNovo usuário
    [q]\tSair
    """
    return input(textwrap.dedent(menu))

def depositar(saldo, valor, extrato, /):


    if valor > 0:
        saldo += valor
        extrato += f"Depósito:\tR$  {valor:.2f}\n"
        print("\n**** Depósito realizado com sucesso! ****")
    else:
        print("\n### Operação falhou! O valor informado é inválido. ###")
    
    return saldo, extrato

def sacar(*, saldo, valor, extrato, limite, numero_saques, limite_saques):
    excedeu_saldo = valor > saldo
    excedeu_limite = valor > limite
    excedeu_saques = numero_saques > limite_saques

    if excedeu_saldo:
        print("\n**** Operação falhou! Você não tem saldo suficiente. ****")

    elif excedeu_limite:
        print("\n&&&& Operação falhou! O valor do saque excedeu o limite. &&&&")
    
    elif excedeu_saques:
        print("\n@@@ Operação falhou! Número máximo de saques excedido. @@@")
    
    elif valor > 0:
        saldo -= valor
        extrato += f"Saque:\t\tR$  {valor:.2f}\n"
        numero_saques += 1
        print("\n%%%% Saque realizado com sucesso! %%%%")
    
    else: 
        print("\n#### Operação falhou! O valor informado é inválido. ####")
    
    return saldo, extrato

def exibir_extrato(saldo, /, *, extrato):
    print("\n============= EXTRATO ================")
    print("Não foram realizados movimentações." if not extrato else extrato)
    print(f"\nSaldo:\t\tR$ {saldo:.2f}")
    print("==================================")

def criar_usuario(usuarios):
    cpf = input("Informe o CPF (somente número): ")
    usuario = filtrar_usuario(cpf, usuarios)
    
    if usuario:
        print("\n$$$$ Já existe usuário com esse CPF! $$$$")
        return
    
    nome = input("Informe o nome completo: ")
    data_nascimento = input("Informe a data de nascimento (dd-mm-aaaa): ")
    endereco = input("Informe o endereço (lograduro, nro - bairro - cidade/sigla estado): ")

    usuarios.append({"nome": nome, "data_nascimento": data_nascimento, "cpf": cpf, "endereco": endereco})

    print("@@@@ Usuário criado com sucesso! @@@@")

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 

def criar_conta(agencia, numero_conta, usuarios):
    cpf = input("Informe o CPF do usuário: ")
    usuario = filtrar_usuario(cpf, usuarios)

    if usuario:
        print("\n**** Conta criada com sucesso! ****")
        return {"agencia": agencia, "numero_conta": numero_conta, "usuario": usuario}
    
    print("\n#### Usuário não encontrado, fluxo de criação de conta encerrado! ####")

def listar_contas(contas):
    for conta in contas:
        linha = f"""\
            Agência:\t{conta['agencia']}
            C/C:\t\t{conta['numero_conta']}
            Titular:\t{conta['usuario']['nome']}
        """
        print("=" * 100)
        print(textwrap.dedent(linha))
    
def main():
    LIMITE_SAQUES = 3
    AGENCIA = "0001"

    saldo = 0
    limite = 500
    extrato = ""
    numero_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,
                numero_saques=numero_saques,
                limite_saques=LIMITE_SAQUES,
            )
        
        elif opcao == "e":
            exibir_extrato(saldo, extrato=extrato)
        
        elif opcao == "nu":
            criar_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":
            listar_contas(contas)
        
        elif opcao == "q":
            break

        else:
            print("Operação inválido, por favor selecione novamente a operação desejada.")
main()

Agora segue a execução das funções do código com exemplos que fui inserindo:

PS C:\Users\Rafael> & C:/Users/Rafael/AppData/Local/Programs/Python/Python312/python.exe c:/Users/Rafael/desafio.py

============ MENU ===========
[d] Depositar
[s] Sacar
[e] Extrato
[nc] Nova conta
[lc] Listar contas
[nu] Novo usuário
[q] Sair
d
Informe o valor do depósito: 100

**** Depósito realizado com sucesso! ****

============ MENU ===========
[d] Depositar
[s] Sacar
[e] Extrato
[nc] Nova conta
[lc] Listar contas
[nu] Novo usuário
[q] Sair
nc
Informe o CPF do usuário: 123

Usuário não encontrado, fluxo de criação de conta encerrado!

============ MENU ===========
[d] Depositar
[s] Sacar
[e] Extrato
[nc] Nova conta
[lc] Listar contas
[nu] Novo usuário
[q] Sair
nu
Informe o CPF (somente número): 123
Informe o nome completo: Raphael do Amaral Vaz
Informe a data de nascimento (dd-mm-aaaa): 05-05-2024
Informe o endereço (lograduro, nro - bairro - cidade/sigla estado): Rua Odette de Oliveira. 500 - Jardim da Penha - Vitória/ES
@@@@ Usuário criado com sucesso! @@@@

============ MENU ===========
[d] Depositar
[s] Sacar
[e] Extrato
[nc] Nova conta
[lc] Listar contas
[nu] Novo usuário
[q] Sair
nc
Informe o CPF do usuário: 123

**** Conta criada com sucesso! ****

============ MENU ===========
[d] Depositar
[s] Sacar
[e] Extrato
[nc] Nova conta
[lc] Listar contas
[nu] Novo usuário
[q] Sair
lc

Agência: 0001
C/C: 1
Titular: Raphael do Amaral Vaz

============ MENU ===========
[d] Depositar
[s] Sacar
[e] Extrato
[nc] Nova conta
[lc] Listar contas
[nu] Novo usuário
[q] Sair
nc
Informe o CPF do usuário: 123

**** Conta criada com sucesso! ****

============ MENU ===========
[d] Depositar
[s] Sacar
[e] Extrato
[nc] Nova conta
[lc] Listar contas
[nu] Novo usuário
[q] Sair
lc

Agência: 0001
C/C: 1
Titular: Raphael do Amaral Vaz

====================================================================================================
Agência: 0001
C/C: 2
Titular: Raphael do Amaral Vaz

============ MENU ===========
[d] Depositar
[s] Sacar
[e] Extrato
[nc] Nova conta
[lc] Listar contas
[nu] Novo usuário
[q] Sair
nu
Informe o CPF (somente número): 123

$$$$ Já existe usuário com esse CPF! $$$$

============ MENU ===========
[d] Depositar
[s] Sacar
[e] Extrato
[nc] Nova conta
[lc] Listar contas
[nu] Novo usuário
[q] Sair
nu
Informe o CPF (somente número): 456
Informe o nome completo: João Carvalho
Informe a data de nascimento (dd-mm-aaaa): 31-10-1994
Informe o endereço (lograduro, nro - bairro - cidade/sigla estado): Rua Silva Pinto, 134 aptº 201 - Vila Isabel - Rio de Janeiro/RJ
@@@@ Usuário criado com sucesso! @@@@

============ MENU ===========
[d] Depositar
[s] Sacar
[e] Extrato
[nc] Nova conta
[lc] Listar contas
[nu] Novo usuário
[q] Sair
nc
Informe o CPF do usuário: 456

**** Conta criada com sucesso! ****

============ MENU ===========
[d] Depositar
[s] Sacar
[e] Extrato
[nc] Nova conta
[lc] Listar contas
[nu] Novo usuário
[q] Sair
lc

Agência: 0001
C/C: 1
Titular: Raphael do Amaral Vaz

====================================================================================================
Agência: 0001
C/C: 2
Titular: Raphael do Amaral Vaz

====================================================================================================
Agência: 0001
C/C: 3
Titular: João Carvalho

============ MENU ===========
[d] Depositar
[s] Sacar
[e] Extrato
[nc] Nova conta
[lc] Listar contas
[nu] Novo usuário
[q] Sair

Entrega do desafio - sistema bancário 1

menu = """

[d] Depositar
[s] Sacar
[e] Extrato
[q] Sair

=> """

saldo = 0
limite = 500
extrato = ""
numero_saques = 0
LIMITE_SAQUES = 3

while True:

opcao = input(menu)

if opcao == "d":
    valor = float(input("Informe o valor de depósito: "))

    if valor > 0:
        saldo += valor
        extrato += f"Depósito: R$ {valor:.2f}\n"

    else:
        print("Erro na operação! O valor informado é inválido.")

elif opcao == "s":
    valor = float(input("Informe o valor de saque: "))

    excedeu_saldo = valor > saldo

    excedeu_limite = valor > limite

    excedeu_saques = numero_saques >= LIMITE_SAQUES

    if excedeu_saldo:
        print("Erro na operação! Você não tem saldo suficiente.")

    elif excedeu_limite:
        print("Erro na operação! O valor do saque excede o limite diário permitido.")

    elif excedeu_saques:
        print("Erro na operação! Número máximo de saques diário excedido.")

    elif valor > 0:
        saldo -= valor
        extrato += f"Saque: R$ {valor:.2f}\n"
        numero_saques += 1

    else:
        print("Erro na operação! O valor informado é inválido.")

elif opcao == "e":
    print("\n================ EXTRATO ================")
    print("Não houve movimentações." if not extrato else extrato)
    print(f"\nSaldo: R$ {saldo:.2f}")
    print("==========================================")

elif opcao == "q":
    break

else:
    print("Erro na operação, por favor selecione novamente a opção desejada.")

Sistema Versão 1

class Banco:
def init(self):
self.saldo = 0
self.depositos = []
self.saques = []

def deposito(self, valor):
    if valor > 0:
        self.saldo += valor
        self.depositos.append(valor)
        return f"Depósito de R$ {valor:.2f} realizado com sucesso."
    else:
        return "Valor inválido para depósito."

def saque(self, valor):
    if valor > 0 and valor <= 500:
        if self.saldo >= valor:
            self.saldo -= valor
            self.saques.append(valor)
            return f"Saque de R$ {valor:.2f} realizado com sucesso."
        else:
            return "Saldo insuficiente para saque."
    else:
        return "Valor inválido para saque."

def extrato(self):
    if not self.depositos and not self.saques:
        return "Nenhuma movimentação financeira."
    else:
        extrato = "\n".join([f"Depósito: R$ {d:.2f}" for d in self.depositos])
        extrato += "\n" + "\n".join([f"Saque: R$ {s:.2f}" for s in self.saques])
        extrato += f"\nSaldo atual: R$ {self.saldo:.2f}"
        return extrato

def menu(self):
    while True:
        print("\nMenu:")
        print("[s] Sacar")
        print("[d] Depositar")
        print("[e] Extrato")
        print("[q] Sair da operação")

        opcao = input("Escolha uma opção: ").lower()

        if opcao == "s":
            valor_saque = float(input("Digite o valor a ser sacado: "))
            print(self.saque(valor_saque))
        elif opcao == "d":
            valor_deposito = float(input("Qual valor a ser depositado? "))
            print(self.deposito(valor_deposito))
        elif opcao == "e":
            print(self.extrato())
        elif opcao == "q":
            print("Operação encerrada.")
            break
        else:
            print("Opção inválida. Tente novamente.")

Exemplo de uso:

banco = Banco()
banco.menu()

Sistema bancário com POO sem gerenciamento de contas

No desafio de sistema bancário utilizando POO é possível que um usuário cadastrado possua uma ou mais contas porém não há nenhuma validação no momento de utilizar estas contas.

exemplo:
--usuário que possui 3 contas, numero 1, 2, e 3 não consegue definir um deposito para a conta de numero 3 ou qualquer outra, nem consegue sacar de nenhuma conta especifica. fazendo com que a funcionalidade de criação de contas não seja bem aproveitada.

Não encontro conteúdo Formação Python

Estou fazendo o curso de formação Python da DIO.pro, nas aulas ele deu uma url do repositório aqui no Git, mas não tem arquivos nenhum quando abro o repositório informado.

Entrega sistema bancário otimizado

import textwrap

def menu():
menu = """\n
================ MENU ================
[d]\tDepositar
[s]\tSacar
[e]\tExtrato
[nc]\tNova conta
[lc]\tListar contas
[nu]\tNovo usuário
[q]\tSair
=> """
return input(textwrap.dedent(menu))

def depositar(saldo, valor, extrato, /):
if valor > 0:
saldo += valor
extrato += f"Depósito:\tR$ {valor:.2f}\n"
print("\n=== Depósito realizado com sucesso! ===")
else:
print("\n@@@ Erro na operação! O valor informado é inválido. @@@")

return saldo, extrato

def sacar(*, saldo, valor, extrato, limite, numero_saques, limite_saques):
excedeu_saldo = valor > saldo
excedeu_limite = valor > limite
excedeu_saques = numero_saques >= limite_saques

if excedeu_saldo:
    print("\n@@@ Erro na operação! Você não tem saldo suficiente. @@@")

elif excedeu_limite:
    print("\n@@@ Erro na operação! O valor do saque excede o limite. @@@")

elif excedeu_saques:
    print("\n@@@ Operação falhou! Número máximo de saques excedido. @@@")

elif valor > 0:
    saldo -= valor
    extrato += f"Saque:\t\tR$ {valor:.2f}\n"
    numero_saques += 1
    print("\n=== Saque realizado com sucesso! ===")

else:
    print("\n@@@ Erro na operação! O valor informado é inválido. @@@")

return saldo, extrato

def exibir_extrato(saldo, /, *, extrato):
print("\n================ EXTRATO ================")
print("Não foram realizadas movimentações." if not extrato else extrato)
print(f"\nSaldo:\t\tR$ {saldo:.2f}")
print("==========================================")

def criar_usuario(usuarios):
cpf = input("Informe o CPF (somente os números): ")
usuario = filtrar_usuario(cpf, usuarios)

if usuario:
    print("\n@@@ Já existe usuário com este CPF! @@@")
    return

nome = input("Informe o seu nome completo: ")
data_nascimento = input("Informe sua data de nascimento (dd-mm-aaaa): ")
endereco = input("Informe o seu endereço (logradouro, nro - bairro - cidade/sigla estado): ")

usuarios.append({"nome": nome, "data_nascimento": data_nascimento, "cpf": cpf, "endereco": endereco})

print("=== Usuário criado com exito! ===")

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

def criar_conta(agencia, numero_conta, usuarios):
cpf = input("Informe o CPF do usuário: ")
usuario = filtrar_usuario(cpf, usuarios)

if usuario:
    print("\n=== Conta criada com sucesso! ===")
    return {"agencia": agencia, "numero_conta": numero_conta, "usuario": usuario}

print("\n@@@ Usuário não localizado, fluxo de criação de conta interrompido! @@@")

def listar_contas(contas):
for conta in contas:
linha = f"""
Agência:\t{conta['agencia']}
C/C:\t\t{conta['numero_conta']}
Titular:\t{conta['usuario']['nome']}
"""
print("=" * 100)
print(textwrap.dedent(linha))

def main():
LIMITE_SAQUES = 3
AGENCIA = "0001"

saldo = 0
limite = 500
extrato = ""
numero_saques = 0
usuarios = []
contas = []

while True:
    opcao = menu()

    if opcao == "d":
        valor = float(input("Digite o valor do depósito: "))

        saldo, extrato = depositar(saldo, valor, extrato)

    elif opcao == "s":
        valor = float(input("Digite o valor do saque: "))

        saldo, extrato = sacar(
            saldo=saldo,
            valor=valor,
            extrato=extrato,
            limite=limite,
            numero_saques=numero_saques,
            limite_saques=LIMITE_SAQUES,
        )

    elif opcao == "e":
        exibir_extrato(saldo, extrato=extrato)

    elif opcao == "nu":
        criar_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":
        listar_contas(contas)

    elif opcao == "q":
        break

    else:
        print("Erro na operação, por gentileza selecione novamente a operação desejada.")

main()

Projeto DIO - Sistema bancário v1

menu = '''

[d] Depositar
[s] Sacar
[e] Extrato
[q] Sair

'''
saldo = 0
limite = 500
extrato = ""
numero_saques = 0
LIMITE_SAQUES = 3

while True:

opcao = input(menu)

if opcao == "d":
    valor = float(input("Informe o valor de deposito: "))

    if valor > 0:
        saldo += valor
        print("R$", valor, "depositado com sucesso!")
        extrato += f"Depósito: R$ {valor:.2f}\n"
        
    else:
        print("Operação falhou! O valor informado é inválido. ")

elif opcao == "s":
    valor = float(input("Informe o valor de saque: "))
    print("R$", valor, "sacado com sucesso!")

    excedeu_saldo = valor > saldo
    
    excedeu_limite = valor > limite

    excedeu_saques = numero_saques >= LIMITE_SAQUES

    if excedeu_saldo:
        print("Operação falhou! Você não tem saldo suficiente. ")

    elif excedeu_limite:
        print("Operação falhou! O valor do saque excede o limite. ")

    elif excedeu_saques:
        print("Operação falhou! Número máximo de saques excedido. ")

    elif valor > 0:
        saldo -= valor
        extrato += f"Saque: R$ {valor:.2f}\n"
        numero_saques += 1

    else:
        print("Operação falhou! O valor informado é invalido. ")

elif opcao == "e":
    print("\n========== EXTRATO ==========")
    print("Não foram realizadas movimentações." if not extrato else extrato)
    print(f"\nSaldo: R# {saldo:.2f}")
    print("====================")

elif opcao == "q":
    print(f"Obrigado por utilizar nosso sistema! Até breve. ")

else:
    print("Operação inválida, por favor selecione novamente a operação desejada. ")

Desafio 2

import textwrap
from abc import ABC, abstractclassmethod, abstractproperty
from datetime import datetime

class Cliente:
def init(self, endereco):
self.endereco = endereco
self.contas = []

def realizar_transacao(self, conta, transacao):
    transacao.registrar(conta)

def adicionar_conta(self, conta):
    self.contas.append(conta)

class PessoaFisica(Cliente):
def init(self, nome, data_nascimento, cpf, endereco):
super().init(endereco)
self.nome = nome
self.data_nascimento = data_nascimento
self.cpf = cpf

class Conta:
def init(self, numero, cliente):
self._saldo = 0
self._numero = numero
self._agencia = "0001"
self._cliente = cliente
self._historico = Historico()

@classmethod
def nova_conta(cls, cliente, numero):
    return cls(numero, cliente)

@property
def saldo(self):
    return self._saldo

@property
def numero(self):
    return self._numero

@property
def agencia(self):
    return self._agencia

@property
def cliente(self):
    return self._cliente

@property
def historico(self):
    return self._historico

def sacar(self, valor):
    saldo = self.saldo
    excedeu_saldo = valor > saldo

    if excedeu_saldo:
        print("\n@@@ Operação falhou! Saldo insuficiente. @@@")

    elif valor > 0:
        self._saldo -= valor
        print("\n=== Saque realizado com sucesso! ===")
        return True

    else:
        print("\n@@@ Operação falhou! O valor digitado é inválido. @@@")

    return False

def depositar(self, valor):
    if valor > 0:
        self._saldo += valor
        print("\n=== Depósito realizado com sucesso! ===")
    else:
        print("\n@@@ Operação falhou! O valor digitado é inválido. @@@")
        return False

    return True

class ContaCorrente(Conta):
def init(self, numero, cliente, limite=500, limite_saques=3):
super().init(numero, cliente)
self._limite = limite
self._limite_saques = limite_saques

def sacar(self, valor):
    numero_saques = len(
        [transacao for transacao in self.historico.transacoes if transacao["tipo"] == Saque.__name__]
    )

    excedeu_limite = valor > self._limite
    excedeu_saques = numero_saques >= self._limite_saques

    if excedeu_limite:
        print("\n@@@ Operação falhou! O valor do saque excedeu o limite. @@@")

    elif excedeu_saques:
        print("\n@@@ Operação falhou! Número máximo de saques excedido. @@@")

    else:
        return super().sacar(valor)

    return False

def __str__(self):
    return f"""\
        Agência:\t{self.agencia}
        C/C:\t\t{self.numero}
        Titular:\t{self.cliente.nome}
    """

class Historico:
def init(self):
self._transacoes = []

@property
def transacoes(self):
    return self._transacoes

def adicionar_transacao(self, transacao):
    self._transacoes.append(
        {
            "tipo": transacao.__class__.__name__,
            "valor": transacao.valor,
            "data": datetime.now().strftime("%d-%m-%Y %H:%M:%s"),
        }
    )

class Transacao(ABC):
@Property
@abstractproperty
def valor(self):
pass

@abstractclassmethod
def registrar(self, conta):
    pass

class Saque(Transacao):
def init(self, valor):
self._valor = valor

@property
def valor(self):
    return self._valor

def registrar(self, conta):
    sucesso_transacao = conta.sacar(self.valor)

    if sucesso_transacao:
        conta.historico.adicionar_transacao(self)

class Deposito(Transacao):
def init(self, valor):
self._valor = valor

@property
def valor(self):
    return self._valor

def registrar(self, conta):
    sucesso_transacao = conta.depositar(self.valor)

    if sucesso_transacao:
        conta.historico.adicionar_transacao(self)

def menu():
menu = """\n
================ MENU ================
[d]\tDepositar
[s]\tSacar
[e]\tExtrato
[nc]\tNova conta
[lc]\tListar contas
[nu]\tNovo usuário
[q]\tSair
=> """
return input(textwrap.dedent(menu))

def filtrar_cliente(cpf, clientes):
clientes_filtrados = [cliente for cliente in clientes if cliente.cpf == cpf]
return clientes_filtrados[0] if clientes_filtrados else None

def recuperar_conta_cliente(cliente):
if not cliente.contas:
print("\n@@@ Cliente não possui conta! @@@")
return

# FIXME: não permite cliente escolher a conta
return cliente.contas[0]

def depositar(clientes):
cpf = input("Informe o CPF do cliente: ")
cliente = filtrar_cliente(cpf, clientes)

if not cliente:
    print("\n@@@ Cliente não encontrado! @@@")
    return

valor = float(input("Informe o valor do depósito: "))
transacao = Deposito(valor)

conta = recuperar_conta_cliente(cliente)
if not conta:
    return

cliente.realizar_transacao(conta, transacao)

def sacar(clientes):
cpf = input("Informe o CPF do cliente: ")
cliente = filtrar_cliente(cpf, clientes)

if not cliente:
    print("\n@@@ Cliente não encontrado! @@@")
    return

valor = float(input("Informe o valor do saque: "))
transacao = Saque(valor)

conta = recuperar_conta_cliente(cliente)
if not conta:
    return

cliente.realizar_transacao(conta, transacao)

def exibir_extrato(clientes):
cpf = input("Informe o CPF do cliente: ")
cliente = filtrar_cliente(cpf, clientes)

if not cliente:
    print("\n@@@ Cliente não encontrado! @@@")
    return

conta = recuperar_conta_cliente(cliente)
if not conta:
    return

print("\n================ EXTRATO ================")
transacoes = conta.historico.transacoes

extrato = ""
if not transacoes:
    extrato = "Não foram realizadas movimentações."
else:
    for transacao in transacoes:
        extrato += f"\n{transacao['tipo']}:\n\tR$ {transacao['valor']:.2f}"

print(extrato)
print(f"\nSaldo:\n\tR$ {conta.saldo:.2f}")
print("==========================================")

def criar_cliente(clientes):
cpf = input("Informe o CPF (somente número): ")
cliente = filtrar_cliente(cpf, clientes)

if cliente:
    print("\n@@@ Já existe cliente com esse CPF! @@@")
    return

nome = input("Informe o nome completo: ")
data_nascimento = input("Informe a data de nascimento (dd-mm-aaaa): ")
endereco = input("Informe o endereço (logradouro, nro - bairro - cidade/sigla estado): ")

cliente = PessoaFisica(nome=nome, data_nascimento=data_nascimento, cpf=cpf, endereco=endereco)

clientes.append(cliente)

print("\n=== Cliente criado com sucesso! ===")

def criar_conta(numero_conta, clientes, contas):
cpf = input("Informe o CPF do cliente: ")
cliente = filtrar_cliente(cpf, clientes)

if not cliente:
    print("\n@@@ Cliente não encontrado, cadastrar cliente! @@@")
    return

conta = ContaCorrente.nova_conta(cliente=cliente, numero=numero_conta)
contas.append(conta)
cliente.contas.append(conta)

print("\n=== Conta criada com sucesso! ===")

def listar_contas(contas):
for conta in contas:
print("=" * 100)
print(textwrap.dedent(str(conta)))

def main():
clientes = []
contas = []

while True:
    opcao = menu()

    if opcao == "d":
        depositar(clientes)

    elif opcao == "s":
        sacar(clientes)

    elif opcao == "e":
        exibir_extrato(clientes)

    elif opcao == "nu":
        criar_cliente(clientes)

    elif opcao == "nc":
        numero_conta = len(contas) + 1
        criar_conta(numero_conta, clientes, contas)

    elif opcao == "lc":
        listar_contas(contas)

    elif opcao == "q":
        break

    else:
        print("\n@@@ Operação inválida, por gentileza, repetir a operação desejada. @@@")

main()

sistema bancario

menu = """
[d] depositar
[s] sacar
[e] extrato
[q] sair

=> """

saldo = 0
limite = 500
extrato = ""
numero_saque = 0
LIMITE_SAQUE = 3

while True:
opcao = input(menu)

if opcao == "d":
   deposito = int(input("digite o valor a ser depositado"))

 
   if  deposito > 0:
        saldo += deposito
        extrato += f"Depósito: R$ {deposito:.2f}\n"
       
   else:
        print("Operação falhou! O valor informado é inválido.")


elif opcao == "s":
      valor_saque = float(input("Informe o valor do saque:"))
     
      excedeu_saldo = valor_saque > saldo

      limite1 = valor_saque > limite

      limite_saques = numero_saque >= LIMITE_SAQUE
      
      if excedeu_saldo:
        print("Operação falhou! Você não tem saldo suficiente.")

      elif limite1:
        print("Operação falhou! O valor do saque excede o limite.")

      elif limite_saques:
        print("Operação falhou! Número máximo de saques excedido.")
    
      
      
      elif valor_saque > 0:
        saldo -= valor_saque
        extrato += f"Saque: R$ {valor_saque:.2f}\n"
        numero_saque += 1

      else:
        print("Operação falhou! O valor informado é inválido.")
   
elif opcao == "e":
    print("\n================ EXTRATO ================")
    print("Não foram realizadas movimentações." if not extrato else extrato)
    print(f"\nSaldo: R$ {saldo:.2f}")
    print("===================================")        

elif opcao == "q":
  break

else:
   print("opcao invalida , por favor selecione novamente a operação correta")

Criando Sistema bancário com PYTHON - Bootcamp VIVO DIO

BOOTCAMP VIVO PYTHON - POSTANDO TRABALHO PARA FAZER A ENTREGA...

CRIANDO UM SISTEMA BANCÁRIO COM PYTHON

DEVE TER OPÇÃO DE DEPÓSITO (APENAS VALORES POSITIVOS). DEVEM SER ARMAZENADOS EM UMA VARIÁVEL E EXIBIDOS NA OPERAÇÃO EXTRATO.

OPÇÃO SAQUE. PERMITIDOS 3 SAQUES DIÁRIOS COM LIMITE DE R$500,00 POR SAQUE. CASO NÃO HAJA SALDO, O SISTEMA DEVE EXIBIR MENSAGEM INFORMANDO QUE NÃO É POSSÍVEL O SAQUE POR FALTA DE SALDO. SAQUES ARMAZENADOS EM VARIÁVEL E EXIBIDOS NO EXTRATO.

OPÇÃO EXTRATO DEVE LISTAR DEPÓSITOS E SAQUES REALIZADOS. NO FINAL DEVE SER EXIBIDO O SALDO ATUAL DA CONTA. VALORES DEVEM SER EXIBIDOS COM O FORMATO "R$ 0000.00 (R$ 1500.00)"

menu = """

[d] DEPOSITAR
[s] SACAR
[e] EXTRATO
[q] SAIR

=> """

saldo = 0
limite = 500
extrato = ""
numero_saques = 0
LIMITE_SAQUES = 3

while True:
opcao = input(menu)
if opcao == "d":
valor = float(input("INFORME O VALOR DO DEPÓSITO: "))
if valor > 0:
saldo += valor
extrato += f"DEPÓSITO : R$ {valor:.2f}\n"
else:
print("OPERAÇÃO FALHOU! VALOR INFORMADO É INVÁLIDO.")

elif opcao == "s":
	valor = float(input("INFORME O VALOR DO SAQUE: "))
	excedeu_saldo = valor > saldo
	excedeu_limite = valor > limite
	excedeu_saques = numero_saques >= LIMITE_SAQUES
	
	if excedeu_saldo:
		print("OPERAÇÃO FALHOU! VOCÊ NÃO TEM SALDO SUFICIENTE.")
	elif excedeu_limite:
		print("OPERAÇÃO FALHOU! O VALOR DO SAQUE EXCEDE O LIMTE.")
	elif excedeu_saques:
		print(OPERAÇÃO FALHOU! NÚMERO MÁXIMO DE SAQUES EXCEDIDO.")
	elif valor > 0:
		saldo -= valor
		extrato += f"SAQUE: R$ {valor:.2f}\n"
		numero_saques += 1
	else:
		print("OPERAÇÃO FALHOU! O VALOR INFORMADO É INVÁLIDO.")

elif opcao == "e":
	print("\n=============== EXTRATO ===================") # ( \n ) COLOCADO PARA PULAR A LINHA...
	print("NÃO FORAM REALIZADAS MOVIMENTAÇÕES." if not extrato else extrato)
	print(f"\nSALDO: R$ {saldo:.2f}")
	print("============================================")

elif opcao == "q":
	break

else:
	print("OPERAÇÃO INVÁLIDA, POR FAVOR SELECIONE NOVAMENTE A OPERAÇÃO DESEJADA.")

Introduzir valor para a chave data_extenso

Código em questão:

01 - Estrutura de dados/05 - Funções/03_args_kwargs.py

Solicito revisão da linha 9 do código "03_args_kwargs.py", dentro da sub-pasta "05 - Funções", na pasta "01 - Estrutura de dados", pois não consta o valor da chave data_extenso. Na aula gravada o Guilherme mudou o arquivo, mas aparentemente não ficou gravado.

Agradeço pela atenção!

Banco Teste

class ContaBancaria:
def init(self):
self.saldo = 0
self.saques_feitos = 0
self.saques_diarios = 0
self.extrato = []

def depositar(self, valor):
    self.saldo += valor
    self.extrato.append(f"Depósito de R${valor:.2f}")

def sacar(self, valor):
    if self.saques_feitos < 3 and self.saques_diarios < 3 and valor <= 500 and valor <= self.saldo:
        self.saldo -= valor
        self.saques_feitos += 1
        self.saques_diarios += 1
        self.extrato.append(f"Saque de R${valor:.2f}")
        print("Saque realizado com sucesso!")
    else:
        print("Saque não pode ser realizado.")

def gerar_extrato(self):
    print("Extrato:")
    for operacao in self.extrato:
        print(operacao)
    print(f"Saldo atual: R${self.saldo:.2f}")

def reiniciar_saques_diarios(self):
    self.saques_diarios = 0

def main():
conta = ContaBancaria()

while True:
    print("\n" * 2)  # Adiciona 20 linhas em branco para centralizar o menu

    print("\n" + "=" * 20 + " MENU " + "=" * 20 + "\n")
    print(" " * 18 + "Menu:")
    print(" " * 18 + "1. Depositar")
    print(" " * 18 + "2. Sacar")
    print(" " * 18 + "3. Extrato")
    print(" " * 18 + "0. Sair")
    print("\n" + "=" * 46 + "\n")

    opcao = input("Escolha uma opção: ")

    if opcao == "1":
        valor = float(input("Digite o valor a ser depositado: "))
        conta.depositar(valor)
        print("Depósito realizado com sucesso!")
    elif opcao == "2":
        valor = float(input("Digite o valor a ser sacado: "))
        conta.sacar(valor)
    elif opcao == "3":
        conta.gerar_extrato()
    elif opcao == "0":
        print("Obrigado por utilizar nosso Sistema...Banco Kauffmann Agradece!!!")
        break
    else:
        print("Opção inválida. Tente novamente.")

    # Reinicia o contador de saques diários no início de um novo dia
    if opcao in ["1", "2"]:
        conta.reiniciar_saques_diarios()

if name == "main":
main()

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.