Как можно минимизировать повторение кода при выполнении идентичных действий несколько раз?

Есть код, например:

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 шт):

Автор решения: Zhihar

чем вас не устраивает запись в массив и работа с массивом?

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])
→ Ссылка
Автор решения: JohnyDoe

Можно через цикл как ты указал, а можно через ООП - создать класс и описать в нем нужный тебе метод, далее выполнять все действия через его экземпляры. Но способ с ООП больше подходит когда программа большая и в ней часто приходится повторять одни и теже действия по много раз - в таком случае ООП заметно облегчит задачу, но если это какой-то частный случай (будкт использован единично) и необходимости его дальнейшего использования не предвидится - лучше цикл.

→ Ссылка