Soy nuevo en Python y tengo una pregunta rápida.
¿Cómo puedo evitar repetirme cuando declaro las instancias de clase x1 x2 ..
Lo intenté con una lista, pero luego no pude crear un archivo para cada objeto. Y no todos los parámetros son iguales para mis objetos, d [0] está contando.
¿Alguna idea inteligente para deshacerme de repetirme aquí?
Gracias de antemano
class TestClass(object):
def __init__(self, a, b, c: int):
self.a = a
self.b = b
self.c = c
def __str__(self):
return f" a= {self.a} b = {self.b} c = {self.c}"
def func1():
a = input("a: ")
b = input("b: ")
return a, b
def func2():
return 100, 90, 80, 70
c = func1()
d = func2()
x1 = TestClass(c[0], c[1], d[0])
x2 = TestClass(c[0], c[1], d[1])
x3 = TestClass(c[0], c[1], d[2])
x4 = TestClass(c[0], c[1], d[3])
h = {"a": x1,"b": x2, "c": x3, "d": x4}
for key, value in h.items():
with open(f"Name {key}.txt","w") as f:
f.write(str(value))
Salida:
#a: Anton
#b: Bernd
#
# four files Name a - d.txt were created
# file 1: a= Anton b = Bernd c = 100
# file 2: a= Anton b = Bernd c = 90
# file 3: a= Anton b = Bernd c = 80
# file 4: a= Anton b = Bernd c = 70
2 respuestas
Debería iterar sobre el valor de retorno (tuple
) de la función func2
(así en la variable d
) con la función enumerate
. La función de enumeración devuelve el valor y el índice relacionado del iterador (por ejemplo: https://realpython.com/ python-enumerate /). Luego puede agregar el elemento para su dict (vacío). Debes usar la función chr
para definir las letras según el índice. La a
minúscula es el 97.
Parte de código relacionada:
c = func1()
d = func2()
h = {}
for idx, value in enumerate(d):
h[chr(97 + idx)] = TestClass(c[0], c[1], d[idx])
for key, value in h.items():
with open(f"Name {key}.txt", "w") as f:
f.write(str(value))
NOTA:
He escrito una versión de código más compacta. Puedes consultarlo si te interesa.
Código:
class TestClass(object):
def __init__(self, a, b, c: int):
self.a = a
self.b = b
self.c = c
def __str__(self):
return f" a= {self.a} b = {self.b} c = {self.c}"
a, b, h, d = input("a: "), input("b: "), {}, [100, 90, 80, 70]
result = [(chr(97 + idx), TestClass(a, b, d[idx])) for idx, value in enumerate(d)]
for item in result:
with open(f"Name {item[0]}.txt", "w") as f:
f.write(str(item[1]))
Respuesta rápida
Use una función, cuando necesite hacer algo que le llevará mucho tiempo de escritura o si necesita hacer algo repetidamente y luego empaquételo en una función.
def create_func(fun_1, fun_2): result = {} acii_n = 97 for item in fun_2: name = chr(acii_n) acii_n += 1 class_instance = TestClass(fun_1[0], fun_1[1], item) result.setdefault(name, class_instance) return result h = create_func(c, d) for key, value in h.items(): with open(f"Name {key}.txt","w") as f: f.write(str(value))
chr (i) Función. Puede ver que llamo a la función que comienza en int 97. Eso es porque el valor ASCII es la letra
a
-> asciitable.com.
Mejoras adicionales
Es curioso que la solución que di, que es usar una función, también es exactamente lo contrario de lo que puedo sugerirle que haga para mejorar su script, que es eliminar las funciones :).
class TestClass(object):
def __init__(self, a, b, c: int):
self.a = a
self.b = b
self.c = c
def __str__(self):
return f" a= {self.a} b = {self.b} c = {self.c}"
def create_instances(fun_2):
a = input("a: ")
b = input("b: ")
user_values = [a, b]
result = {}
ascii_n = 97
for item in fun_2:
name = chr(ascii_n)
ascii_n += 1 # Step on the next charactes
class_instance = TestClass(user_values[0], user_values[1], item)
result.setdefault(name, class_instance)
return result
int_values = [100, 90, 80, 70] # Just pack it into a list
all_instances = create_instances(int_values)
for key, value in all_instances.items():
with open(f"Name {key}.txt","w") as f:
f.write(str(value))
Uso de la comprensión de un diccionario
Herramienta muy poderosa, rápida (puede ejecutar más rápido los bucles For) y super Pythonic :) Comprensión del diccionario Python.
class TestClass(object):
def __init__(self, a, b, c: int):
self.a = a
self.b = b
self.c = c
def __str__(self):
return f" a= {self.a} b = {self.b} c = {self.c}"
int_values = [100, 90, 80, 70]
a = 'Python'
b = 'WOOW'
user_values = [a, b]
ascii_n = 97
result = {chr(ascii_n+idx): TestClass(user_values[0], user_values[1], item) for idx, item in enumerate(int_values)}
for key, value in result.items():
with open(f"Name {key}.txt","w") as f:
f.write(str(value))
Preguntas relacionadas
Preguntas vinculadas
Nuevas preguntas
python
Python es un lenguaje de programación multipropósito, de tipificación dinámica y de múltiples paradigmas. Está diseñado para ser rápido de aprender, comprender y usar, y hacer cumplir una sintaxis limpia y uniforme. Tenga en cuenta que Python 2 está oficialmente fuera de soporte a partir del 01-01-2020. Aún así, para preguntas de Python específicas de la versión, agregue la etiqueta [python-2.7] o [python-3.x]. Cuando utilice una variante de Python (por ejemplo, Jython, PyPy) o una biblioteca (por ejemplo, Pandas y NumPy), inclúyala en las etiquetas.