web-dev-qa-db-ja.com

Python 3.xを超えるPython 2印刷ステートメントの新しい印刷機能の利点は何ですか?

関数(3.x)であるprintは、ステートメント(2.x)であるよりも優れていると何度か聞いたことがあります。しかし、なぜ?

私はそれが声明であるのが好きでした。主にそれは私が2つのより少ない文字(すなわち、括弧)をタイプするのを許したからです。

私は、printステートメントがそれをカットしないだけで、関数が優れている状況を見てみたいと思います。

67
rectangletangle

Jochen's answer および Sven's answer からのすべて、さらに:

次のようなprintを使用できない場所でprint() itを使用できます。

[print(x) for x in range(10)]
42
Lennart Regebro

根拠

Printステートメントは、Python 3000、Guidoの "Python Regrets"プレゼンテーション [1] などで削除される疑わしい言語機能のリストに長い間登場しています。そのため、このPEPの目的は新しいものではありませんが、Python開発者の間で多くの論争が生じるかもしれません。

Print()関数の次の引数は、Guido自身 [2] によるpython-3000メッセージから抽出されたものです。

  • printは、専用のステートメントを持つ唯一のアプリケーションレベルの機能です。 Pythonの世界では、コンパイラーの助けなしで何かができないことができない場合、構文は一般的に最後の手段として使用されます。印刷はそのような例外の対象ではありません。
  • アプリケーション開発のある時点で、呼び出しのロギングや他のI/Oライブラリへの呼び出しなど、より洗練されたものに印刷出力を置き換える必要性を感じることがよくあります。 print()関数を使用すると、これは単純な文字列置換になります。今日では、これらのすべての括弧を追加し、場合によっては>> streamスタイルの構文を変換するのが面倒です。
  • 印刷用に特別な構文を使用すると、進化の障壁が大きくなります。架空の新しいprintf()関数は、print()関数と共存するときにあまりフェッチされません。
  • スペースではなく、またはまったく別の区切り文字が必要な場合、printステートメントを別の呼び出しに変換する簡単な方法はありません。また、スペース以外の区切り文字を使用してオブジェクトを簡単に印刷する簡単な方法はありません。
  • Print()が関数である場合、1つのモジュール内(単なるdef print(*args):...)で、またはプログラム全体で(たとえば、__builtin__.printに別の関数を配置することで)置換する方がはるかに簡単です。現状では、write()メソッドでクラスを記述し、それをsys.stdoutに割り当てることでこれを行うことができます。これは悪くはありませんが、間違いなくはるかに大きな概念の飛躍であり、印刷とは異なるレベルで機能します。

PEP 3105 –関数を印刷する

53
Jochen Ritzel

printが関数であることの利点の1つは、一貫性です。それが声明である理由はありません。これらの2行を比較します

2.x: print >> my_file, x
3.x: print(x, file=my_file)

新しいバージョンはPythonによく似ていますよね?

機能バージョンのもう1つの利点は柔軟性です。たとえば、デバッグ目的ですべてのprint呼び出しをキャッチしたい場合は、printを単純に再定義できます。

def print(*args, **kwargs):
    # whatever
    __builtins__.print(*args, **kwargs)
33
Sven Marnach

私はこの質問を考えて、python 3バージョンの長所については知りませんでした。しかし、pandas.DataFrameの列を印刷する必要があるとき(Index([...])なし)、私はそれを見つけました

印刷* df.columns

例外をスローしますが、

print(* df.columns)

正常に動作します!また、複数の呼び出し印刷で同じ(構成可能な)印刷オプションが必要な場合は、それらを辞書に保存して**print_optionsとして渡すことができます。

したがって、少なくとも*args**kw_argsのトリックは、printが関数になる理由です!

18
Alleo

組み込みのprintをカスタムのものに置き換えることができます:

import os
import sys

def print(s):
   sys.stderr.write('Will now print ' + str(s) + '.' + os.linesep)
   sys.stdout.write(str(s) + os.linesep)

print(['A', 'list'])
# Output: 
# stderr: Will now print ['A', 'list'].
# stdout: ['A', 'list']

ラムダまたは関数呼び出しなどの中でprintを使用できます。

example_timeout_function(call=lambda: print('Hello world'), timeout=5)
do_things(print_function=print)
11
Artur Gaspar