Всегда ли Python 2.x возвращает строку для операторов печати?

Nov 16 2020

Я возился с Python 3.8 и 2.7 и обнаружил, что функция печати в Python 3 не позволяет печатать ведущие нули. Смотри ниже:

    >>> print(01)
  File "<stdin>", line 1
    print(01)
           ^
SyntaxError: leading zeros in decimal integer literals are not permitted; use an 0o prefix for octal integers

Я полагаю, это происходит потому, что Python 3.x различает типы данных даже при печати, поэтому работает следующее:

>>> print('01')
01

Я явно попросил напечатать строку. Хотя в Python 2.7 нет ошибки со следующим утверждением:

>>> print '01'
01

Он просто возвращает то, что я просил. Означает ли это, что Python 2.x всегда преобразует значения печати в строки?

Ответы

5 kojiro Nov 16 2020 at 20:52

В исходном Python 2 printэто утверждение, а не returnзначение.

>>> x=print 'hi'
  File "<stdin>", line 1
    x=print 'hi'
          ^
SyntaxError: invalid syntax

Если вы используете совместимую с будущим функцию печати в Python 2.7, скажем, она ведет себя точно так же, как Python 3.

В Python 3 printфункция всегда возвращает None. Он печатает в файл (часто стандартный вывод), но значение, возвращаемое функцией, будет None.

>>> x=print(1)
1
>>> x
>>> type(x)
<type 'NoneType'>

Что касается 1vs 01, в Python 2 число с ведущим нулем является восьмеричным:

>>> 010
8

Этот синтаксис недопустим в Python 3, поэтому вы получите SyntaxError: invalid token. Это происходит до того, как printоператор увидит, что происходит, поэтому он не имеет никакого отношения к этому print.

Если вы хотите записать число в восьмеричном формате в Python3 , правильный синтаксис выглядит 0o...следующим образом:

>>> 0o10
8