Tu lista de usuarios es de la forma:
[["Laura", "Rodríguez", 565656565], ["Antonio", "Pérez", 4458652135]]
Tu iteras con:
for a in range(len(usuarios)): for b in range(len(usuarios)): print(usuarios[a][b])
Si desglosamos paso a paso tenemos:
a = 0, b = 0 -> usuarios[0][0] -> "Laura"a = 0, b = 1 -> usuarios[0][1] -> "Rodrigez"a = 1, b = 0 -> usuarios[0][0] -> "Antonio"a = 1, b = 1 -> usuarios[0][0] -> "Pérez"
En ningún momento indizas para obtener el tercer item de cada sublista (el dni).
Te estás complicando mucho, pero que mucho, para obtener los items:
for nombre, apellido, dni in usuarios: print(nombre, apellido, dni)
Laura Rodríguez 565656565
Antonio Pérez 4458652135
Por norma general usa un for - in
para iterar, no range
+ indizado, es mucho más legible y también es más eficiente. Indizar es útil y necesario en algunos casos, por ejemplo cuando se quiere reasignar un nuevo valor a un índice dado, pero si solo quieres iterar y obtener los elementos usa un for in
.
Independientemente de tu problema, creo que no está pillando correctamente la idea de la programación orientada a objetos, los conceptos de clase, objeto, atributos y métodos. A grandes rasgos:
Una clase no es más que un modelo, una plantilla que permite crear objetos concretos a partir de ella, definiendo métodos (cosas que un objeto de esa clase puede hacer) y atributos (propiedades o estados que caracterizan a un objeto de esa clase) . Una clase Cliente
sería una plantilla que permitiría crear clientes concretos de tu banco, cada cliente (como en la vida real) tendrá una serie de características o datos que lo identifican como el nombre, el apellido, el dni, cuentas bancarias, saldo, etc. Eso son atributos de instancia. Además podráhacer ciertas cosas como sacar dinero, ingresar dinero, cancelar una cuenta, etc eso serían métodos de instancia.
Por su parte, un banco podría tener como atributo de instancia la lista de clientes, mientras que agregar_cliente
o mostrar_cliente
podrían ser métodos de instancia del objeto banco, son cosas que el "banco puede hacer", no son cosas que haga el cliente.
En tu caso usas una clase llamada Cliente
, la cual implementa métodos como agregar_cliente
o mostrar_clientes
. Estos métodos no son propios de un cliente, en todo caso son propios de un hipotético objeto Banco
como se ha comentado. Una implementación más racional de lo que intentas hacer sería por ejemplo:
class Cliente: def __init__(self, nombre, apellido, dni): self.nombre = nombre self.apellido = apellido self.dni = dni def __str__(self): return(f"Nombre: {self.nombre}\n" f"Apellido: {self.apellido}\n" f"DNI: {self.dni}\n" )class Banco: def __init__(self): self.usuarios = [] def agregar_cliente(self): nombre = input("\nDigite el nombre del usuario: ") apellido = input("Digite el apellido del usuario: ") dni = int(input("Digite el DNI del usuario: ")) if self.buscar_por_dni(dni): print("Ya existe un usuario con el mismo dni") else: self.usuarios.append(Cliente(nombre, apellido, dni)) def buscar_por_dni(self, dni): for usuario in self.usuarios: if usuario.dni == dni: return usuario def mostrar_cliente(self, dni): cliente = self.buscar_por_dni(dni) if cliente: print("\n", cliente) else: print("\nNo existe un cliente con ese dni")def main(): banco = Banco() print("\n**** BIENVENIDO AL BANCO ****") while True: try: print("\nDigite una opcion: \n\n"" 1) Agregar usuario\n"" 2) Visualizar usuario\n"" 3) Eliminar usuario\n"" 4) Salir") opcion = input("\nDigite una opcion: ") if opcion == "1": banco.agregar_cliente() elif opcion == "2": dni = int(input("Digite el dni del usuario que desea buscar: ")) banco.mostrar_cliente(dni) except ValueError: print("\nOpción incorrecta, intentelo nuevamente")if __name__=='__main__': main()