web-dev-qa-db-ja.com

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では両方とも異なる結果で機能します。 Python 2.7のprintについて他に知っておくべきことはありますか?

94
Hubro

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.]

ただし、printはPython 2.xの特別な構文ステートメント/文法構成であるため、括弧なしで、,を特別な方法-およびしないタプルを作成します。 printステートメントのこの特別な処理により、末尾に,があるかどうかにかかわらず、異なる動作をすることができます。

ハッピーコーディング。


* Python 2のこのprint動作は、Python 3の動作に変更できます。

from __future__ import print_function
102
user166390

ここでは、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進数のバイト値を持つタプルです。

5
Karlo Smid

それはすべて非常に単純であり、前方または後方互換性とは何の関係もありません。

バージョン3以前のすべてのPythonバージョンのprintステートメントの一般的な形式は次のとおりです。

print expr1, expr2, ... exprn

(各式は順番に評価され、文字列に変換され、それらの間にスペースが表示されます。)

ただし、式をカッコで囲むことは依然として同じ式であることに注意してください。

したがって、これを次のように書くこともできます。

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

これは、関数の呼び出しとは関係ありません。

3
Don O'Donnell

基本的に、Python 3の前のPython 3では、printは、引数として取得された場合にすべての文字列を出力する特別なステートメントでした。したがって、print "foo","bar"は単に「 'foo'に続いて 'bar'を印刷する」ことを意味していました。それに関する問題は、printが関数であるかのように振る舞うことで、(a,b)abを含むタプルですが、foo(a,b)は関数の呼び出しであるため、Python文法は曖昧です。 2つの引数。

そこで、彼らは3の互換性のない変更を行って、プログラムをより曖昧にせず、より規則的にしました。

(実際、2.7はこれに対して2.6のように動作すると思いますが、確信はありません。)

2
Charlie Martin