Как написать правильный код на 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
→ Ссылка
что можно предложить
- использовать 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='')
и т.д., например код
зачем вводить лишние переменные, если вы их все равно не используете?
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])
- в методе
new_jobу вас какие-то странныеprint
в них вы собираете выводить время, но ничего не передаёте
print('Работа №', num, '\nВремя выполнения: ', sep='', end='')
print('Предшествующие работы: ', sep='', end='')
должно получиться Время выполнения: Предшествующие работы: - т.е. что-то не то
- некоторые циклы можно сворачивать с использованием встроенных функций
например странный код
max = li[0]
for j in range(0, len(li)):
if j > max:
max = j
можно прекратить в такой
max_value = max(li[0], len(li))
вообще странный код - вы уверены что именно так он должен работать?
- ВАЖНО!!!!!!!!!! вообще аккуратнее с названиями переменных - не надо называть из как функции
например ваша переменная max
