[python] Python 2.7에서 인쇄 된 괄호가 자발적인 이유는 무엇입니까?

Python 2.7에서는 다음 두 가지가 모두 동일합니다.

print("Hello, World!") # Prints "Hello, World!"

print "Hello, World!" # Prints "Hello, World!"

그러나 다음은

print("Hello,", "World!") # Prints the tuple: ("Hello,", "World!")

print "Hello,", "World!" # Prints the words "Hello, World!"

Python 3.x에서 괄호 print는 필수이므로 기본적으로 함수로 만들지 만 2.7에서는 둘 다 다른 결과로 작동합니다. print파이썬 2.7에서 또 무엇을 알아야 합니까?



답변

Python 2.x print에서 실제로는 함수가 아닌 특수한 문입니다 *.

이것이 다음과 같이 사용할 수없는 이유이기도합니다. lambda x: print x

참고 (expr)(이 결과 튜플을 생성하지 않습니다 expr), 그러나 ,않습니다. 이로 인해 Python 2.7 print (x)과 사이에 혼란이 발생할 수 있습니다.print (x, y)

(1)   # 1 -- no tuple Mister!
(1,)  # (1,)
(1,2) # (1, 2)
1,2   # 1 2 -- no tuple and no parenthesis :) [See below for print caveat.]

그러나, 이후는 printA는 특수 구문 문 / 문법 구조 다음 파이썬 2.x에서의 그것이 취급, 괄호없이, ,그리고 – ‘특별한 방식이야 하지 않는 튜플을 만듭니다. 이 print명령문 의 특수 처리를 통해 후행이 있는지 여부에 따라 다르게 작동 할 수 있습니다 ,.

즐거운 코딩입니다.


* printPython 2 의이 동작은 Python 3의 동작으로 변경할 수 있습니다.

from __future__ import print_function


답변

모두 매우 간단하며 순방향 또는 역방향 호환성과 관련이 없습니다.

print버전 3 이전의 모든 Python 버전에서 명령문 의 일반적인 형식 은 다음과 같습니다.

print expr1, expr2, ... exprn

(각식이 차례로 평가되고 문자열로 변환되고 그 사이에 공백이 표시됩니다.)

그러나 식을 괄호로 묶는 것은 여전히 ​​같은 식임을 기억하십시오.

따라서 이것을 다음과 같이 작성할 수도 있습니다.

print (expr1), (expr2), ... (expr3)

이것은 함수 호출과 관련이 없습니다.


답변

여기 UTF-8과 관련하여 흥미로운 부작용이 있습니다.

>> greek = dict( dog="σκύλος", cat="γάτα" )
>> print greek['dog'], greek['cat']
σκύλος γάτα
>> print (greek['dog'], greek['cat'])
('\xcf\x83\xce\xba\xcf\x8d\xce\xbb\xce\xbf\xcf\x82', '\xce\xb3\xce\xac\xcf\x84\xce\xb1')

마지막 인쇄는 16 진수 바이트 값을 가진 튜플입니다.


답변

기본적으로 Python 3 이전의 Python에서 print는 인수로 받으면 모든 문자열을 인쇄하는 특수 문이었습니다. 그래서 print "foo","bar"단순히 “인쇄 ​​’foo’다음에 ‘bar'”를 의미했습니다. 그것의 문제는 마치 print가 함수 인 것처럼 행동하고 싶은 유혹이었고, 파이썬 문법은 그것에 대해 모호합니다. 왜냐하면 (a,b)튜플이 포함 a하고 b있지만 foo(a,b)두 인수의 함수에 대한 호출이기 때문입니다.

그래서 그들은 프로그램을 덜 모호하고 더 규칙적으로 만들기 위해 3과 호환되지 않는 변경을했습니다.

(사실 2.7이 2.6과 같이 작동한다고 생각하지만 확실하지 않습니다.)


답변