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では両方とも異なる結果で機能します。printPython 2.7では他に何を知っておくべきですか?


7
Python 2.xではprint、実際には関数ではなく特別なステートメントです。これも、次のように使用できない理由です。タプルは作成さlambda x: print x(expr)ません(結果はexpr)が、作成されることに注意してください,

声明は、Python 3に向かって移動するための新しい構文を使用する人々を奨励しながら、パイソンの旧バージョンとの下位互換性を維持することであるように私は機能や印刷などの印刷のための支援を想定しています
GWW

11
PSは、あなたが将来のインポートを行う必要があります(print文の振る舞いを持っていない)2.7の印刷機能を有効にするには:from __future__ import print_function
ジェフ・メルカド

2番目の例は、実際には「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.]

ただし、printはPython 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)、Python 2.xで合法である理由についてですが、2.x標準に従っている必要はありません。
vinnief 2017年

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れます。
Hubro 2012

3
@Codemonkey、あなたはreprについて正しいです。あなたはアスキーについて間違っています。ASCIIはPythonのデフォルトのエンコーディングです。しかし、私はPythonスクリプトの最初に#encoding=utf-8linux env を持っていLANG=en_US.UTF-8ます。したがって、reprはデフォルトのASCIIではなくutf-8エンコーディングを使用してエンコードします。
Karlo Smid

1
Reprはstr特別なstring_escapeエンコーディングでエンコードします。文字列はすでにUTF-8としてUnicodeエンコードされています。
tzot

@KarloSmid:私が言うつもりだったのは、文字列 ASCIIとしてエンコードされているとは限らず、(非ASCII記号をエスケープすることによって)reprテキスト ASCIIで表現できることを確認するための手順を実行することです。それが完全に正確かどうかはまだわかりません。
Hubro

すべての Pythonコンテナー(リスト、辞書、タプル、セット)はrepr()、文字列に変換されたときにそれらのコンテンツを出力として含みます(それらはを実装せず__str__、のみを実装します__repr__)。あなたが見るものはUTF-8に特別ではありません。repr()文字列のthe は、ASCIIセーフである有効なPython文字列リテラルを提供します。
Martijn Pieters

2

基本的にPython 3より前のPythonでは、printは、引数として取得した場合にすべての文字列を出力する特別なステートメントでした。したがって、print "foo","bar"単に「print 'foo'の後に 'bar'」を意味しました。それは、印刷機能であるかのように行動したくし、以来、Pythonの文法は、その上で曖昧でたことで問題が(a,b)タプルであるabが、foo(a,b)二つの引数の関数への呼び出しです。

したがって、彼らは3の互換性のない変更を行って、プログラムの曖昧さを減らし、より規則的なものにしました。

(実際には、2.7は2.6と同じように動作すると思いますが、よくわかりません。)


いいえ、それを関数として使用するのは「魅力的」ではありませんでした。:)しかし、それを関数として使用することは不可能だったので、たとえば[リストのxのxをalistに出力する]ことはできません。
Lennart Regebro、2011年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.