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

    0

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    """
    This module provides a function merge_sort, which is one of the simplest and the
    most robust sorting algorithms, being relatively fast, having (n*log(n))
    complexity. Also, this module counts the number of inversions in a given array.
    Usage: import this module and use the function merge_sort. The first element in
    a returned tuple shall be a sorted array, while the second one will be a number
    of inversions in the array.
    
    Copyright (C) 2021 Sergay Gayorgyevich.
    
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU Affero General Public License as
    published by the Free Software Foundation, either version 3 of the
    License, or (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Affero General Public License for more details.
    
    You should have received a copy of the GNU Affero General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.
    """
    
    import argparse
    
    def merge_sort(array : list) -> (list, int):
        """
        MergeSort algorithm with additional inversion counting.
        input: array.
        output: sorted array and number of inversions in it.
        """
    
        if len(array) <= 1:
            return (array, 0)
        elif len(array) == 2:
            if array[0] > array[1]:
                array[0], array[1] = array[1], array[0]
                return (array, 1)
            return (array, 0)
    
        mid = len(array) // 2
        left, left_inversions = merge_sort(array[:mid])
        right, right_inversions = merge_sort(array[mid:])
    
        merged, split_inversions = _merge(left, right)
        return (merged, right_inversions + left_inversions + split_inversions)
    
    def _merge(left_array : list, right_array : list) -> (list, int):
        """
        This function isn't supposed to be called, it's an inner function of the
        module, and not a part of its API! 
    
        The purpose of this function is to merge two arrays. Due to the nature of
        the MergeSort algorithm, it operates two arrays, both of which are sorted.
        input: two sotrted arrays.
        output: sorted array, consisting of elements of both operated arrays.
        """
    
        resulting_array = list()
        inversion_count = 0
        c_len = len(left_array) + len(right_array)
    
        for i in range(c_len):
            if (len(left_array) != 0) and (len(right_array) != 0):
                if left_array[0] > right_array[0]:
                    inversion_count += len(left_array)
                    resulting_array.append(right_array.pop(0))
                else:
                    resulting_array.append(left_array.pop(0))
            elif len(left_array) == 0:
                resulting_array.append(right_array.pop(0))
            elif len(right_array) == 0:
                resulting_array.append(left_array.pop(0))
    
        return (resulting_array[:], inversion_count)
    
    # For testing purposes only! Do not use in production!
    if __name__ == '__main__':
        DESC = "Sort an array and print an amount of inversions it has." # Description for argparse.
        argparser = argparse.ArgumentParser(description = DESC)
        argparser.add_argument("elements", type = int, nargs = '+', help = "A list to be sorted.")
        args = argparser.parse_args()
        print(merge_sort(args.elements))

    Изучаю алгоритм "Сортировка Слиянием".

    Запостил: KoWe4Ka_l7porpaMMep, 12 Апреля 2021

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

    • вот блин имя забыл замазать, какой диванон (((
      Ответить
      • Серега, ты лучше имя свое на английском пиши через "e".

        Я когда-то читал книжку Вирта про алгоритмы, и тоже выполнял задания. Правда, на паскале
        Ответить
        • когда-то и меня вела дорога приключений

          https://www.picclickimg.com/d/w1600/pict/402299551484_/Sir-Gay-Paperback-by-Wright-Ronald-Brand-New.jpg
          Ответить
        • А я читаю не вирта, а Рафгардена. Оказывается, сложность алгоритмов типа «разделяй и властвуй» очень легко посчитать! Каждая новая страница этой чудесной литературы приподносит мне новое открытие из изумительного мира математики и теории алгоритмов :-)
          Ответить
          • Ну потом тебя ждут Кормен и Кнут, и можно в гугл
            Ответить
            • Я так посмотрел, руфгадн этот скорее по материалу дополняет кнута. Хотя для изучения может быть и проще, и в менее академическом стиле.
              Ответить
              • Да, надо будет ещё что-нибудь прочитать после этого. Но только не кнута, а то я ОПУПЕЮ от такого количества умного. Мне бы чего попроще: вот это сортировка, вот её алгоритм. Дверь в Гугл дальше по коридору и налево.

                А уже потом, когда я буду бульмение понимать всё это, начну изучать их по кнуту и другим низкоуровневым книжкам.
                Ответить
      • А я думал ты Катя (((
        Ответить
        • Файк тоже думал..
          Ответить
          • Да в суп попал!
            Ответить
            • в каждый блядь второй коммент попал
              Ответить
          • Выходит лучше вообще не думать?
            Ответить
            • Именно по этому я за "пхп", впрочем и за "джава на галерах" тоже немножечко.


              Не позволяй башке трудиться!
              Блаженство - в черепе пустом,
              В раздумьях чахнуть не годится -
              Скачи козлом, скачи козлом!

              Гони поганою метлою
              Из головы мыслишек сор,
              Не смей учения уздою
              Желаний сдерживать опор!

              Башку обвешай серпантином,
              По-молодежному стриги,
              Пей алкоголь! От тех кретинов,
              В очках и с книгами - беги!

              Душа - химера, Бога - нету,
              Ходи, копыто, ходуном!
              Трать жизни тусклую монету!
              Скачи козлом! Скачи козлом!
              Ответить
            • Именно поэтому я за "РНР".
              Ответить
    • > GNU Affero General Public License

      Какой удар по корпорациям! Захочет гугл отсортировать массив и не сможет т.к. придётся опенсурсить и весь остальной код.
      Ответить
      • Ня! С:<
        Ответить
      • Abmazon GPL
        Ответить
        • Ты о практике продажи исключений? Штольман её одобряет, вообще говоря.
          Ответить
          • На амазоне теперь можно купить исключение? Типа, в какой-то программе падает npe, и там моя реклама?
            Ответить
            • Лол, отличная модель монетизации для PHP софта, в котором все ошибки в браузер...
              Ответить
          • его считай свергли уже, так что пох на одобрение
            Ответить
    • помню меня на первом курсе этой ебалой мучали

      ты в вуз поступил?
      Ответить
      • Нет, для себя изучаю. Хочу пойти на собеседование.
        Ответить
        • А в какую контору?

          В обычной галере или говностудии ничего сложнее qsort обычно не спрашивают
          Ответить
          • Я ещё ни разу не был на собеседовании, поэтому хочу выучить всё по максимуму. Скорее всего наймусь в «Рога и Копыта» какие-нибудь, т.к. без опыта и 27 лет ещё не исполнилось. Возможно, там действительно не спросят что-либо сложное, но мне нужно всех обскакать, поэтому в резюме напишу побольше питушни. И, естественно, не пролететь, если начнут по этой питушне спрашивать.
            Ответить
            • гг) Знать алгоритмы и структуры данных это хорошо и правильно, но велик шанс, что

              * Рога и Копыта управляются ротоёбом, который о Карацубе никогда не слышал
              * Более всего там ценится умение налабать что-то на конкретном фреймворке

              Особенно если Рога пишут на мейнстримном япе типа питона
              Ответить
              • Прога и Копыта

                вообще ему надо в научную роту, а то хохлы нас дрючат
                Ответить
                • > научную роту

                  https://pbs.twimg.com/media/EyMX8lfXMAAis5j?format=jpg
                  https://i.imgur.com/O8PDJA8.jpg
                  Ответить
                  • скорбей

                    https://s3.india.com/wp-content/uploads/2015/11/charlie-hebdo.jpg
                    Ответить
              • Это я тоже учел.

                Мой план, чтобы в резюме условного ротоёба было: "умею писать на джанге", а у меня: "умею писать на джанге, знаком с фласком, разбираюсь в алгоритмах и структурах данных, и немного в асимптотическом анализе".

                Нужно будет ещё гей-хаб запилить и туда залить какой-нибудь сайт-визитку, чтобы в резюме появился пункт про ГИТ и контроль версий.
                Ответить
                • А ты на питоне хочешь работать?
                  Ответить
                  • Даа, потому что к Ц++ меня никто в здравом уме не подпустит, плюс вакансий нема.

                    Если с питоном не заладится, придётся ехать в соседнее село на заработки, либо изучать отвратительное. Но я надеюсь, что до такого не дойдёт.
                    Ответить
                    • Ну смотри конечно, но точно тебе говорю, что писатели сайтов на джанге слово "асимптотический анализ" прочитать не смогут

                      Имеются ввиду конечно "веб-студии" разнообразные
                      Ответить
                      • Это всегда будет плюсом. Мало ли, вдруг я не к джангописакам джуном попаду, а к машинлёрнерам стажёром...

                        Ну и мне полезно будет эти алгоритмы поизучать, а то я натурально ОТУПЕЛ, пока ничего не писал. Простейшую питушню по джва дня пилю, но вот сейчас читаю и вроде бы как всё получше становится.
                        Ответить
                        • Да, машинлёрнеры оценят. Но там нужно еще уметь большие данные в облаках ворочать наверное
                          Ответить
                        • >к машинлёрнерам стажёром
                          пойти в вуз было бы продуктивнее (гугли ШАД)
                          Ответить
                          • именно поэтому я за «Маастрихт»: https://www.maastrichtuniversity.nl/education/bachelor/data-science-and-artificial-intelligence
                            Ответить
                            • и как, поступил?
                              Ответить
                              • IELTS в субботку сдавал, сейчас мне скорее всего предложат еще матешу сдать, пушо у меня аттестат плохой, а потом останется только визовая бюрократия да миллион на один только универ в год блядь, я молчу про съем студии за 500 евро да 1.5к на медстраховку в год
                                Ответить
                                • О, Рио, Рио
                                  О, мама мия
                                  Потерпи, я прибуду на днях
                                  Ответить
                                • стипендию и гранты не дают?
                                  Ответить
                                  • гранты только со второго года, увы
                                    Ответить
                                    • а ты бы сам пошел получать вышку в сознательном (21+ лет) возрасте?
                                      Ответить
                                      • Я знаю чувака, который вышку в 30 получил.

                                        Имхо, это вполне нормально, если ты понимаешь, что у тебя есть вопросы, ответы на которые может дать вышка
                                        Ответить
                                      • эм, а ты думаешь что мне 20-?
                                        Ответить
                                        • нет
                                          Ответить
                                          • ну так вот я и иду )
                                            Ответить
                                            • аа, я думал ты шутишь когда разговор за деньги зашел

                                              у меня есть одна тян, она хочет поступить в магистратуру заграницу уже не сразу после бакалавриата и мне стало интересно насколько это популярно

                                              тогда удачи, будет клево если поступишь
                                              Ответить
                                              • пока главный потенциальный багор это ватометы на границах, остальное всё складывается удачно. но после всех новостей последней пары недель решил на всякий максимально ускорить процесс, так что видимо как только виза / residence permit будут готовы и будут позволять лететь - полечу.
                                                Ответить
                      • некоторые вполне прочитают, но ответят что в базах данных разбираются со стороны разработчика, а не сисадмина
                        Ответить
                        • :)) Да, тоже таких видал.

                          Мое дело SQL запрос написать. А если он тормозит, то пусть админ там подмандит чонить в настройках.. Или сервак помощнее возьмет

                          Сёмизм
                          Ответить
                        • Почему сисадмина-то? DBA! Вашего тренирующегося DBA
                          Ответить
              • Почему обязательно к ротоёбам? Можно попасть к д++, про что он будет спрашивать? Не про постгре эскьюэль ли?
                Ответить
                • d++ спросит "а не ротоёб ли ты часом?". Тут-то можно будет и выдохнуть.
                  Ответить
                  • Ротоёб стало именем нарицательным )
                    Ответить
                    • "Вы не человек, Вы аргумент, который появился как раз вовремя" (c)
                      Ответить
                      • "Я уже не человек, бля, я зверь, нахуй!" (c)
                        Ответить
                • Я не очень уверен в наличии Д++ в тех краях. Д++ы вообще за пределами Москвы не часто встречаются
                  Ответить
            • к слову говнокод это прекрасная площадка для подготовки к собеседованиям на галеру

              после срачей про js и про безопасность веба я проходил собеседования в локальные компании достаточно легко
              Ответить
            • Ты очень сильно перестраховываешься, при том что пролететь мимо собеса или не пройти испытательный срок можешь при любых знаниях из-за софт-скиллз.
              Ответить
            • настраивайся на то что первые три собеса будут с целью не получения работы, а понимания что от тебя хотят на собесе. там дейтсвительно своя атмосфера, которую стоит немного прочувствовать, чтобы правильно понимать че с той стороны ищут.
              Ответить
              • Собственно да, тренируйся на кошках (т.е. на конторах ротоёбов, с которыми ты работать не будешь всё равно).
                Ответить
            • Держу за тебя кулачки, нян (((o(*°▽°*)o))) !
              Ответить
    • > import argparse
      По PEP8 между импортами и остальным кодом ставятся две пустых строки (как и между глобальными функциями/классами, за исключением тесно связанных).

      > array : list
      Это бесполезный тайп-хинт. Чтобы сделать его полезным — почитай доку по typing, ABC (https://docs.python.org/3/library/typing.html и https://docs.python.org/3/library/collections.abc.html, табличка в самом нячале как удобный cheatsheet) и "Postel's law": "be conservative in what you send, be liberal in what you accept". Тайпхинты параметров должны указывать как можня более "широкий" интерфейс, тайпхинты возвращаемых типов — как можно более "узкий", специализированный (в случае методов, предназначенных для переопределения, это может быть ня совсем так, но тут в двух ня не разберёшься). Так, для merge_sort() без подсчёта инверсий уместным будет примерня такое определеняе:
      # from collections.abc import List, Sequence  # Python 3.9+
      from typing import List, Sequence, TypeVar
      
      
      _T = TypeVar('_T')
      def merge_sort(array: Sequence[_T]) -> List[_T]:
          pass

      (Да, перед двоеточием в тайпхинте пробел ня ставится).
      Это ознячает, что мы получаем любой объект, которому можем сделать __len__() и __getitem__(), и возвращаем список из элементов того же типа, что лежат в объекте. В принципе, ня обязательно някладывать жёсткие ограничения в виде [_T]: можня обойтись Any.
      В принципе, можня упороться и возвращать тот же конкретный тип, что был передан в array (list -> list, tuple -> tuple), но это будет нянадёжно (а тайпхинты станут жуткими).
      Ответить
      • Возврат пары так ня обозначается. Можня либо сделать " -> Tuple[List[_T], int]" (плохо), либо, что гораздо лучше, воспользоваться dataclass:
        import dataclasses
        from typing import Generic, List, TypeVar
        
        
        _T = TypeVar('_T')
        @dataclasses.dataclass
        class MergeSortRet(Generic[_T]):  # С нязваниями у меня ня очень.
            array: List[_T]
            inversion_count: int
        
        
        def merge_sort(array: Sequence[_T]) -> MergeSortRet[_T]:
            pass



        > return (array, 0)
        Лучше будет возвратить копию:
        if len(array) <= 1:
            return MergeSortRet([x for x in array], 0)

        Во-первых, так мы точня возвратим массив (если пользователь передал tuple, няпример), а во-вторых, что важнее, соблюдём контракт: все остальные кейсы возвращают новый массив, и пользователь будет считать, что его можно будет безопасно изменять. Это будет работать для остальных случаев, однако для пустого или вырожденного массива пользователя будет ожидать неприятный сюрприз.

        > array[0], array[1] = array[1], array[0]
        Ещё хуже: для массива из двух элементов пользователь ня только не получит копию, но у него ещё и испортится оригинальный массив, что может привести к котострофе (и вообще ня сработает для tuple).

        Я понямаю желание оптимизировать (об этом ещё чуть позже), но в данном случае следовало сделать так: merge_sort() создаёт новый "рабочий" массив и передаёт его вместе с оригинальным во внутреннюю _merge_sort_impl(), которая и проводит все эти оптимизации. Для сохранения оригинального массива, правда, придётся делать ещё и его копию, но это уже детали.
        Ответить
        • > array[:mid]
          Здесь — серьёзный нядостаток реализации. Слайс от списка/кортежа/строки в Питоне создаёт копию и имеет сложность O(M) (M — длина слайса). Это приводит к тому, что во время выполнения сортировки создастся и удалится примерня 2^(log2(N) + 1) = 2*N лишних списков, что, хоть и сохранит требуемую асимптотику, но создаст чрезвычйня большие някладные расходы. Избежать их можня несколькими путями (предполагая, что имплементация _merge_sort_impl() из параграфа выше реализована):
          1. C-style: передаём в _merge_sort_impl() и _merge() исходный массив, рабочий массив, индекс начала слайса и индекс конца слайса. Просто, понятно, эффективня, но очень легко пронякать индексы и няткнуться на off-by-one.
          2. C-style с финтифлюшками: сделать датакласс _MergeTask(source_array, working_array, begin_idx, end_idx), прописать в него __slots__ для скорости и передавать его.
          3. Генераторнуться и использовать itertools.islice(). Потенциальня хорошо подойдёт для _merge(), но для этапа разделения придётся передавать длину слайса в аргументах (len(islice(...)) позвать няльзя).
          4. Няписать свой собственный "islice" по типу View(array, begin_idx, end_idx) (и дополнительными удобствами в виде константных view.head(), view.__len__(), view.pop()) или использовать готовый из каких-нябудь библиотек, в котором будет храниться длина слайса.
          5. Использовать какой-нибудь другой вариант merge sort'а, коих просто няллионы самых разных и с самыми разными характеристиками.
          6. ?????
          7. Ня!
          Разумеется, можня и ещё что-нибудь придумать, но тут уже нужны конкретные требования, кодстайл и прочее.
          Ответить
          • Что касается _merge()...
            > resulting_array = list()
            Как я уже говорила, результирующий массив должен создаваться ня самом верху, а все рекурсивные вызовы должны использовать ссылку на него.

            > right_array.pop(0)
            Это плохо, pop() первого элемента вызовет перемещение всех остальных и, подозреваю, уведёт асимптотику всего алгоритма в квадраты. Нясмотря на нязвание, list в Питоне — совсем не list, а очень даже vector, и константно удалять его нячало няльзя. Эффективня смерджить отсортированные массивы можня как-то так:
            def merge(left, right):
                res = []
                left_idx, right_idx = 0, 0
                # Пока в обоих массивах есть элементы...
                while left_idx < len(left) and right_idx < len(right):
                    # ...из текущей пары элементов выберем наименьший и 
                    # продвинем соответствующий массив
                    if left[left_idx] < right[right_idx]:
                        res.append(left[left_idx])
                        left_idx += 1
                    else:
                        res.append(right[right_idx])
                        right_idx += 1
                
                # К этому моменту минямум один из массивов пуст, 
                # а list.extend() ня будет делать ничего для пустого слайса,
                # поэтому таким образом мы можем обойтись без лишних 
                # if left_idx < len(left): ...
                res.extend(islice(left, left_idx, len(left)))
                res.extend(islice(right, right_idx, len(right)))
                return res

            (Конечно, можня короче раза в два, но менее читаемо).
            Ответить
            • Для использования merge_sort() сюда нужня добавить подсчёт инверсий, заменить res.append() на запись соответствующего элемента в результирующий массив (_merge(left, right, res, res_idx): ... res[res_idx] = left[left_idx]; res_idx += 1; left_idx += 1), где изнячальный res_idx — это индекс нячала слайса ня текущей итерации, а left и right — ня соответствующие view или, что хуже, четвёрку (массив, начало_левого_слайса, конец_левого_слайса, начало_правого_слайса, конец_правого_слайса). С учётом того, что в merge_sort() реальные left и right будут ня произвольными слайсами, а протяжёнными кусками рабочего массива, это можно ещё больше пооптимизировать (передавая тройку (начало, середина, конец), няпример), но мне лень.
              Ответить
              • Ня вычитывала (лень), извините ( ̄▽ ̄*)ゞ.
                Ответить
                • Ух ты! Обязательно всё это приму к сведению в следующий раз, PEP8 тоже подучу обязательно uwu Спасибо большое~ Как хорошо, что ты _ВСЁ_ зняешь! :з
                  Ответить
                  • У меня в Си нет никакого PEP8, именно поэтому я а Си.
                    Ответить
                    • Однако "lint" появился пол века назад примерно
                      Ответить
                      • Правила lint никто соблюдать не обязывает всюду (кстати lint это не стайл чекер и не автоформатер, это стат. анализатор). Есть конечно хуйня вроде MISRA C http://easyelectronics.ru/files/Book/misra_c_rus.pdf и всякие известные популярные кодстайлы, тот же PEP 7 для сишки есть, но их никто не соблюдает в 99% кода, стандартного набора правил нет.

                        В питоне еще это правило с отступами как частью синтаксиса, будто бы программисты слишком тупы, чтобы писать читаемый код без энфорсинга подобной хуиты на уровне синтаксиса самого языка.

                        https://habr.com/ru/post/552006/

                        >Давайте сравним, как я пишу код на С++:

                        >И как его пишут дети:

                        >Теперь как я пишу код на Python:

                        >И как его пишут дети:

                        >То-то и оно. К пробелам можно привыкнуть за пару дней, а взамен за моральные страдания, вы получите чётко структурированный, лаконичный, легко читаемый программный код, причём он такой у всех программистов, независимо от их уровня

                        Т.е. заставить всех прогонять свой код через стайл-чекер или автоиндентилку там где это нужно (в каком-то проекте, который пишут много людей) это не наш метод, надо прямо в язык встроить говноправила по синтаксису через отступы, и это типа преимущество?
                        Ответить
                        • Что плохого в едином кодстайле? Тебе нравится когда каждый свои правила изобретает?
                          Ответить
                          • То, что единый кодстайл может быть говно(или не нравиться лично мне), и тогда у всех будет кодстайл говно(или не нравиться лично мне).
                            Ответить
                            • Тогда у нас будет один пострадавший: ты.

                              Если же единого кодстайла нет, то пострадает любой, кто высунется за пределы своего проекта, потому что там всё будет чужое и неправильное.

                              Чем меньше пострадавших -- тем лучше
                              Ответить
                              • > Тогда у нас будет один пострадавший: ты.

                                Если единый кодстайл - говно, пострадавшие - все.
                                Ответить
                                • "говно" -- понятие субъективное. Маловероятно, чтобы говёный с точки зрения всех кодстайл был принят за стандарт.

                                  Скорее всего, кодстайл не нравится отдельным людям, и среди пишущих на питоне таких меньшинство
                                  Ответить
                                  • > Маловероятно, чтобы говёный с точки зрения всех кодстайл был принят за стандарт.

                                    Говеность кодстайла можно оценивать в контексте решения неких задач. И для конкретного применения (написания такой-то хуиты, которая делает то-то и то-то) некий конкретный кодстайл может быть тем еще говном. Например, мне в хер не уперлось соблюдать какую-нибудь MISRA-C для какой-то одноразовой поделки на сишечке, которая допустим нужна мне для парсинга(анализа) захваченных через tcpdump пакетов и выковыривания оттуда некоторой херни. Я просто проебу время на то, чтобы соблюдать всякие уебанские говноправила. А где-то эта MISRA-C может быть вполне оправдана. А в питоне просто есть этот кодстайл, и все через него пишут, и не факт что для некоторой конкретной проблемы он подходит хорошо. И таким образом, наличие единого навязываемого сообществом правила оформления кода - может оказаться тем еще говном.
                                    Ответить
                                    • А в чем проблема с соблюдением pep8 для одноразовой поделки на питоне?
                                      Ответить
                                      • А зачем мне его соблюдать, если это - одноразовая поделка на питоне? Зачем мне тратить время на соответствие неким формальным правилам?
                                        Ответить
                                        • Если ты некоторое время пишешь на языке, то соблюдать кодстайл тебе проще, чем НЕ соблюдать.

                                          Питонист на автомате напишет ``MyClass``, но ``user_name``.
                                          Тоже самое сделает джавист, шарпей, и любой, в чьем языке есть фиксированный кодстайл.

                                          Сишник, если он варится в рамках одной среды/ос, тоже скорее всего имеет кодстайл в подкорке.

                                          Так что ему не требуется усилий чтобы "соблюдать кодстайл", и даже наоборот
                                          Ответить
                                          • > Если ты некоторое время пишешь на языке, то соблюдать кодстайл тебе проще, чем НЕ соблюдать.

                                            Нет. Лично мне - поебать совершенно. В одном проекте я могу
                                            int somefunc(int shit, char crap) {
                                            	if (shit < 0) {
                                            		return shit + fuck;
                                            	}
                                             	else
                                            	{
                                            		crap++;
                                            	}
                                            	return shit - crap;
                                            }

                                            В другом могу
                                            int somefunc(int shit, char crap)
                                            {
                                              if (shit < 0)
                                              {
                                                return shit + fuck;
                                              }
                                              else
                                              {
                                                crap++;
                                              }
                                              return shit - crap;
                                            }


                                            И меня это почему-то вообще ни разу не напрягает. К тому же автоформатеры есть.

                                            И проблем с разным_стилем_именования РазногоГовнаВРазныхПроектах я тоже что-то не испытываю.
                                            Ответить
                                            • >Нет.
                                              Потому что ты пишешь на языке без фиксированного кодстайла.
                                              А я говорил про "любой, в чьем языке есть фиксированный кодстайл."

                                              >могу
                                              А зачем? В чем преимущество писать по разному?
                                              Ответить
                                              • > А зачем? В чем преимущество писать по разному?

                                                Если говорить о расстановке отступов (табы, пробелы, как ставить {}) то в целом похер, потому что есть автоформатеры.

                                                А если говорить о правилах вроде "нельзя goto который прыгает выше по коду, и вообще нельзя goto, не пишите циклы while(), а глобальные переменные называйте с таким-то там блядь префиксом", то это уже может быть багор. Я вот в своей одноразовой поделке хочу писать так, как мне лично удобно писать здесь и сейчас для этой задачи, а не так, как решили что надо писать код какие-то хуи с горы.
                                                Ответить
                                                • > А если говорить о правилах вроде "нельзя goto который прыгает выше по коду, и вообще нельзя goto, не пишите циклы while(), а глобальные переменные называйте с таким-то там блядь префиксом", то это уже может быть багор.

                                                  Ты точня знаешь, что написано в PEP8?
                                                  Ответить
                                                  • > Ты точня знаешь, что написано в PEP8?

                                                    Да, читал немного

                                                    https://www.python.org/dev/peps/pep-0008/#names-to-avoid

                                                    Такие имена лучше избегай.

                                                    https://www.python.org/dev/peps/pep-0008/#class-names

                                                    Классы надо вот так называть, а не как попало.

                                                    https://www.python.org/dev/peps/pep-0008/#imports

                                                    Импорты вот так надо писать, а не как-попало
                                                    Ответить
                                                    • Теперь глубоко вдохни, выдохни, настройся на размышления и подумай: чем правила именования сущностей отличаются от "нельзя goto который прыгает выше по коду, и вообще нельзя goto, не пишите циклы while()"?
                                                      Ответить
                                                      • Да, расскажи мне, чем концептуально такое правило отличается от правил аннотации переменных и функций, например https://www.python.org/dev/peps/pep-0008/#function-annotations https://www.python.org/dev/peps/pep-0008/#variable-annotations

                                                        Или этого https://www.python.org/dev/peps/pep-0008/#programming-recommendations
                                                        Ответить
                                                        • > правил аннотации переменных и функций, например
                                                          А ты точня прочитал, что в этих параграфах няписано?

                                                          > programming-recommendations
                                                          Помимо нескольких действительня параграфов, относящихся к codeguide'у, всё остальное — это просто рекомендации о том, как ня выстрелить себе в ногу. С тем же успехом ты можешь открыть "Annex J" сишкостандарта и ужаснуться количеству приведённых там "правил".
                                                          Ответить
                                                          • > А ты точня прочитал, что в этих параграфах няписано?

                                                            А почему вы отвечаете вопросом на вопрос?

                                                            > Помимо нескольких действительня параграфов, относящихся к codeguide'у, всё остальное — это просто рекомендации о том, как ня выстрелить себе в ногу.

                                                            И что? "Не использовать goto вообще" - это тоже из серии "просто рекомендации о том, как ня выстрелить себе в ногу."
                                                            Ответить
                                                            • Потому что эти параграфы — одни из самых "свободных" в PEP8. Как ня странно, они совершенно ня обязывают тебя ставить тайпхинты, даже более того: "Users who don't want to use type checkers are free to ignore them".
                                                              Ответить
                                                              • Если так на это смотреть, PEP8 вообще целиком и полностью является рекомендацией, и ни к чему никого не обязывает. И делать примечания, что вот эта часть - еще более рекомендательно-рекомендательные рекомендации, ну по-моему немного лишнее.
                                                                Ответить
                                                                • О, а я об этом всего два раза написала!
                                                                  Вовсе ня лишнее. Весь PEP8 — это рекомендация, поэтому ты можешь выбирать: писать по PEP8, или ня писать по PEP8. Если ты выбираешь писать код по PEP8, то те параграфы, которые отмечены как ещё более рекомендательные рекомендации, ты выполнять ня обязан, а те, которые предписательные — обязан*.

                                                                  * Разумеется, "обязан" в том смысле, что если ня будешь выполнять, то формальня код не будет соответствовать PEP8, только и всего.
                                                                  Ответить
                                                            • > И что? "Не использовать goto вообще" - это тоже из серии "просто рекомендации о том, как ня выстрелить себе в ногу."
                                                              Ну ладня. Тогда открой J.2 Стандарта C и ужаснись количеству "правил", жутко тебя ограничивающих.
                                                              Ответить
                                                              • > Тогда открой J.2 Стандарта C

                                                                Это же список UB, а не набор рекомендаций.
                                                                https://web.archive.org/web/20181230041359if_/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf#section.17.2


                                                                Какой кстати список UB в питоне?
                                                                Ответить
                                                                • > Это же список UB, а не набор рекомендаций.
                                                                  Это набор рекомендаций, как делать ня надо, чтобы твоя программа не стала нявалидной.

                                                                  > Какой кстати список UB в питоне?
                                                                  UB в Питоне состоят только из багов интерпретатора (няпример, https://bugs.python.org/issue9530).
                                                                  Ответить
                                                • Ну ты можешь и на питоне писать как угодно, но люди в целом стремятся делать всё единообразно: так мозгу проще.

                                                  Если ты привык, что глобальные переменные всегда имеют префикс "g" например, то нет никакого смысла называть их как-то иначе.

                                                  В самом си нету стандарта касаемо наименований, потому у тебя и возникает желание " писать так, как мне лично удобно писать здесь и сейчас", а у большинства питонистов такой потребности нет.

                                                  На самом деле некоторый кодстайл наверняка есть и у тебя.

                                                  Напиши, например, итерацию по какому-нить массиву
                                                  Ответить
                                        • Как хочешь, ты можешь спокойня ня соблюдать ни единого правила из PEP8.
                                          Но если решишь таким кодом поделиться — ня удивляйся, что тебя заслуженно занякают какашками.
                                          Ответить
                                          • > Но если решишь таким кодом поделиться — ня удивляйся, что тебя заслуженно занякают какашками.

                                            В т.ч. поэтому я за Си. Если я своим кодом со своим персональным кодстайлом поделюсь, никто меня закидывать не будет. Т.к. никакого PEP8 нет, и у всех кодстайл разный бывает.
                                            Ответить
                                            • За табы закидают, потому что табами форматируют только сумасшедшие. За няконсистентность кодстайла тоже совершенно справедливо закидают. За кривой нейминг переменных закидают. За отсутствие пробелов закидают. За отсутствие отступов закидают.

                                              Да, кодстайл может быть разным. Но это совершенно ня означает, что он ня может быть говном.
                                              Ответить
                                              • > За табы закидают, потому что табами форматируют только сумасшедшие.

                                                Нет, закидает только часть, другая часть одобрит, и потом они еще будут друг-друга закидывать. Табы vs. пробелы это известная тема для срачей у программистов.

                                                > За няконсистентность кодстайла тоже совершенно справедливо закидают.

                                                Можно делать консистентный, но свой особенный.

                                                >За кривой нейминг переменных закидают.

                                                Про правильный и неправильный нейминг тоже межконфессионный срач можно устроить.

                                                >За отсутствие пробелов закидают. За отсутствие отступов закидают.

                                                Через автоидент прогнать, и проблема решена.
                                                Ответить
                                                • > Табы vs. пробелы это известная тема для срачей у программистов.
                                                  void foo(LongTypeName longParameterName,
                                                           AnotherLongTypeName anotherParameterName)

                                                  Всё, срач закончен. Sapienti sat.

                                                  > Про правильный и неправильный нейминг тоже межконфессионный срач можно устроить.
                                                  Существует достаточно большое количество устоявшихся правил, которые работают в любом языке. Однябуквенные переменные и параметры (если они не устоялись в предметной области, как x, y, z для координат, няпример), бессмысленные нязвания, нязвания, вводящие в заблуждение — за всё это какашками закидают в абсолютно любом языке. И будут правы.
                                                  Или для тебя функция "get_last_element(array)", возвращающая количество элементов в массиве — это такой особенный кодстайл, нядо быть толерантным и уважать права всех говнокодеров?

                                                  > Через автоидент прогнать, и проблема решена.
                                                  А куда же делось "Если я своим кодом со своим персональным кодстайлом поделюсь, никто меня закидывать не будет"? Внязапно оказывается, что нядо ещё через что-то прогонять...
                                                  Ответить
                                                  • > Всё, срач закончен. Sapienti sat.

                                                    void
                                                    foo
                                                    (
                                                    	LongTypeName longParameterName,
                                                    	AnotherLongTypeName anotherParameterName
                                                    )

                                                    Как тебе такое, Илон Маск?
                                                    Ответить
                                                    • Видимо, ня sapienti. Объясняю простым языком: пробелами ты можешь красиво отформатировать любой код, табами — ня можешь. Вот и всё.
                                                      Ответить
                                                      • https://www.emacswiki.org/emacs/SmartTabs

                                                        Как я попал в этот тред? Патчил мнязию, а OTP-шники этот ^ стиль используют, лол.
                                                        Ответить
                                                  • > А куда же делось "Если я своим кодом со своим персональным кодстайлом поделюсь, никто меня закидывать не будет"? Внязапно оказывается, что нядо ещё через что-то прогонять...

                                                    Кому надо прогонять - те пусть у себя прогоняют.
                                                    Ответить
                                                    • А, ну то есть ты всё таки за права ущербных писать код без отступов? Ну, что тут сказать, сожалею.
                                                      Ответить
                                                      • >А, ну то есть ты всё таки за права ущербных писать код без отступов?

                                                        https://en.wikipedia.org/wiki/Straw_man
                                                        Ответить
                                                        • Тогда ответь ня вопрос: ты за права ущербных писать и публиковать код без отступов, или против?
                                                          Ответить
                                                          • Я не вижу проблемы в том, что кто-то публикует какой-то код. Код без отступов вообще - это хуево, соглашусь. Но запрещать кому-то писать и публиковать такой код - нет, не считаю необходимым, но такой код определенно говно, хоть его и легко можно исправить автоидентом. Опубликовавшему такой код наверняка кто-то скажет, что его код - говно, и так делать не следует, и вероятно он так перестанет писать, так что публикация такого кода в итоге окажется благом.

                                                            Мой аргумент заключался в том, что если кому-то не нравится лично мой способ делать отступы (допустим я решил делать отступы в 3 пробела, а кому-то это не нравится), то этот кто-то может пойти и прогнать через автоиндентилку мой код, который сделает табы, или сделает два пробела, или сделает четыре пробела, или еще что-то там сделает, и в этом я проблемы не вижу.
                                                            Ответить
                                                            • > Опубликовавшему такой код наверняка кто-то скажет, что его код - говно, и так делать не следует, и вероятно он так перестанет писать, так что публикация такого кода в итоге окажется благом.
                                                              Имення об этом и шла речь с самого нячала дискуссии. Если человек выложил код с говнокодстайлом (при чём об объективных признаках говна в стиле я уже писала выше) — ему об этом скажут, он задумается и станет писать лучше нет: https://habr.com/ru/post/283166/.
                                                              Питон в этом просто идёт ня шаг впереди: человек, решивший няписать что-то на Питоне, сразу же столкнётся с няобходимостью расставлять консистентные (имення консистентные, четыре пробела Питон ня энфорсит) отступы и задумается. Просто пропуск одного шага.

                                                              > если кому-то не нравится лично мой способ делать отступы (допустим я решил делать отступы в 3 пробела, а кому-то это не нравится), то этот кто-то может пойти и прогнать через автоиндентилку мой код
                                                              А PEP8 просто разворачивает ответственность: это ня все должны подстраиваться под твой код, а ты должен подстраиваться под всех — запуская автоидентилку.

                                                              Очень простой вопрос: есть проект, в кодстайле няписано: отступ — 5 пробелов. Когда ты делаешь туда коммит — ты запускаешь автоидентилку (вручную, хуками — няважно), или коммитишь просто с твоими любимыми тремя табами?
                                                              Ответить
                                                              • > Питон в этом просто идёт ня шаг впереди: человек, решивший няписать что-то на Питоне, сразу же столкнётся с няобходимостью расставлять консистентные (имення консистентные, четыре пробела Питон ня энфорсит) отступы и задумается. Просто пропуск одного шага.

                                                                Тут неоднозначно. Ну допустим дадут какому-нибудь нубу сишечку, будет он писать код без отступов хуй пойми как, получится некое нечитаемое говно, с которым он еще некоторое время поебется и в итоге или прогонит через автоидентилку (если ему про такую хрень подскажут), или сам ручками перепишет. И тем самым на собственном опыте поймёт, нахуя нужно соблюдать какой-то стиль. А питон тебе просто не дает возможности получить такой охуительно полезный опыт, не дает возможности на собственном опыте понять хуевость отсутствия единого стиля. Он просто навязывает эти правила с отступами.

                                                                > Очень простой вопрос: есть проект, в кодстайле няписано: отступ — 5 пробелов. Когда ты делаешь туда коммит — ты запускаешь автоидентилку (вручную, хуками — няважно), или коммитишь просто с твоими любимыми тремя табами?

                                                                Я коммичу с теми отступами, с которыми принято там. А написать код для коммита я могу и в своём стиле(и тогда прогоню через автоидентилку), и в том стиле (тогда и прогонять не надо будет). Это по-моему очевидно.
                                                                Ответить
                                                                • > Тут неоднозначно.
                                                                  Согласня.

                                                                  > Я коммичу с теми отступами, с которыми принято там. А написать код для коммита я могу и в своём стиле(и тогда прогоню через автоидентилку), и в том стиле (тогда и прогонять не надо будет). Это по-моему очевидно.
                                                                  Вот и с Питоном всё точня так же: ты можешь делать отступы хоть из двух пробелов, хоть из трёх табов (вот мешать табы с пробелами и делать разные отступы в одной функции нельзя — тут давят креативность программистов, да), а потом просто прогонять автоидентилку.

                                                                  В начале PEP8 написано:
                                                                  > A style guide is about consistency. Consistency with this style guide is important. Consistency within a project is more important. Consistency within one module or function is the most important.
                                                                  То есть PEP8 — это стайлгайд по умолчанию. Когда ты делаешь новый проект (открываешь новый файл) — считается, что в нём ты пишешь по PEP8. Однако ты имеешь полное моральное право сказать (лучше явня, если код будет опубликован): "В этом проекте я пишу по такому-то стайлгайду (ставлю пять пробелов, классы именую с маленькой буквы, и так далее), делайте с этим что хотите". И всё: твой код будет полнястью согласован с PEP8.

                                                                  Собственно, в этом и вся фича. Питон имеет разумное умолчание, которое крайне полезно для нячинающих: вместо десятка с лишним вариаций одних только отступов (https://en.wikipedia.org/wiki/Indentation_style) новичок видит перед собой один стандартный кодстайл с по большей части действительня полезными советами о том, как сделать код более читабельным для окружающих. Чем меньше разброса и шатания в информации — тем меньше разброса и шатания в голове.
                                                                  Ответить
                                                              • > Очень простой вопрос: есть проект, в кодстайле няписано: отступ — 5 пробелов. Когда ты делаешь туда коммит — ты запускаешь автоидентилку (вручную, хуками — няважно), или коммитишь просто с твоими любимыми тремя табами?

                                                                Адекватные проекты используют .editorconfig.
                                                                Ответить
                                                                • > вручную, хуками — няважно

                                                                  Или ты предлагаешь проектам энфорсить локальный .editorconfig, чтобы бедный j123123 мучился с няправильными индентами?
                                                                  Ответить
                                                • >Можно делать консистентный, но свой особенный.

                                                  Я так и не понял -- зачем?

                                                  Если ты будешь делать программу с опциями командной строки, ты почти наверняка сделаешь
                                                  --foo=bar -x -y -z

                                                  и точно НЕ сделаешь
                                                  /foo:bar

                                                  потому что для тебя именно такое поведение естественно.

                                                  Если ты итерируешься по массиву, то счетчик ты назовешь "i" а не "q", а вложенный счетчик -- "j".

                                                  Если тебе нужно описать координаты в двумерном пространстве, то "x" будет означать абсициссу.

                                                  Ты даже не задумываясь выберешь такие названия и такие стили.

                                                  Точно так же поступает питонист.

                                                  У него нету потребности мочить манту и делать что-то против кодстайла.

                                                  Не существует проблемы такой
                                                  Ответить
                                                  • > Я так и не понял -- зачем?

                                                    Мне удобно писать с тем кодстайлом, с которым мне удобно, а не с которым мне навязывают писать.
                                                    Ответить
                                                    • Мне удобно использовать "/" в названии файлов, однако юникс навязывает мне этого не делать
                                                      Ответить
                                                      • Тоже мне проблема. Сделай свою ОС, в которой можно писать "/" в названии файлов, и пиши в ней "/" в названии файлов.
                                                        Ответить
                                                        • В принципе, ты тоже можешь сделать свой язык, и запретить в нем создание каких-либо кодстайлов
                                                          Ответить
                                                      • Мне удобно нязывать точку входа в программу start(), однако си навязывает мне этого ня делать (╥﹏╥).
                                                        Ответить
                                                        • Сделай форк языка Си, где вместо main() будет start(), и потом можно транспилировать из твоего форка языка в обычный Си.
                                                          Ответить
                                                          • Сделай форк языка Питон, где вместо пробелов будут фигурные скобочки, и потом можня транспилировать из твоего форка языка в обычный Питон.
                                                            Ответить
                                                            • Уже сделали: https://python-with-braces.appspot.com/
                                                              Ответить
                                                              • Ну вот и замечательня же (*^‿^*)!
                                                                Ответить
                                                              • Кcатати, как в языке без скобок выделить тело функции?

                                                                В vim я могу стать на скобку, и нажать "v%", а если скобочек нет, то хз как
                                                                Ответить
                                                                • Программно — возьми текущую строку и нячни сканировать вверх и вниз от неё, до тех пор, пока с обеих сторон не наткнёшься ня непустую строку с меньшим отступом. Плагинами ня знаю, няпиши.

                                                                  А, ну и ещё вложенность скобочек нядо учитывать:
                                                                  def f():
                                                                      a = (
                                                                  1, 2, 3
                                                                  )
                                                                      return a
                                                                  Ответить
                                                                  • да програмно-то понятно как)

                                                                    нужно плагин искать или писать
                                                                    Ответить
                                                                    • Ня: https://stackoverflow.com/questions/6579723/whats-the-fastest-way-to-select-a-function-of-python-via-vim . Отткуда: https://github.com/bps/vim-textobj-python ,
                                                                      af: a function
                                                                      if: inner function
                                                                      ac: a class
                                                                      ic: inner class
                                                                      Ответить
                                                            • > где вместо пробелов будут фигурные скобочки

                                                              class Olesya():
                                                              {{def{__init__(arg):
                                                              {{{{self.__arg{={arg
                                                              Ответить
                                                          • А нельзя просто линкер как-то подправвить? Через скрипт там или опции?
                                                            Ответить
                                                            • Можня, но
                                                              1) Няпортабельно ("The behavior is undefined in the following circumstances: [...] A program in a hosted environment does not define a function named main using one of the specified forms (5.1.2.2.1)");
                                                              2) К CRT ня прилинкуешься.

                                                              А так — -Wl,-eentry_point, в Visual Studio /ENTRY.
                                                              Ответить
                                                            • Можно чтоб функция _start() вызывала не main а что-то другое
                                                              Ответить
                                                  • > и точно НЕ сделаешь
                                                    > /foo:bar

                                                    dotnet publish /p:PublishTrimmed=true
                                                    Ответить
                                              • Гост, ты совсем поехал со своим «ня». Не заметишь, как в реале однажды случайно так скажешь )
                                                Ответить
            • >Нясмотря на нязвание, list в Питоне — совсем не list, а очень даже vector,

              пушо алгоритмы нужно изучать на голых сях или паскале, где структуры данных предсказуемы
              Ответить
        • > dataclass

          Добрый вечер, gost.
          Ответить
          • Этот оффтоп
            Ответить
            • А мне нравится кодстайл из https://github.com/mpak2/mpak.su/blob/master/include/func.php. Он какой-то такой... фундаментальный, хтонический. Медлення листаешь его — и сразу как в нирвану погружаешься, появляется ощущение, будто стоишь под огромной и няпостижимой горой.
              Ответить
              • Здорово. А я тут при чем?
                Ответить
              • Врана-то продолжает радовать нас высококачественным кодом
                https://github.com/vrana/adminer/commit/72beecc0ab082d32b117b346b76d562c9f4b478c

                жив курилка
                https://github.com/vrana/adminer/blob/72beecc0ab082d32b117b346b76d562c9f4b478c/adminer/create.inc.php
                Ответить
                • А кто это? Чем зняменита?
                  Ответить
                  • Его код форкнул mpak, так мы его и нашли вроде, и он даже сюда приходил
                    Он пишет как PHP (как ты видишь) и еще на JS, так же примерно
                    https://github.com/vrana/games/blob/master/monopoly/place.js
                    Ответить
                    • Понятно, спасибо, няшла ٩(◕‿◕。)۶!
                      Ответить
                    • } else if (this.upgrades < 5) {
                      		if (!this.ownsAllOfColor()) {
                      			return;
                      		}


                      Блядь. Early return освоили -- хотя впрочем нет, не освоили.
                      Ответить
                • ебать ему еще люди плуреквесты шлют
                  https://github.com/vrana/adminer/pull/422/commits/f3fbeb622e6b7f0b9e873a870f4bc0bf561f87fd#diff-1867fd260b46319bc14833075196c6cc21072426a3c212b774b49c8440d1e3a3L340
                  Ответить
                  • Ну тула же полезная... Почему бы и не пофиксить что-то. Тем более код простой, во фреймворки вникать не надо.
                    Ответить
    • https://pbs.twimg.com/media/Ey1-bAeWUAE7BUJ?format=png&name=small
      Ответить
    • Сэргай
      Ответить

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