Как написать правильный код на Python. Решённая задача требует изменений

Задача

Мой код очень длинный. Можно ли его как-то оптимизировать? Хотелось-бы полностью его переделать, но не получается.

from random import randint
class Job:
    def __init__(self, num, time1, time2, befjob, time_s, time_f):
        self.num = num
        self.time1 = time1
        self.time2 = time2
        self.befjob = befjob
        self.time_s = time_s
        self.time_f = time_f
    def __str__(self):
        return str(self.num) + ' ' + str(self.time1) + '-' + str(self.time2) + ' ' + str(self.time_s) + ' ' + str(
            self.time_f)
    def new_job(self):
        num = i + 1
        print('Работа №', num, '\nВремя выполнения: ', sep='', end='')
        time = list(map(int, input().split('-')))
        time1 = time[0]
        time2 = time[1]
        print('Предшествующие работы: ', sep='', end='')
        befjob = list(map(int, input().split(',')))
        time_s = 0
        time_f = 0
        return Job(num, time1, time2, befjob, time_s, time_f)
class Job_list:
    def __init__(self, job_list):
        self.job_list = job_list
    def print_list(self):
        for i in self.job_list:
            print('\n№', i.num, ' Время работ: ', i.time1, '-', i.time2, '\nПредшествующие работы: ', *i.befjob,
                  '\nВремя начала работ: ', i.time_s, '\nВремя окончания работ: ', i.time_f, sep='')
    def append_new(self, count):
        for i in range(count):
            num = i + 1
            print('Работа №', num, '\nВремя выполнения: ', sep='', end='')
            time = list(map(int, input().split('-')))
            time1 = time[0]
            time2 = time[1]
            print('Предшествующие работы: ', sep='', end='')
            befjob = list(map(int, input().split(',')))
            time_s = 0
            time_f = 0
            self.job_list.append(Job(num, time1, time2, befjob, time_s, time_f))
    def work(self, iter, wish):
        sr_zn = 0
        ver = 0
        for l in range(iter):
            for i in range(len(self.job_list)):
                t = randint(self.job_list[i].time1, self.job_list[i].time2)
                if len(self.job_list[i].befjob) == 1 and self.job_list[i].befjob[0] == 0:
                    self.job_list[i].time_f += t
                elif len(self.job_list[i].befjob) == 1 and self.job_list[i].befjob != 0:
                    d = self.job_list[i].befjob[0] - 1
                    self.job_list[i].time_s = self.job_list[d].time_f
                    self.job_list[i].time_f = self.job_list[i].time_s + t
                elif len(self.job_list[i].befjob) != 1:
                    li = []
                    max = 0
                    for k in self.job_list[i].befjob:
                        li.append(self.job_list[k].time_f)
                        max = li[0]
                        for j in range(0, len(li)):
                            if j > max:
                                max = j
                    self.job_list[i].time_s = max
                    self.job_list[i].time_f = max + t
            x = self.job_list[-1].time_f
            sr_zn += x
            if x <= wish:
                ver += 1
            job.print_list()
            for i in self.job_list:
                i.time_s = 0
                i.time_f = 0
        print('Среднее время выполнения работ:', sr_zn / iter)
        print('Вероятность выполнения работ в срок: ', (ver / iter) * 100, '%', sep='')
print('Введите количество прогонов:', end='')
iter = int(input())
print('Введите кол-во работ:', end=' ')
count = int(input())
job = Job_list([])
job.append_new(count)
print('Введите желаемый срок выполнения работ: ', end='')
wish = int(input())
job.work(iter, wish)

Ответы (2 шт):

Автор решения: Bob
  • Строки лучше джойнить вместо многократного вызова +
  • Дублированный код лучше вынести в отдельные функции
  • Лучше не использовать для названий переменных уже зарезервированные имена (iter)
  • Если появляются циклы большой вложенности, то имеет смысл задуматься об использовании numpy
  • Также стоит улучшить именование переменных (sr_zn?)
→ Ссылка
Автор решения: Zhihar

что можно предложить

  1. использовать f-строки, что делает код попонятнее

вместо

return str(self.num) + ' ' + str(self.time1) + '-' + str(self.time2) + ' ' + str(self.time_s) + ' ' + str(
        self.time_f)

будет

return f'{self.num} {self.time1}-{self.time2} {self.time_s} {self.time_f}'

аналогично вместо

print('Работа №', num, '\nВремя выполнения: ', sep='', end='')

будет

print(f'Работа №{num}\nВремя выполнения: ', end='')

и т.д., например код

  1. зачем вводить лишние переменные, если вы их все равно не используете?

     time = list(map(int, input().split('-')))
     time1 = time[0]
     time2 = time[1]
     print('Предшествующие работы: ', sep='', end='')
     befjob = list(map(int, input().split(',')))
     time_s = 0
     time_f = 0
     return Job(num, time1, time2, befjob, time_s, time_f))
    

что мешает сделать так:

    time = list(map(int, input().split('-')))
    befjob = list(map(int, input().split(',')))
    return Job(i + 1, time[0], time[1], befjob, befjob[0], befjob[1])
  1. в методе new_job у вас какие-то странные print

в них вы собираете выводить время, но ничего не передаёте

    print('Работа №', num, '\nВремя выполнения: ', sep='', end='')
    print('Предшествующие работы: ', sep='', end='')

должно получиться Время выполнения: Предшествующие работы: - т.е. что-то не то

  1. некоторые циклы можно сворачивать с использованием встроенных функций

например странный код

max = li[0]
for j in range(0, len(li)):
    if j > max:
    max = j

можно прекратить в такой

max_value = max(li[0], len(li))

вообще странный код - вы уверены что именно так он должен работать?

  1. ВАЖНО!!!!!!!!!! вообще аккуратнее с названиями переменных - не надо называть из как функции

например ваша переменная max

→ Ссылка