Форум сайта python.su
0
Здравствуйте. Есть громоздкий скрипт с циклом внутри цикла:
for Target in target_index:
b=0
for year in YEAR:
“ооочень длинный скрипт чьи результаты записываются в файл”
….
Есть необходимость воткнуть внутрь третий цикл по условию результата записанному в файл в вышеизложенном скрипте. Если воткнуть напрямую получится уж совсем громоздко, некрасиво, непонятно, нечто в чем я совершенно запутаюсь. Как новичок хотел спросить-есть ли у Python инструмент который позволит решить данную задачу в более изящном виде. Как то разбить скрипт на отдельные части, подкачивать куски скрипты из другого файла, описать целые куски скрипта одной строчкой. Одним словом чтобы цикл в цикле и еще раз в цикле не превращался в какую то невразумительную кашу, в которой сам написавший его не мог разобраться.
Спасибо.
Отредактировано Marat__ (Июнь 2, 2020 11:09:33)
Офлайн
857
Тебе надо использовать функции - то есть создавать свои функции.
Тут выкладывал ссылки на сообщения. Там описано, как нужно проектировать программу.
Пример:
Было у тебя так
for i in range(3): print(1) print(2) print(3)
def repeat3(): for i in range(3): print123() def print123(): print(1) print(2) print(3) repeat3()
>>> for i in range(3): ... print(1) ... print(2) ... print(3) ... 1 2 3 1 2 3 1 2 3 >>>
>>> def repeat3(): ... for i in range(3): ... print123() ... >>> def print123(): ... print(1) ... print(2) ... print(3) ... >>> repeat3() 1 2 3 1 2 3 1 2 3 >>>
Отредактировано py.user.next (Июнь 2, 2020 10:27:18)
Офлайн
0
Спасибо за ответ. В моем сообщении табуляция не прошла и в сообщении код отобразился не таким какой он есть на самом деле. Если можете посмотрите, пожалуйста, прикреплённый файл, может посоветуете как сделать эту кашу читаемой под дополнительные циклы внутри циклов.
Прикреплённый файлы:
RE_2Sycle(RF+merg).ipynb (80,0 KБ)
Офлайн
0
Попробую описать что мне нужно сделать:
1. Есть таблица с данными, по горизонтали данные по годам (с 2000 по 2010 год), по вертикали таргет и параметры (20 штук).
2. Надо сначала взяв один параметр и 2000 год загнать это в модель получив прогноз. Затем взять два параметра и 2000 год получить второй прогноз, 3 параметра по 2000 году итд по циклу пока не закончатся все параметры.
3. Закончив цикл по параметрам начинаю цикл по годам
4. Все полученные прогнозы сохраняю в файл, в итоге получив 10*20=200 набора прогноза.
На этом уровне уже получается сложный для понимания скрипт.
а надо добавлять еще один цикл, где я буду по результату сравнения прогноза и фактических данных, производить дополнительные действия.
Вот в какую форму все это облечь, чтобы код был читаемым и красивым.
Спасибо.
Офлайн
44
Marat__
код отобразился не таким какой он есть на самом деле.
и вставьте ссылку на его url Офлайн
857
Marat__Для этого нужно указать форумскому движку, что это не просто текст для людей, а код, который нужно передать точно.
В моем сообщении табуляция не прошла и в сообщении код отобразился не таким какой он есть на самом деле.
[code][/code]
Marat__Лучше передавай код (напрямую или в архиве). Иначе мне сначала приходится читать этот сырой файл, чтобы убедиться, что там нет взламывающих конструкций, а уже потом подключать его через notebook, которым я редко когда пользуюсь. Так что код твой не смотрел.
Если можете посмотрите, пожалуйста, прикреплённый файл
Marat__Независимо от того, что тебе нужно сделать, делается оно всегда по одним и тем же правилам. Либо оно будет структурным, либо оно будет объектно-ориентированным, либо оно будет функциональным. До объектно-ориентированного ты и сам не дорос, как и уровень этой мелкой задачи. До функционального ты тоже не дорос, также в нём нет прямой необходимости. Поэтому тебе остаётся структурный подход. Потребность в упорядочивании кода, выросшего в объёме, об этом прямо говорит. Ты уже не можешь оставаться на процедурном уровне, где максисмум, что есть, - просто функции (процедуры). Нужна разработка “сверху вниз”, нужно свести всё к “последовательность-ветвление-цикл”, нужно использовать “подпрограммы”. Тогда код будет большим, но состоящим из мелких разграниченных кусков - как подводная лодка или как змея из сегментов. Там можно любой отсек или сегмент выключить или заменить на пустоту (заменить на stub - заглушку), какого бы размера он ни был, и всё будет продолжать работать в целом.
Попробую описать что мне нужно сделать:
Отредактировано py.user.next (Июнь 3, 2020 00:11:01)
Офлайн
124
Marat__
Вот в какую форму все это облечь, чтобы код был читаемым и красивым
a = list(range(10)) # это параметры года b = list(range(10,20)) # это параметры года dict = {2000:a, # это таблица,где каждому году соответствуют параметры 2001:b} def func(a,n=1): # это функция принимает список "а", и сколько элементов вернуть "n" list = [] i = 0 while i < n: list.append(a[i]) i+=1 return list for year in dict: # для каждого года из таблицы print(year) for n in range(1,11): # для n из диапазона print(func(dict.get(year),n)) # функция func(a,n)
Офлайн