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

    −100

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    size = 3
    lines = ["___", "bcd", "___"]
    board = [[None]*size]*size
    for x in range(0, size):
      for y in range(0, size):
        if lines[x][y] != '_':
          board[x][y] = lines[x][y]
    print(board)

    я бы, очевидно, хотел видеть результат:
    [[None, None, None], ['b', 'c', 'd'], [None, None, None]]
    но питоша выводит:
    [['b', 'c', 'd'], ['b', 'c', 'd'], ['b', 'c', 'd']]

    Запостил: serpinski, 24 Ноября 2012

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

    • http://ideone.com/Ugospe

      Все ок.
      Ответить
    • http://ideone.com/AIAjsf

      Питонское * использует shallow-copy, а не deep-copy. Отсюда и баг.
      Ответить
      • Какое же утомительное занятие программировать на Питоне: копипастить и копипастить...

        http://ideone.com/ttSf2c
        Ответить
        • > утомительное занятие программировать на Питоне

          Вы просто не умеете функционально питонировать: http://ideone.com/kDHksR
          Ответить
          • выглядит как отвратительный лисп
            Ответить
            • Каким боком это на лисп похоже?
              Ответить
              • левым
                Ответить
              • (make-array 
                          '(3 3)
                          :initial-contents
                          (mapcar (let ((x 1))
                                    (alexandria:compose
                                     #'(lambda (y)
                                         (incf x)
                                         (if (oddp x) (replace y '(b c d)) y))
                                     (alexandria:curry #'make-list 3 :initial-element)))
                                  (make-list 3 :initial-element nil)))
                #2A((NIL NIL NIL) (B C D) (NIL NIL NIL))

                ЗЫ. Долго искал повод, где бы можно было использовать эти функции, вот, нашлось.
                Ответить
                • Лисп многословнее питона?
                  Ответить
                  • Нет, это извращенный способ написать то, что автор задумал. Но, с другой стороны, есть традиция называть функции и аргументы без сокращений. Т.е. нету всяких len, str, dic. Но если кому-то захочется, - всегда можно добавить макрос, который сократит названия (мне не хочется).
                    Ну и в конце концов, Питон можно просто реализовать на Лиспе (кстати, есть даже такой проект), со всем его синтаксисом, так что нет однозначного ответа...
                    Ответить
                    • ненавижу сокращения в стандартной библиотеке. это ему от меня плюс. всегда можно ввести своё короткое название, если сильно раздражают длинные
                      Ответить
                      • > ненавижу сокращения в стандартной библиотеке

                        Трупстрауса и Александреску с тобой не согласятся. Да и Томпсон с Ритчи тоже.

                        std, cout, cin, rbegin, rend, int, char, bool, rand, endl.
                        Ответить
                        • а александреску нигде сокращений не делал. откуда инфа? вот труп в своё время всплыл, ага
                          Ответить
                    • > Питон можно просто реализовать на Лиспе
                      А можно и лисп на питоне. Тьюринг полнота такая тьюринг полнота.
                      Ответить
                      • Нет, я имел в виду реализовать грамматические правила языка, а не механизм. Грамматика - это к Хомскому, а не к Тюрингу.
                        Ответить
                  • (loop with bcd = (make-array '(3 3))
                       with data = #(b c d)
                       for i from 0 to 8
                       do (multiple-value-bind (j k)
                              (floor i 3)
                            (setf (aref bcd j k)
                                  (when (oddp j) (aref data k))))
                       finally (return bcd))

                    Ну, вот так нормально будет, пожалуй, если не задумываться особенно.
                    Ответить
            • В Лиспе по крайней мере есть макросы, чтобы такую ерунду не писать самому.
              Ответить
    • не говно
      Ответить
    • lines = ["___", "bcd", "___"]
      procBoard = lambda c: None if c == '_' else c
      board = [map(procBoard, list(l)) for l in lines]
      print board


      http://ideone.com/fB8sGY
      Ответить
      • Мяут, неужели это самый короткий вариант на питоне?
        Где твоя Команда R?
        Ответить
        • > неужели это самый короткий вариант на питоне?
          > Вы просто не умеете функционально питонировать: http://ideone.com/kDHksR

          Закоментированным записан вариант @myaut в одну строку.

          До этого у меня еще и масштабируемо было, но пришлось кастрировать, чтобы короче вышло.
          Ответить
          • А нет. Если подстановкой переписать, то его вариант короче (правда пришлось переписать на python3):
            board = [list(map(lambda c: None if c == '_' else c, l)) for l in lines]
            print (board)
            Ответить
            • А вот и самый простой вариант на python:

              board = [[None if c == '_' else c for c in l] for l in lines]
              print (board)
              Ответить
    • А такой вариант уже был?
      map(lambda x: map((lambda y: None) if x[0] == '_' else (lambda y: y), x), ['___', 'bcd', '___'])

      Кстати, интересный момент, "лишние" скобки убрать-то нельзя :)
      Ответить
    • for x in range(0, size):
      for y in range(0, size):
      if lines[x][y]

      Взять и уебать. На сишку, быстро, решительно!
      Ответить
    • []*n - в говнопитоне так делать нельзя, ололо :)

      Надо так: [list(x) for _ in range(n)]
      Ответить

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