1. Python / Говнокод #18982

    −19

    1. 1
    2. 2
    3. 3
    > What’s New In Python 3.0
    
    Removed reduce(). Use functools.reduce() if you really need it; however, 99 percent of the time an explicit for loop is more readable.

    Действительно, зачем он нужен вообще

    https://docs.python.org/3.0/whatsnew/3.0.html

    Запостил: Fike, 07 Ноября 2015

    Комментарии (50) RSS

    • тут хотя бы просто перенесли в другой модуль
      меня огорчило, что у сортировки совсем выпилили cmp
      Ответить
      • Ради интереса - а где нельзя заменить его key?
        Ответить
        • везде можно используя https://docs.python.org/3/library/functools.html#functools.cmp_to_key
          но зачем было выпиливать - непонятно
          Ответить
          • Наверно нет декоратора @deprecated как в жаве, вот и изъябываются. А как эта функция работает?
            Ответить
            • нагуглил. довольно изящно обернули:
              def cmp_to_key(mycmp):
              """Convert a cmp= function into a key= function"""
              class K(object):
                  __slots__ = ['obj']
                  def __init__(self, obj, *args):
                      self.obj = obj
                  def __lt__(self, other):
                      return mycmp(self.obj, other.obj) < 0
                  def __gt__(self, other):
                      return mycmp(self.obj, other.obj) > 0
                  def __eq__(self, other):
                      return mycmp(self.obj, other.obj) == 0
                  def __le__(self, other):
                      return mycmp(self.obj, other.obj) <= 0
                  def __ge__(self, other):
                      return mycmp(self.obj, other.obj) >= 0
                  def __ne__(self, other):
                      return mycmp(self.obj, other.obj) != 0
                  def __hash__(self):
                      raise TypeError('hash not implemented')
              return K
              Ответить
              • Хитро, ленивое дерганье mycmp. Один только вопрос: почему K, а не K()? Где он вызывается?
                Ответить
                • Этот класс попадёт в качестве key в сортировку. И когда сортировка вызовет key(), запилится его инстанс. Поэтому и K а не K().
                  Ответить
                  • >вызовет key()
                    А ну да, там же дергают key(object)
                    Ответить
              • А почему не

                def cmp_to_key(mycmp):
                    return lambda self: return lambda other: mycmp(self, other)

                Ну или через partial похожее.
                Ответить
                • Потому что там внутри сортировки будет что-то типа key(left) < key(right).
                  Ответить
                  • А ну да, эти операторы - единственный способ получить оба операнда для сравнения.
                    Ответить
        • Deleted
          Ответить
    • http://cs6.pikabu.ru/images/previews_comm/2015-03_1/1425170110905.gif
      Ответить
    • > Действительно, зачем он нужен вообще

      Это любимая игрушка лисперов. В перле тоже есть (в лист::утилз) но ни разу не доходилось использовать.
      Ответить
      • > В перле ни разу не доходилось использовать
        А зачем, если есть 100500 вариантов циклов, а ФП не идиоматично?

        > лисперов
        Только если схемеров и кложуристов, в CL куча макросов для циклов. А вот хаскелистам без fold(l|r) действительно никак. Это, по сути, база функционального итератора, см The Essence of the Iterator Pattern.
        Ответить
        • > > В перле ни разу не доходилось использовать

          > А зачем, если есть 100500 вариантов циклов, а ФП не идиоматично?

          Ага, 100500 вариантов циклов VS. 100500 вариантов передаваеймой closure.

          Цикл по крайней мере легче дебажить.

          > Только если схемеров и кложуристов, в CL куча макросов для циклов.

          ФП было очевидно, а вот отсыл на лиспо-образный язык у меня был чисто интуитивный: `reduce(f, a, b, c)`, если развернуть, аналогично `(f (f a b) c)`.
          Ответить
          • В хаски и прочих скалах для удобства делают два редьюса: левый и правый:
            foldl f zero [a, b, c] = f (f (f zero a) b) c
            foldr f zero [a, b, c] = f a (f b (f c zero))

            > 100500 вариантов передаваеймой closure
            Вот это не совсем понятно. Ты сравниваешь синтаксисы циклов и функции свёрток? Функции свёрток правильней сравнивать с телами циклов.
            Ответить
            • > > 100500 вариантов передаваеймой closure

              > Функции свёрток правильней сравнивать с телами циклов.

              Да. Про них и речь. Есть кучи идиоматичных циклов которые большинство разрабов поймут без проблем. А вот покажи кому реализацию min/max через reduce - и все начинают плавать. И это уже из личного опыта: пытался людям объяснять что делает reduce, и наивно думал что с примером это будет проще. ФП вылетело из большинства CS курсов, с математическим языком тоже слабо - у людей нет базы на которую можно объяснение reduce положить.
              Ответить
              • >>. ФП вылетело из большинства CS курсов
                что?
                Ответить
              • > А вот покажи кому реализацию min/max через reduce - и все начинают плавать.

                s = [1, 5, 2, 100, 500]
                # Max
                reduce(lambda x, y: x if x > y else y, s)
                # Min
                reduce(lambda x, y: x if x < y else y, s)
                Ответить
    • >however, 99 percent of the time an explicit for loop is more readable
      Крах функцианальной парадигмы? ЧТО Ж ЭТО ДЕЛАЕТСЯ ЛЮДИ ДОБРЫЕ??? ГВИДО ЗАГОНЯЕТ В ИМПЕРАТИВНОЕ СТОЙЛО!!!111 НЕТ ПУТИ!!!!
      Ответить
      • Да прав он, в пистоне reduce (практически) не нужен, в отдельном модуле ему логичней жить.
        Ответить
      • Самое частое его применение reduce - посчитать сумму. Но для суммы есть встроенный sum(). Питон создан для написания читаемого кода, а не функциональных извращений, тем более что ФП более-менее бесполезно в языках без ленивых вычислений.
        Ответить
        • читаемого кода? вы серьезно?
          Ответить
          • Ну да, это же одна из целей создания питона как раз.
            Ответить
            • только вот получилась гавнямба, которую зачем-то ебут пеп восьмым, который только доебывает останки, потому что все дрочат на ебаное количество символов вместо написания действительно читаемого кода. внутрь модулей обычно проще вообще не лезть.
              Ответить
              • >внутрь модулей обычно проще вообще не лезть.
                Свинья грязь найдет. Неужели путхон читается лучше, грубо, битрикса? Т.е. проблемы, возможно есть, но все не настолько плохо.
                Ответить
                • Ой, ну началось. Любая более-менее сложная хуйня на питоне не читается и дебажится через жопу.
                  Ответить
                  • Более менее сложная - это сверхдинамичненькая хуита с интроспекцией вроде веб фреймверков? Или это проблема питона что люди лепят файлы на 100+ килобайт?
                    Ответить
                    • Ой, ну началось. Это любая мало-мальски сложная хуйня. Размер тут не играет роли.
                      Ответить
                      • Примерчик будет? Или ты про какие-то мегалибы? Их вообще противопоказано писать на языке с динамической типизацией.
                        Ответить
              • Вы просто не знаете питон

                ПХП извратил Ваш мозг настолько, что код без SQL инъекций теперь кажется Вам нечитаемым
                Ответить
          • То ли дело PHP.
            Ответить
            • Да, PHP читается легче.
              Ответить
              • каша из html, sql и кучи названных без всякого порядка функций безусловно читается лучше.

                если добавить к этому тот факт что абсолютное множество пхп программистов это очень плохие программисты, то становится понятно что конечно пхп не читается
                Ответить
                • > абсолютное множество
                  это сколько ?
                  Если учитывать, что количество программистов php растет.
                  то количество то очень плохих программистов в % соотношение становится меньше.

                  А все говно в ПХП либо по не опытности, либо легаси. Ну есть еще откровенное говно, но его не меньше чем в других ЯП.
                  Если пройтись по ГК в разделе php. 99% это мешанина хтмл+ php + sql а это от не опытности.
                  Ответить
                • Схуяли каша-то? Нормальные люди пишут на твиге, sql весь внутри доктрины какой.
                  Ответить
                  • доктрина нинужна.
                    Ответить
                    • А что нужно?
                      Ответить
                      • чистый заточенный под задачу sql. А эти все доктрины шматрины. Выбирают охулион заначений суют в массив потом еще связи по этим значениям тащат. Спрашивается нахуя?
                        Все эти EAV до добра не доведут
                        Ответить
              • Как может легче читаться язык, в котором переменные начинаются с доллара? Визуальная каша какая-то, а не язык.
                Ответить
                • Ну сразу видно что это переменная. А не шляпа с бантиком.
                  Ответить
                • ну вот так. я не говорю, что он более красивый сам по себе, или что доллар ввробще нужен. но читается в разы лнгче, чем

                  нахуячу_ка_я_аргументов(аргумент_раз,
                                          аргумент_два,
                                          аргумент_ёбушка,
                                          ну_и_еще_немножк)
                  Ответить
      • Налишп, быдло!
        Ответить

    Добавить комментарий