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


98

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에서 또 무엇을 알아야 합니까?


7
Python 2.x print에서 실제로는 함수가 아니라 특수한 문입니다. :이처럼 사용할 수없는 이유도 lambda x: print x있습니다 (expr)튜플 (이 결과 생성하지 않습니다 expr), 그러나 ,않습니다.

나는 print에 대한 지원을 함수로, print에 대한 지원은 이전 버전의 파이썬과의 역 호환성을 유지하면서 사람들이 새로운 구문을 사용하여 파이썬 3으로 마이그레이션하도록 장려하는 것이라고 가정하고 있습니다.
GWW

11
추신, 2.7에서 인쇄 기능을 활성화하려면 (인쇄 문 동작이 없음) 향후 가져 오기를 수행해야합니다.from __future__ import print_function
Jeff Mercado

두 번째 예제는 실제로 "Hello, World!"를 인쇄합니까? (공백없이) 또는 "Hello, World!"를 인쇄합니다. (공백 포함) 예에서와 같이.
kapad

답변:


106

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

3
(expr) != tuple설명해 주셔서 감사합니다 :-)
Hubro

5

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

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

print expr1, expr2, ... exprn

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

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

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

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

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


이것은 완벽하게 정답입니다. 왜 그렇게 많이 반대표를 받았는지 모르겠습니다.
Martijn Pieters

그것은에 관한 print (expr1), (expr2), ... (expr3)것이 아니라 왜 print (expr1, expr2, ... , expr3)파이썬 2.x에서 합법적이지만 2.x 표준을 따르지 않아야 하는가에 관한 것입니다.
vinnief

5

여기 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 진수 바이트 값을 가진 튜플입니다.


7
나는 print가 UTF-8을 올바르게 인쇄하기 때문이라고 가정하지만 마지막 인쇄물과 같이 튜플을 받으면 실행 repr되며 그 시점에서 dict의 모든 문자열을 ASCII로 인코딩합니다.
Hubro

3
@Codemonkey, repr 에 대해 맞습니다 . ASCII에 대해 틀 렸습니다. ASCII는 Python의 기본 인코딩입니다. 하지만 파이썬 스크립트의 시작 부분에 #encoding=utf-8linux env가 LANG=en_US.UTF-8있습니다. 따라서 repr은 기본 ASCII가 아닌 utf-8 인코딩을 사용하여 인코딩합니다.
Karlo Smid

1
Repr str은 특수 string_escape인코딩으로 인코딩합니다. 문자열은 이미 UTF-8로 인코딩 된 유니 코드입니다.
tzot 2014 년

@KarloSmid : 내가 말하고자 하는 것은 문자열 반드시 ASCII 인코딩되는 것이 아니라 repr텍스트 가 ASCII로 표현 될 있도록 (비 ASCII 기호를 이스케이프 하여) 확인하는 단계를 수행 한다는 것입니다 . 그래도 그것이 완전히 정확한지 아직 모르겠습니다.
Hubro

모든 파이썬 컨테이너 (목록, 딕셔너리, 튜플, 세트)로 그 내용이 포함 repr()된 문자열로 변환 할 때 (그들은 구현하지 않는 출력 __str____repr__). 당신이 보는 것은 UTF-8에 특별한 것이 아닙니다. repr()문자열의 당신에게 ASCII-안전 유효한 파이썬 문자열 리터럴을 제공합니다.
Martijn Pieters

2

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

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

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


기능으로 사용하려는 "유혹"이 아니 었습니다. :) 그러나 함수로 사용하는 것은 불가능했기 때문에 예를 들어 [print x for x in alist]를 할 수 없습니다.
Lennart Regebro
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.