こんにちは。
今回はPythonの組み込み関数の一つであるprint()について、引数の使い方を学習しました。この記事はその時の学習内容の備忘録です。
Pythonを動かしている環境については簡単に言うと以下です。
- Windows 10 64bit
- python 3.9.4
- PyCharm Community Edition 2021.1 x64
より詳細は以前の記事に記載してあります。
print()関数の定義
Python 3.9.4 documentationにはprint()関数の定義が以下のように記載されています。
- print(*objects, sep=’ ‘, end=’\n’, file=sys.stdout, flush=False)
上記の括弧の中に記述された変数を仮引数(parameter)と呼びます。
各仮引数について、使い方を試してみました。
仮引数: *objects
仮引数「*objects」は可変長位置(var-positional)という種類の仮引数です。記号「*」によって、任意の個数の引数を表すという方式のようです。
実際のプログラムでprint()関数を呼び出す場合、括弧に記述した数値や変数は実引数(argument)と呼びます。
以下のようにサンプルプログラムを作ってみました。
ソース
print('Hello')
print('aaa', 'bbbb', 'ccccc')
最初のprint()関数には実引数に文字列を1つ記述しています。2つ目のprint()関数には実引数を3つ記述しています。
以下が実行結果です。
結果
Hello
aaa bbbb ccccc
上記のように仮引数「*objects」の位置には、複数の実引数を指定することができます。仮引数「*objects」に対する実引数を指定しただけの場合では、それぞれ半角スペースで区切られて出力されます。
仮引数: sep
print()関数は文字列を仮引数sepの値で区切って出力します。
print()関数の定義では、sepは以下の形式で記述されています。
- 仮引数 = 式(parameter = expression )
このような関数はデフォルト引数値(default parameter values)を持つと言います。
上記の形式で定義された仮引数は実引数を省略することが出来ます。「sep=’ ‘」と定義されているので、実引数を省略した場合は半角空白がsepの値になります。上記のサンプルプログラムで「aaa」、「bbbb」、「ccccc」が半角空白で区切られて出力されたのは、実引数を省略したからです。
以下のようにサンプルプログラムを作ってみました。
ソース
print('aaa', 'bbbb', 'ccccc', sep=',')
試しにsepに’,’(カンマ)を指定してみました。
以下が実行結果です。
結果
aaa,bbbb,ccccc
実引数に指定したとおり、カンマで区切られて文字列が出力されました。
仮引数: end
print()関数は文字列を出力した後、最後にendの値を出力します。
仮引数endにはデフォルト引数値「\n」が定義されています。これは改行を表す記号です。そのため、実引数でendを指定しない場合は、print()関数の出力は最後に改行されます。
以下のようにサンプルプログラムを作ってみました。
ソース
print("endを指定しない場合")
print("12345")
print("abcd")
print("ABCDEF")
print()
print("endを指定した場合")
print("12345", end='')
print("abcd")
print("ABCDEF")
9行目のprint()関数では、endに空文字を指定することで、改行しないようにしています。
以下が実行結果です。
結果
endを指定しない場合
12345
abcd
ABCDEF
endを指定した場合
12345abcd
ABCDEF
上記のように後半の「12345」の後は改行されていません。「print(“12345″, end=”)」の出力では、「12345」の最後に改行されないため、次の「abcd」が同じ行に出力されます。
仮引数: file
print()関数はfileで指定したテキストストリームに文字列を出力します。ここでテキストストリーム自体の説明はしません。具体例として標準出力があります。
仮引数fileにはデフォルト引数値にsys.stdoutが指定されています。「sys」はPython 標準ライブラリの一つです。「stdout」は標準出力です。そのため、実引数でfileを指定しない場合、print()関数は標準出力に文字列を出力します。
以下のようにサンプルプログラムを作ってみました。
ソース
import sys
print('123')
print('456')
print('abc', file=sys.stderr)
上記ではfileにsys.stderrを指定してみました。これは標準エラー出力を表します。
以下が出力結果です。
結果
abc
123
456
PyCharmの画面では標準エラー出力は赤字で出力されました。標準出力との順序は実行する度に違うようです。上記の「abc」は最後に画面に出力されることもありました。
仮引数: flush
仮引数flushにはデフォルト引数値Falseが設定されています。この値の場合、出力は改行されるまでバッファとしてため込まれるようです。
ただし、PyCharmのprint()関数の出力は改行させない場合でも、バッファはため込まれないようです。Anaconda Prompt (Miniconda3)では、改行させない場合はバッファをため込むようです。
以下のようにサンプルプログラムを作ってみました。
ソース
import time
print('a', end="")
time.sleep(1)
print('b', end="")
time.sleep(1)
print('c', end="")
time.sleep(1)
print('d', end="")
time.sleep(1)
print('e', end="")
print()
print(1, end="", flush=True)
time.sleep(1)
print(2, end="", flush=True)
time.sleep(1)
print(3, end="", flush=True)
time.sleep(1)
print(4, end="", flush=True)
time.sleep(1)
print(5, end="", flush=True)
上記のtime.sleep(1)は1秒待つ命令です。
Anaconda Prompt (Miniconda3)で実行させてみたところ、最初のaからeはバッファにため込まれて、一度に出力されました。また、1から5はflush=Trueという記述をしているため、それぞれ1秒ごとに出力されました。
print()関数の実引数で改行なしかつflushをTrueに指定するという方式は、進捗を表示したい場合に使うことがあるようです。
以上、参考になれば幸いです。