2012-08-28 14 views
37

私は文と式の違いを理解していますが、Python3はprint()を関数に変換したことを理解しています。Python2.xのprint()(関数バージョン)の使用

しかし、さまざまなPython2.xインタプリタで括弧で囲まれたprint()ステートメントを実行したところ、完璧に実行されたため、モジュールをインポートする必要はありませんでした。

私の質問:次のコードprint("Hello SO!")はPython2.xのステートメントまたは式として評価されていますか?

答えて

38

は、次の式を考えてみましょう:

a = ("Hello SO!") 
a = "Hello SO!" 

彼らは同等です。同じように、ステートメントで:

statement_keyword("foo") 
statement_keyword "foo" 

も同等です。

あなたがあなたの印刷機能を変更した場合ことに注意してください:

print("Hello","SO!") 

あなたのpython 2でのpython 2とPython 3との違いに気付くでしょう印刷がステートメントであることから、(...,...)はタプルとしてinterptetedされますPython 3では、複数の引数を持つ関数呼び出しです。したがって

、手元の質問に答えるためには、 printは、Python 2.xでのステートメントとして評価されていない限り、あなた from __future__ import print_function声明 print ("Hello SO!")、引数として評価され

+0

...が必要です。 – delnan

+0

__future__からprint_functionをインポートすると、Python3で傷つきますか?インポートエラーは発生しません。 – sgoblin

+1

@sgoblin - いいえ。 '__future__'モジュールは何もそれから削除されないことを保証します。それは事実上python3.xのno-opです – mgilson

2

これはまだ文として評価されています。単純に("Hello SO!")と表示されます。これはタプルではないため、単に"Hello SO!"と評価されます(delnanで説明したように)。

+3

かつ明確であることを、 '( "こんにちはSO!")' 'とまったく同じである' - それはタプルではありません "こんにちはSO!"。 – delnan

+0

ありがとう@delnan、私は1要素のタプルについて素敵な答えを投稿する前にあなたのコメントを見ました。 –

+2

delnanのコメントを展開するには、1タプルを作成するには、 '__future__ import print_function'やそれが呼び出されたものを除いて、コンマ(たとえば' Hello "!)、)') – mgilson

12

print("Hello SO!")(のpython 2.6で導入されました) printステートメントは式("Hello SO!")です。

これは、複数の値を印刷する場合に違いがあります。たとえばprint("Hello", "world")は、2つの文字列"Hello""world"ではなく、2要素タプル('Hello', 'world')を出力します。 Pythonの3使用from __future__ import print_functionとの互換性のために

>>> print("Hello", "world") 
('Hello', 'world') 
>>> from __future__ import print_function 
>>> print("Hello", "world") 
Hello world 
+0

もしあなたがpython2.5とpython3.xと互換性を持ちたいのであれば、文字列補間を使うことができます(しかし、あまりにも多くの人々が最近こう言っているとは思わない...) – mgilson

+4

これはまた非常に面白いです。これをスクリプトに入れると、 '__future__'のインポートがファイルの先頭で行われなければならないため、失敗するでしょうが、いくつかの深いpythonの魔法によってインタラクティブなインタプリタで動作します。 – mgilson

関連する問題