Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 28, 2018 23:58:18

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

Как упросить функцию ?

Rodegast
2) Не надо считать пробелы.
Табуляция выглядит по-разному в разных редакторах. Обычное дело, когда она выглядит как восемь пробелов. А чтобы табуляция выглядела короче восьми пробелов, нужно делать дополнительные настройки редактора.
В то же время четыре пробела выглядят везде одинаково. Четыре пробела легко выдерживают три уровня вложенности - общепринятый предел кода на любом языке. В питоне же мы берём, например, метод в классе - это уже два отступа потрачены. Потом мы этот метод начинаем писать и в нём самом нужно сделать три уровня вложенности. Получится, что пять отступов надо иметь на экране. Вот с табуляцией ты уже должен её настраивать, чтобы она выглядела как четыре пробела, иначе всё разъедется в ширину так, что глаза начнут бегать влево и вправо, чтобы просто код прочитать и помнить его содержимое. Когда смотришь на такой код, ты не видишь его весь сразу. А когда глаза постоянно бегают, ты просто устаёшь, устают мозги (движения глаз, запоминание кусков, переключение внимания, - это всё утомляет мозг). Другое дело четыре пробела: ты смотришь в одну точку и видишь весь код с вложенностью в пять уровней - обычное дело для питона.

Да, и это мы ещё не рассмотрели JavaScript, где вообще один уровень вложенности автоматом забирается, чтобы код в файле сделать локальным. В JavaScript'е нет пространств имён, поэтому все файлы добавляются в одну область видимости и ты просто не можешь иметь глобальные объекты в файле, так как глобальные объекты в разных файлах будут замещать друг друга неопределённым образом. В питоне сам файл становится пространством имен, а в JavaScript такого нет. То есть позволить себе длиннющие отступы в JavaScript ты просто не можешь, иначе получается лажа, как в php, читать это просто невозможно (неприятно). Пока одну строку прочитаешь, может полдня пройти.

Rodegast
Вот я сейчас попробовал это проделать в Geany, по нажатию на Tab он как и положено ставит табуляцию
У меня табуляция в Go используется, потому что там автоформатер, корректирующий синтаксис, меняет все отступы на табуляцию. Так я в режиме для Go настроил внешний вид табуляции на длину в четыре пробела. Но если открыть такой код на GitHub'е, то мы видим, что там даже в окно браузера не помещается обычный, несложный код на Go, потому что там тоже много конструкций, требующих вложенности по пять уровней и даже больше - семь, восемь. Там есть анонимные функции, которые прямо внутри блоков принято делать. Короче, пять уровней для Go - обычное дело, хоть там и классов нет, как в питоне. И вот табуляции в таком коде дают о себе знать. Читать дискомфортно. Приходится код скачивать к себе, открывать своим редактором, который укоротит отступы при отображении, и после этого код становится читабельным.

Rodegast
в итоге пробелы и табуляция смешивается что не допустимо
Для этого есть “cat -vet”, grep и sed. Проблем никогда не испытывал, потому что всегда могу посмотреть, есть ли хоть одна смесь, и всегда могу быстро заменить все табуляции в файле на четыре пробела одной командой. Всегда это делал и проблемы уходили.

Rodegast
3) На табуляцию я не переходил. Я ей постоянно пользовался.
Я изучал разные стили и остался на четырёх пробелах. Умею также и настраивать табуляцию для себя, но создаю файлы с четырьмя пробелами. Они надёжные, простые, не требуют дополнительных действий, их легко заменить на что угодно, они всегда видны в том виде, в котором записаны.



Отредактировано py.user.next (Апрель 29, 2018 00:05:27)

Офлайн

#2 Апрель 29, 2018 00:16:22

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

Как упросить функцию ?

