Python 2.7: Что print () делает со строкой внутри него

#python #string #python-2.7 #python-3.x

#python #строка #python-2.7 #python-3.x

Вопрос:

Я использовал print() синтаксис в своих файлах python 2.7, хотя знаю, что в 2.7 print это инструкция, а не функция, как в 3.X. Но у интерпретатора python, похоже, не было никаких проблем с print() синтаксисом, поэтому я сохранил его, чтобы упростить возможный будущий перенос на 3.X . Но я заметил что-то подозрительное в том, как Python обрабатывал строковый литерал внутри круглой скобки:

 >>>> print("nFirst linen", "Second line")

('First linen', 'Second line')  
  

В то время как типичный синтаксис инструкции 2.7 выводит символы новой строки, как и ожидалось:

 >>>>print "nFirst linen", "Second line"

First line
Second line
  

Вопрос:

Итак, каковы причины, по которым print () работает в 2.7, но игнорирует n символ? Это почти похоже на то, что print () выводит __repr__ строку содержащегося строкового литерала.

Комментарии:

1. Не удалось выполнить репликацию в Python 2.7.6.

2. Хотя интерпретатор Python 2.7.x не имеет проблем с синтаксисом, это, безусловно, выглядит некрасиво. Попробуйте print('a', 'b', 'c') в Python 3: a b c и в Python 2.x: ('a', 'b', 'c')

3. Для меня это не то, что он делает в 2.7.7.

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

5. @joshsvoss: Используйте from __future__ import print_function , чтобы получить тот же синтаксис для print в Python 2, что и в Python 3.

Ответ №1:

Вы можете заключить любое выражение в круглые скобки, не изменяя его значения, так что:

 print ("hello world")
  

точно совпадает с:

 print "hello world"
  

На первый взгляд это выглядит как вызов функции, но на самом деле вы просто печатаете строковое выражение, которое заключено в круглые скобки. Такая же сделка, как эта:

 x = 1   2   # same as
x = (1   2)
  

Однако, если вы попытаетесь напечатать несколько элементов или напечатать с запятой в конце вашей строки (что часто используется, чтобы избежать печати новой строки), вы получите результаты, которые вы описываете:

 print ("hello", "world")
print ("hello world",)
  

В этом случае вы печатаете кортеж.

 t = ("hello", "world")   # or
t = ("hello world", )

print t
  

И печать кортежа фактически выводит repr() каждого элемента внутри него.

Комментарии:

1. ДА. Вот почему я сказал, что на самом деле это не делает того, что он сказал, что это делает.