Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 2, 2020 07:45:06

Marat__
Зарегистрирован: 2020-06-02
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

удобная запись циклов

Здравствуйте. Есть громоздкий скрипт с циклом внутри цикла:

for Target in target_index:
b=0
for year in YEAR:
“ооочень длинный скрипт чьи результаты записываются в файл”


….

Есть необходимость воткнуть внутрь третий цикл по условию результата записанному в файл в вышеизложенном скрипте. Если воткнуть напрямую получится уж совсем громоздко, некрасиво, непонятно, нечто в чем я совершенно запутаюсь. Как новичок хотел спросить-есть ли у Python инструмент который позволит решить данную задачу в более изящном виде. Как то разбить скрипт на отдельные части, подкачивать куски скрипты из другого файла, описать целые куски скрипта одной строчкой. Одним словом чтобы цикл в цикле и еще раз в цикле не превращался в какую то невразумительную кашу, в которой сам написавший его не мог разобраться.
Спасибо.

Отредактировано Marat__ (Июнь 2, 2020 11:09:33)

Офлайн

#2 Июнь 2, 2020 10:17:07

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10026
Репутация: +  857  -
Профиль   Отправить e-mail  

удобная запись циклов

Тебе надо использовать функции - то есть создавать свои функции.

Тут выкладывал ссылки на сообщения. Там описано, как нужно проектировать программу.

Пример:
Было у тебя так

  
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
>>>
Но спроектировано оно по-разному. Функции всегда остаются маленькими, даже если их сотни, в то время как монолитный код только растёт и превращается во что-то неразделимое и огромное.


tags: procedural to structured paradigm



Отредактировано py.user.next (Июнь 2, 2020 10:27:18)

Офлайн

#3 Июнь 2, 2020 11:08:03

Marat__
Зарегистрирован: 2020-06-02
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

удобная запись циклов

Спасибо за ответ. В моем сообщении табуляция не прошла и в сообщении код отобразился не таким какой он есть на самом деле. Если можете посмотрите, пожалуйста, прикреплённый файл, может посоветуете как сделать эту кашу читаемой под дополнительные циклы внутри циклов.

Прикреплённый файлы:
attachment RE_2Sycle(RF+merg).ipynb (80,0 KБ)

Офлайн

#4 Июнь 2, 2020 11:29:03

Marat__
Зарегистрирован: 2020-06-02
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

удобная запись циклов

Попробую описать что мне нужно сделать:

1. Есть таблица с данными, по горизонтали данные по годам (с 2000 по 2010 год), по вертикали таргет и параметры (20 штук).
2. Надо сначала взяв один параметр и 2000 год загнать это в модель получив прогноз. Затем взять два параметра и 2000 год получить второй прогноз, 3 параметра по 2000 году итд по циклу пока не закончатся все параметры.
3. Закончив цикл по параметрам начинаю цикл по годам
4. Все полученные прогнозы сохраняю в файл, в итоге получив 10*20=200 набора прогноза.
На этом уровне уже получается сложный для понимания скрипт.
а надо добавлять еще один цикл, где я буду по результату сравнения прогноза и фактических данных, производить дополнительные действия.
Вот в какую форму все это облечь, чтобы код был читаемым и красивым.
Спасибо.

Офлайн

#5 Июнь 2, 2020 17:22:03

AD0DE412
Зарегистрирован: 2019-05-12
Сообщения: 1130
Репутация: +  44  -
Профиль   Отправить e-mail  

удобная запись циклов

Marat__
код отобразился не таким какой он есть на самом деле.



1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде
2. чтобы вставить изображение залейте его куда нибудь (например), нажмите и вставьте ссылку на его url

есчщо

Офлайн

#6 Июнь 3, 2020 00:08:04

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10026
Репутация: +  857  -
Профиль   Отправить e-mail  

удобная запись циклов

Marat__
В моем сообщении табуляция не прошла и в сообщении код отобразился не таким какой он есть на самом деле.
Для этого нужно указать форумскому движку, что это не просто текст для людей, а код, который нужно передать точно.
[code][/code]
И это на всех форумах так, где есть передача кода.

Marat__
Если можете посмотрите, пожалуйста, прикреплённый файл
Лучше передавай код (напрямую или в архиве). Иначе мне сначала приходится читать этот сырой файл, чтобы убедиться, что там нет взламывающих конструкций, а уже потом подключать его через notebook, которым я редко когда пользуюсь. Так что код твой не смотрел.

Marat__
Попробую описать что мне нужно сделать:
Независимо от того, что тебе нужно сделать, делается оно всегда по одним и тем же правилам. Либо оно будет структурным, либо оно будет объектно-ориентированным, либо оно будет функциональным. До объектно-ориентированного ты и сам не дорос, как и уровень этой мелкой задачи. До функционального ты тоже не дорос, также в нём нет прямой необходимости. Поэтому тебе остаётся структурный подход. Потребность в упорядочивании кода, выросшего в объёме, об этом прямо говорит. Ты уже не можешь оставаться на процедурном уровне, где максисмум, что есть, - просто функции (процедуры). Нужна разработка “сверху вниз”, нужно свести всё к “последовательность-ветвление-цикл”, нужно использовать “подпрограммы”. Тогда код будет большим, но состоящим из мелких разграниченных кусков - как подводная лодка или как змея из сегментов. Там можно любой отсек или сегмент выключить или заменить на пустоту (заменить на stub - заглушку), какого бы размера он ни был, и всё будет продолжать работать в целом.



Отредактировано py.user.next (Июнь 3, 2020 00:11:01)

Офлайн

#7 Июнь 3, 2020 18:14:17

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1396
Репутация: +  124  -
Профиль   Отправить e-mail  

удобная запись циклов

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)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version