druidich92
можете подсказать, как этот код можно сделать более читаемый?
Если код заставляет думать при его чтении, это плохой код. Вот у тебя возвращаемое значение заставляет думать “что возвращается?”. При этом надо отбросить все предположения, что мол “я помню, что там возвращается”. Надо писать так, что ты не помнишь, не знаешь, и вообще не понимаешь. Это полезно и для случая, когда твой код будет читать абсолютно чужой человек, который не может ничего помнить про него, и для случая, когда таким человеком станешь ты сам. Это парадоксально, у тебя может возникнуть вопрос “да как же я могу забыть свой собственный код?”, но ты его забудешь сразу же, как только напишешь точно такую же, но уже другую программу, в которой всё то же самое делается с теми же именами, с теми же функциями и методами. Ты просто начнёшь путать, что было в какой программе, и тебе рано или поздно придётся по собственным комментариям пытаться понять свой собственный код в данном конкретном месте. Ты не будешь ничего помнить, потому что ты не сможешь правильно относить воспоминания. Ты будешь помнить функцию, но не будешь помнить, из какого она проекта. Ты будешь помнить комментарий, но не будешь помнить, когда ты его писал. То есть восстановить всю цепочку написания программы ты не сможешь. У тебя будет десять программ и в каждой ты будешь путаться.

Поэтому пиши так, чтобы не надо было ничего вспоминать, ничего разгадывать там типа “умный поймёт”. То же самое касается имён переменных. Ты думаешь, что придумал такое красивое, понятное и короткое имя, а потом ты не сможешь вспомнить, как ты его придумывал и почему оно так придумано, оно просто покажется набором букв.



Отредактировано py.user.next (Апрель 29, 2018 00:18:52)

Офлайн

#3 Апрель 29, 2018 00:50:52

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2832
Репутация: +  186  -
Профиль   Отправить e-mail  

Как упросить функцию ?

> Табуляция выглядит по-разному в разных редакторах.

Меня это не напрягает.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#4 Апрель 29, 2018 09:09:27

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Как упросить функцию ?

Rodegast
1) Geany адекватен? …
2) Это нормальная практика когда на свои серверы люди притаскивают свои конфиги vim/emacs.

>> Меня это не напрягает.

Слушай, да для тебя и английский не нужен, и еще куча всего того странного что ты на этом форуме высказал. Ты здесь представитель “иного” мышления, и я очень сильно подбирал слова.

Мое мнение что ты не адекватен. Посему зарекаюсь больше не вступать с тобой в дискуссии. Да да тебе оно и не надо и вообще фиолетово. Я больше сказал это что бы публично было.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#5 Апрель 29, 2018 12:09:12

druidich92
Зарегистрирован: 2016-03-05
Сообщения: 29
Репутация: +  0  -
Профиль   Отправить e-mail  

Как упросить функцию ?

Rodegast
1) У тебя не функция, а метод.
2) Документация не соответствует действительности
3) Давай переменным короткие имена
4) Для отступов используй табуляцию
5) Используй переносы в словарях и списках
6) Изменяемое состояние это зло. Не надо его так агрессивно использовать! В место списков izo_paraphine_data и norm_paraphine_data создай 4 списка и нормально заполняй их не пользуясь индексами.
P.S. PEP8 это анахронизм не используй его.

Добрый день. Частично с вашими рекомендациями я согласен, а некоторые я не понимаю )
1, 2 - косяк, исправляю
3- встречал наоборот суждение, что лучше давать нормальные осознанные имена.
4 - ну, у меня табуляция в редакторе используется
6 - не понимаю что за изменяемое состояние.

Офлайн

#6 Апрель 29, 2018 13:41:46

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2832
Репутация: +  186  -
Профиль   Отправить e-mail  

Как упросить функцию ?

> Geany адекватен? …

А ХЗ, это первое что мне попалось. Смысл в том что я не привязан к редактору/IDE. Я хоть в блокноте могу исходники редактировать и у меня с отступами проблем не будет.

> Это нормальная практика когда на свои серверы люди притаскивают свои конфиги vim/emacs.

На свои перетаскивают, а на чужие нет.

> Ты здесь представитель “иного” мышления

Совершенно верно. Я не мыслю шаблонами! Вот тебе какой-то “дядя” дал установку что отступ должен быть только пробелами и ты этому слепо следуешь, хотя табы дают ряд преимуществ. Надо ко всему относится критически.

> 3- встречал наоборот суждение, что лучше давать нормальные осознанные имена.

