関数(3.x)であるprintは、ステートメント(2.x)であるよりも優れていると何度か聞いたことがあります。しかし、なぜ?
私はそれが声明であるのが好きでした。主にそれは私が2つのより少ない文字(すなわち、括弧)をタイプするのを許したからです。
私は、printステートメントがそれをカットしないだけで、関数が優れている状況を見てみたいと思います。
Jochen's answer および Sven's answer からのすべて、さらに:
次のようなprint
を使用できない場所でprint()
itを使用できます。
[print(x) for x in range(10)]
根拠
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に割り当てることでこれを行うことができます。これは悪くはありませんが、間違いなくはるかに大きな概念の飛躍であり、印刷とは異なるレベルで機能します。
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)
私はこの質問を考えて、python 3バージョンの長所については知りませんでした。しかし、pandas.DataFrame
の列を印刷する必要があるとき(Index([...])
なし)、私はそれを見つけました
印刷* df.columns
例外をスローしますが、
print(* df.columns)
正常に動作します!また、複数の呼び出し印刷で同じ(構成可能な)印刷オプションが必要な場合は、それらを辞書に保存して**print_options
として渡すことができます。
したがって、少なくとも*args
、**kw_args
のトリックは、print
が関数になる理由です!
組み込みの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)