Конкатенация строк Python - конкатенация '\ n' - PullRequest
9 голосов
/ 23 июля 2011

Я новичок в Python и мне нужна помощь, чтобы понять две проблемы, возникающие при объединении строк.Я знаю, что строки могут быть добавлены для объединения друг друга с использованием символа +, например, так.

>>> 'a' + 'b'
'ab'

Однако я недавно обнаружил, что вам даже не нужно использовать символ + для объединения строк (случайно/ возиться), что приводит к моей первой проблеме, чтобы понять - как / почему это возможно!?

>>> print 'a' + 'b'
ab

Кроме того, я также понимаю, что строка '\ n' создает 'новую строку'.Но при использовании в сочетании с моей первой проблемой.Я получаю следующее.

>>> print '\n' 'a'*7

a
a
a
a
a
a
a

Таким образом, возникает моя вторая проблема - «Почему я получаю 7 новых строк буквы« а ». Другими словами, не должен ли символ повторителя * повторятьбукву «а» 7 раз !? Как следует.

>>> print 'a'*7
aaaaaaa

Пожалуйста, помогите мне уточнить, что происходит.

Ответы [ 4 ]

18 голосов
/ 23 июля 2011

Когда "a" "b" превращается в "ab", это не то же самое, что объединять строки с +.Когда исходный код Python читается, смежные строки автоматически объединяются для удобства.

Это не нормальная операция, поэтому она не соответствует порядку операций, ожидаемому для + и *.

print '\n' 'a'*7

фактически интерпретируется кактакой же как

print '\na'*7

, а не как

print '\n' + 'a'*7
2 голосов
/ 23 июля 2011

Python объединяет строки вместе, если вы не разделяете их запятой:

>>> print 'a' 'b'
ab

>>> print 'a', 'b'
a b

Таким образом, вы на самом деле печатаете '\na' 7 раз.

1 голос
/ 23 июля 2011

Вы, наверное, уже поняли, что полагаться на неявную конкатенацию соседних строк иногда проблематично. Кроме того, объединение с оператором + неэффективно. Это не заметно, если объединить только несколько небольших строк, но это очень заметно в масштабе.

Откровенно об этом; используйте ''.join()

print '\n'.join(['a'*7])
1 голос
/ 23 июля 2011
  1. Я не уверен, что вы имеете в виду под "как это возможно". Вы пишете правило: две строки рядом друг с другом объединяются. Затем вы реализуете это в парсере. Зачем? Потому что это позволяет вам удобно делать такие вещи:

    re.findall('(<?=(foo))'   # The first part of a complicated regexp
               '>asdas s'     # The next part
               '[^asd]'       # The last part
              )
    

    Таким образом, вы можете описать, что вы делаете.

  2. Когда вы делаете A * B + C, компьютер всегда сначала делает A раз B, а затем добавляет C, потому что умножение предшествует сложению.

    Когда вы делаете конкатенацию строк, помещая строковые литералы рядом друг с другом, и умножение, специальная конкатенация строк идет первой. Это означает, что '\n' 'a' * 7 совпадает с ('\n' 'a') * 7, поэтому повторяемая строка - '\na'.

...