Как можно минимизировать повторение кода при выполнении идентичных действий несколько раз?
Есть код, например:
def products(text):
text = text.split()
print(text)
f1 = open("products/Сервер.txt", "r", encoding="utf-8")
soft1 = f1.read().split()
print(soft1)
f1.close()
f2 = open("products/З.txt", "r", encoding="utf-8")
soft2 = f2.read().split()
print(soft2)
f2.close()
f3 = open("products/Зуб.txt", "r", encoding="utf-8")
soft3 = f3.read().split()
print(soft3)
f3.close()
f4 = open("products/Health.txt", "r", encoding="utf-8")
soft4 = f4.read().split()
print(soft4)
f4.close()
text = [i.lower() for i in text]
soft1 = [i.lower() for i in soft1]
soft2 = [i.lower() for i in soft2]
soft3 = [i.lower() for i in soft3]
soft4 = [i.lower() for i in soft4]
print(text)
print(soft1, soft2, soft3, soft4)
x1 = list(set(text) & set(soft1))
x2 = list(set(text) & set(soft2))
x3 = list(set(text) & set(soft3))
x4 = list(set(text) & set(soft4))
print(x1)
print(x2)
print(x3)
print(x4)
x1 = len(x1)
x2 = len(x2)
x3 = len(x3)
x4 = len(x4)
print(x1, x2, x3, x4)
x = max(x1, x2, x3, x4)
print(x)
if x1 == x2 == x3 == x4:
print('Сформулюйте будь ласка більш чітко питання!')
from sys import exit
exit()
if x == x1:
print(f1)
if x == x2:
print(f2)
if x == x3:
print(f3)
if x == x4:
print(f4)
Можно ли как-то через цикл for менять просто цифру после f? Я так понимаю таким образом (псевдокод):
i = 1
for i in f:
f[i] = open()
i++
Таким образом возможно решить проблему повторения кода?
Ответы (2 шт):
чем вас не устраивает запись в массив и работа с массивом?
soft = []
f1 = open("products/Сервер.txt", "r", encoding="utf-8")
soft.append(f1.read().split())
f1.close()
f2 = open("products/З.txt", "r", encoding="utf-8")
soft.append(f1.read().split())
f2.close()
for text in soft:
print(text)
даже считывать файлы можно в цикле
pathes = ["products/Сервер.txt", "products/З.txt"]
soft = []
for path in pathes:
f = open(path, "r", encoding="utf-8")
soft.append(f.read().split())
f.close()
for text in soft:
print(text)
Например весь код можно свернуть вот так:
def products(text):
text = text.lower().split()
soft = []
pathes = ["products/Сервер.txt", "products/З.txt", "products/Зуб.txt", "products/Health.txt"]
for path in pathes:
f = open(path, "r", encoding="utf-8")
soft.append({'path': path, 'len': len(list(set(text) & set(f.read().lower().split())))})
f.close()
x_max = max(map(lambda obj: obj['len'], soft))
isEqual = True
for i in range(1, len(soft)):
if soft[i]['len'] != soft[i - 1]['len']:
isEqual = False
break
if isEqual:
print('Сформулюйте будь ласка більш чітко питання!')
from sys import exit
exit()
for obj in soft:
if obj['len'] == x_max:
print(obj['path'])
вместо
isEqual = True
for i in range(1, len(soft)):
if soft[i]['len'] != soft[i - 1]['len']:
isEqual = False
break
можно сделать так:
isEqual = all([obj['len'] == x_max for obj in soft])
Можно через цикл как ты указал, а можно через ООП - создать класс и описать в нем нужный тебе метод, далее выполнять все действия через его экземпляры. Но способ с ООП больше подходит когда программа большая и в ней часто приходится повторять одни и теже действия по много раз - в таком случае ООП заметно облегчит задачу, но если это какой-то частный случай (будкт использован единично) и необходимости его дальнейшего использования не предвидится - лучше цикл.