Имя должно быть в первую очередь осмысленным, по этому тебе и писали что например не надо использовать однобуквенные имена. Но длинные имена тоже плохи, они более сложны для восприятия. По этому необходимо давать осмысленные имена минимальной длины. Например у izo_paraphine_data и norm_paraphine_data можно отбросить общую часть имени и будет просто izo и norm.

> 6 - не понимаю что за изменяемое состояние.

Это в первую очередь изменяемые объекты. Я не буду рассказывать почему это зло (вот можешь тут подробности почитать http://fprog.ru/2009/issue1/eugene-kirpichov-fighting-mutable-state/ ), но в императивном программировании без него не обойтись и работать с ним надо предельно аккуратно. Например ты создаёшь список содержащий 2 списка, потом их изменяешь обращаясь по индексам, а потом “вытаскиваешь” эти списки из общего списка и формируешь результат. Очевидно что эту конструкцию лучше заменить четырьмя одномерными списками.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Отредактировано Rodegast (Апрель 29, 2018 13:56:38)

Офлайн

#7 Май 1, 2018 18:07:32

druidich92
Зарегистрирован: 2016-03-05
Сообщения: 29
Репутация: +  0  -
Профиль   Отправить e-mail  

Как упросить функцию ?

Rodegast
а можно еще совета попросить. Уже в плане алгоритма.
     def paraphine_distribution(self):
        '''
            распределение всего состава по 3 группам: нормальные парафины, 
            изопарафины и водород. Учитываются компоненты, частота появления 
            которых не равно нулю
            :param data: входные данные
            :type data: calculate_file
        '''
        izo_component = []
        izo_quantity = []
        norm_component = []
        norm_quantity = []
        h2_component = [x for x in np.linspace(-300, -250, 6)]
        h2_quantity = [random.randint(0, 30) for x in range(0, 6)]
        h2_quantity[2] = 100
        for i, item in enumerate(self.full_components):
            if self.full_composition[-1][i] != 0:
                if item in self._criterion_norm_paraphine:
                    norm_component.append(item)
                    norm_quantity.append(self.full_composition[-1][i])
                elif item in self._criterion_izo_paraphine:
                    izo_component.append(item)
                    izo_quantity.append(self.full_composition[-1][i])
        izo_composition = {
            'x': np.array(izo_component),
            'y': np.array(izo_quantity)
        }
        norm_comosition = {
            'x': np.array(norm_component),
            'y': np.array(norm_quantity)
        }
        h2_composition = {
            'x': np.array(h2_component),
            'y': np.array(h2_quantity)
        }
        return izo_composition, norm_comosition, h2_composition
данный метод у меня почти дублируется. только в одном случае он работает когда
 if self.full_composition[-1][i] != 0:
а в другом когда
 if self.full_composition[-1][i] == 0:
а все остальное - одно и тоже…. как с этим можно поступить ?

Офлайн

#8 Май 1, 2018 18:53:58

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2832
Репутация: +  186  -
Профиль   Отправить e-mail  

Как упросить функцию ?

Самое очевидное решение этой проблемы это создать предикат и передавать его в метод как параметр:

 def paraphine_distribution(self, test):
        ....
       if test(i):
              ....
        ....
 
self.paraphine_distribution(lambda i: self.full_composition[-1][i])
Но тут надо смотреть на весь класс, возможно стоит заменить self.full_composition на что то другое.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Отредактировано Rodegast (Май 1, 2018 18:58:24)

Офлайн

#9 Май 1, 2018 19:16:05

druidich92
Зарегистрирован: 2016-03-05
Сообщения: 29
Репутация: +  0  -
Профиль   Отправить e-mail  

Как упросить функцию ?

Rodegast
Самое очевидное решение этой проблемы это создать предикат и передавать его в метод как параметр:
блин, как то не удобно. Знаю что класс то еще …. если я выложу, вы сможете дать советы как его улучшить ?

Офлайн

#10 Май 1, 2018 19:44:33

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2832
Репутация: +  186  -
Профиль   Отправить e-mail  

Как упросить функцию ?

Выкладывай. Помогу чем смогу…



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version