Pythonの基本的な入力、出力、および文字列の書式設定

Pythonの基本的な入力、出力、および文字列の書式設定

有用であるために、プログラムは通常、ユーザーから入力データを取得し、結果データをユーザーに表示することにより、外部と通信する必要があります。 このチュートリアルでは、Pythonの入出力について紹介します。

入力は、キーボードを介してユーザーから直接送られるか、ファイルやデータベースなどの外部ソースから送られます。 出力は、コンソールまたはIDEに直接表示するか、グラフィカルユーザーインターフェイス(GUI)を介して画面に表示するか、外部ソースに再度表示できます。

この入門シリーズのprevious tutorialでは、次のことを行います。

  • プログラミング言語が明確な反復を実装するために使用するいくつかの異なるパラダイムの比較を見た

  • Pythonでの明確な反復の基礎を形成する2つの概念であるイテラブルとイテレータについて学びました

  • Pythonのforループについて学ぶためにすべてを結び付けた

このチュートリアルを終了すると、次の方法がわかります。

  • 組み込み関数input()を使用してキーボードからユーザー入力を取得します

  • 組み込み関数print()を使用してコンソールに出力を表示します

  • string modulo operatorで文字列データをフォーマットする

苦労することなく、飛び込みましょう!

Free Bonus:Click here to get a Python Cheat Sheetを使用して、データ型、辞書、リスト、Python関数の操作などのPython3の基本を学びます。

キーボードからの入力の読み取り

プログラムは、通常、キーボードからの入力によって、ユーザーからデータを取得する必要があります。 Pythonでこれを実現する最も簡単な方法は、input()を使用することです。

input([])

キーボードから入力行を読み取ります。

input()はプログラムの実行を一時停止して、ユーザーがキーボードからの入力行を入力できるようにします。 ユーザーが[.kbd .key-enter]#Enter#キーを押すと、入力されたすべての文字が読み取られ、文字列として返されます。

>>>

>>> s = input()
foo bar baz
>>> s
'foo bar baz'

ユーザーが[.kbd .key-enter]#Enter#キーを押したときに生成される改行は、戻り文字列の一部として含まれないことに注意してください。

オプションの<prompt>引数を含めると、input()は、入力の読み取りを一時停止する前に、それをユーザーへのプロンプトとして表示します。

>>>

>>> name = input('What is your name? ')
What is your name? Winston Smith
>>> name
'Winston Smith'

input()は常に文字列を返します。 数値型が必要な場合は、int()float()、またはcomplex()の組み込み関数を使用して文字列を適切な型に変換する必要があります。

>>>

 1 >>> n = input('Enter a number: ')
 2 Enter a number: 50
 3 >>> print(n + 100)
 4 Traceback (most recent call last):
 5   File "", line 1, in 
 6 TypeError: must be str, not int
 7
 8 >>> n = int(input('Enter a number: '))
 9 Enter a number: 50
10 >>> print(n + 100)
11 150

上記の例では、nは文字列であり、100は整数であるため、3行目の式n + 100は無効です。 8行目はnを整数に変換するため、10行目のprint()ステートメントは成功します。

Python Version Note: Python 2.xコードを使用していることに気付いた場合、Pythonバージョン2と3の間で入力関数にわずかな違いが生じる可能性があります。

Python 2のraw_input()は、キーボードからの入力を読み取り、それを返します。 Python 2のraw_input()は、上記のようにPython 3のinput()と同じように動作します。

ただし、Python 2にはinput()という関数もあります。 Python 2では、input()はキーボードからの入力parses and evaluates it as a Python expressionを読み取り、結果の値を返します。

Python 3は、Python 2のinput()とまったく同じように機能する単一の関数を提供していません。 この効果は、Python 3で式eval(input())を使用して模倣できます。 ただし、ユーザーが任意の潜在的に悪意のあるコードを実行できるため、これはセキュリティリスクと見なされます。

eval()の詳細については、Python documentationを参照してください。潜在的なセキュリティリスクの説明については、Wikipedia eval pageを参照してください。

コンソールへの出力の書き込み

ユーザーからデータを取得することに加えて、プログラムは通常、ユーザーにデータを提示する必要があります。 print()を使用して、Pythonのコンソールにプログラムデータを表示できます。

未フォーマットのコンソール出力

オブジェクトをコンソールに表示するには、オブジェクトをコンマ区切りの引数リストとしてprint()に渡します。

print(, ..., )

<obj>の文字列表現をコンソールに表示します。

デフォルトでは、print()は各オブジェクトを単一のスペースで区切り、出力の最後に改行を追加します。

>>>

>>> fname = 'Winston'
>>> lname = 'Smith'

>>> print('Name:', fname, lname)
Name: Winston Smith

print()の引数として、任意のタイプのオブジェクトを指定できます。 オブジェクトが文字列でない場合、print()はそれを適切な文字列表現に変換して表示します。

>>>

>>> a = [1, 2, 3]
>>> type(a)


>>> b = -12
>>> type(b)


>>> d = {'foo': 1, 'bar': 2}
>>> type(d)


>>> type(len)


>>> print(a, b, d, len)
[1, 2, 3] -12 {'foo': 1, 'bar': 2} 

ご覧のとおり、リスト、辞書、関数などの複雑なタイプでも、print()を使用してコンソールに表示できます。

print()へのキーワード引数

print()は、出力の形式を適度に制御するいくつかの追加の引数を取ります。 これらはそれぞれ、keyword argumentと呼ばれる特別なタイプの引数です。 この入門シリーズのチュートリアルには、関数とパラメーターの受け渡しに関するチュートリアルが含まれているため、キーワード引数について詳しく知ることができます。

今のところ、次のことを知っておく必要があります。

  • キーワード引数の形式は<keyword>=<value>です。

  • print()に渡されるキーワード引数は、表示するオブジェクトのリストの後の最後に来る必要があります。

次のセクションでは、これらのキーワード引数がprint()によって生成されるコンソール出力にどのように影響するかを確認します。

sep=キーワード引数

キーワード引数sep=<str>を追加すると、オブジェクトはデフォルトの単一スペースではなく文字列<str>で区切られます。

>>>

>>> print('foo', 42, 'bar')
foo 42 bar

>>> print('foo', 42, 'bar', sep='/')
foo/42/bar

>>> print('foo', 42, 'bar', sep='...')
foo...42...bar

>>> d = {'foo': 1, 'bar': 2, 'baz': 3}
>>> for k, v in d.items():
...     print(k, v, sep=' -> ')
...
foo -> 1
bar -> 2
baz -> 3

オブジェクト間にスペースを入れずにオブジェクトを押しつぶすには、sep=''を指定します。

>>>

>>> print('foo', 42, 'bar', sep='')
foo42bar

sep=キーワードを使用して、区切り文字として任意の文字列を指定できます。

end=キーワード引数

キーワード引数end=<str>を使用すると、出力はデフォルトの改行ではなく<str>で終了します。

>>>

>>> if True:
...     print('foo', end='/')
...     print(42, end='/')
...     print('bar')
...
foo/42/bar

たとえば、ループで値を表示している場合、end=を使用して、値を個々の行ではなく1行に表示することができます。

>>>

>>> for n in range(10):
...     print(n)
...
0
1
2
3
4
5
6
7
8
9

>>> for n in range(10):
...     print(n, end=(' ' if n < 9 else '\n'))
...
0 1 2 3 4 5 6 7 8 9

end=キーワードを使用して、出力ターミネータとして任意の文字列を指定できます。

出力ストリームのキーワード引数

print()は、2つの追加のキーワード引数を受け入れます。どちらも、出力ストリームの処理に影響します。

  1. file=<stream>:デフォルトでは、print()はその出力をsys.stdoutと呼ばれるデフォルトストリームに送信します。これは通常、コンソールと同等です。 file=<stream>引数を指定すると、代わりに<stream>で指定された代替ストリームに出力が送信されます。

  2. flush=True:通常、print()はその出力をバッファリングし、出力ストリームに断続的に書き込むだけです。 flush=Trueは、出力ストリームが各print()で強制的にフラッシュされることを指定します。

これら2つのキーワード引数は、完全を期すためにここに示されています。 この時点で、出力ストリームについてあまり気にする必要はないでしょう。 これらについては、このシリーズのファイルI / Oに関するチュートリアルで後ほど説明します。

フォーマットされた文字列出力

print()は、せいぜい初歩的なコンソール出力のフォーマットをサポートします。 印刷されたオブジェクトを分離する方法を選択でき、印刷された行の最後に何を配置するかを指定できます。 それについてです。

多くの場合、表示するデータの外観をより正確に制御する必要があります。 Pythonは、出力文字列データをフォーマットするいくつかの方法を提供します。 このセクションでは、古いものの1つであるstring modulo operatorについて学習します。

Pythonの最近のバージョンでは、文字列モジュロ演算子よりも間違いなく優れている文字列データをフォーマットする新しい方法があります:string .format() methodおよびf-strings。 これらについては、このシリーズの次のチュートリアルで学習します。 これらの記事もご覧ください。

他のフォーマットオプションも使用できますが、文字列モジュロ演算子はまだ広く使用されています。 既存のPythonコードを読んでいる場合は、文字列モジュロ演算子に遭遇する可能性が高いので、慣れるのが有益です。

Note: C、Perl、またはJavaのprintf()ファミリーの関数に精通している場合は、これらがPythonに存在しないことがわかります。 ただし、printf()と文字列のモジュロ演算子の間にはかなりの類似性があるため、printf()に精通している場合は、次の多くのことを精通していると感じます。

一方、printf()に慣れていない場合でも、心配する必要はありません。 以下はまだ理にかなっているはずです。

文字列モジュロ演算子

modulo operator%)は通常、数値とともに使用されます。この場合、除算から余りを計算します。

>>>

>>> 11 % 3
2

文字列オペランドを使用する場合、モジュロ演算子の機能はまったく異なります:文字列の書式設定。 (2つの操作は、互いにあまり似ていません。 それらは同じ記号で表されるため、同じ名前を共有します:%。)

文字列モジュロ演算子の構文は次のとおりです。

 % 

%演算子の左側にある<format_string>は、1つ以上の変換指定子を含む文字列です。 右側の<values>は、変換指定子の代わりに<format_string>に挿入されます。 結果のフォーマットされた文字列は、式の値です。

例を始めましょう。 次に、文字列モジュロ演算子を使用してフォーマットされた文字列を表示するprint()ステートメントを示します。

>>>

>>> print('%d %s cost $%.2f' % (6, 'bananas', 1.74))
6 bananas cost $1.74

文字列のモジュロ演算自体を表すことに加えて、'%'文字は、フォーマット文字列(この場合は'%d''%s'、および'%.2f')の変換指定子も示します。

出力では、値のタプルからの各アイテムが文字列値に変換され、対応する変換指定子の代わりにフォーマット文字列に挿入されます。

  • タプルの最初の項目は6です。これは、フォーマット文字列の'%d'を置き換える数値です。

  • 次の項目は文字列値'bananas'で、これは'%s'を置き換えます。

  • 最後の項目はfloat値1.74で、これは'%.2f'を置き換えます。

次の図に示すように、結果の文字列は6 bananas cost $1.74です。

挿入する値が複数ある場合は、上記のようにそれらをタプルで囲む必要があります。 値が1つしかない場合は、それだけで表示されます。

>>>

>>> print('Hello, my name is %s.' % 'Graham')
Hello, my name is Graham.

また、文字列のモジュロ演算は印刷専用ではありません。 値をフォーマットして、別の文字列変数に割り当てることもできます。

>>>

>>> s = 'Hello, my name is %s.' % 'Graham'
>>> s
'Hello, my name is Graham.'

(繰り返しますが、printf()に関連する関数に精通している場合、これはsprintf()を彷彿とさせます。 そうでない場合は、汗をかかないでください。)

変換指定子

変換指定子は<format_string>に表示され、値が挿入されたときにどのようにフォーマットされるかを決定します。

変換指定子は%文字で始まり、次のコンポーネントで構成されます。

%[][][.]

%<type>が必要です。 角括弧で示される残りのコンポーネントはオプションです。

次の表は、変換指定子の各コンポーネントの機能をまとめたものです。

成分 意味

%

変換指定子を導入します

書式設定をより細かく制御する1つ以上のフラグを示します

フォーマットされた結果の最小幅を指定します

.

浮動小数点または文字列出力の長さと精度を決定します

実行する変換のタイプを示します

これらがどのように機能するかについての詳細を読んでください。

変換タイプ

変換タイプ<type>は、変換指定子の最後のコンポーネントです。

%[][][.]

対応する値がフォーマット文字列に挿入される前に受ける変換のタイプを決定します。 可能な変換タイプをリストする表は次のとおりです。

変換タイプ

diu

10進整数

xX

16進整数

o

8進整数

fF

浮動小数点

eE

指数関数

gG

浮動小数点または指数

c

単一の文字

sra

ひも

%

単一の'%'文字

これらのコンバージョンタイプの使用方法については、次のセクションで説明します。

整数変換タイプ

diuxX、およびo変換タイプは整数値に対応します。

di、およびuは機能的に同等です。 これらはすべて、対応する引数を10進整数の文字列表現に変換します。

>>>

>>> '%d, %i, %u' % (42, 42, 42)
'42, 42, 42'

>>> '%d, %i, %u' % (-42, -42, -42)
'-42, -42, -42'

値は正または負のいずれかです。 負の場合、結果の値は'-'文字で始まります。

xおよびXは、16進整数値の文字列表現に変換され、oは、8進整数値の文字列表現に変換されます。

>>>

>>> '%x, %X' % (252, 252)
'fc, FC'
>>> '%o' % 16
'20'

xは小文字の出力を生成し、Xは大文字を生成します。 (大文字の'O'は有効な変換タイプではありません。)

conversion flagsを使用すると、結果のフォーマットをさらに制御できます。これについては、次のセクションで詳しく説明します。

浮動小数点変換タイプ

変換タイプfおよびFは浮動小数点数の文字列表現に変換し、eおよびEは指数(科学的)表記を表す文字列を生成します。

>>>

>>> '%f, %F' % (3.14159, 3.14)
'3.141590, 3.140000'
>>> '%e, %E' % (1000.0, 1000.0)
'1.000000e+03, 1.000000E+03'

eは小文字の出力を生成し、Eは大文字を生成します。

=====詳細:infおよびNaN

状況によっては、浮動小数点演算の結果、値が本質的に無限になる可能性があります。 Pythonでのこのような数値の文字列表現は、'inf'です。

また、浮動小数点演算によって数値として表現できない値が生成される場合があります。 Pythonは、これを文字列'NaN'で表します。

これらの値が文字列モジュロ演算子で変換されると、変換タイプの文字が結果の出力の大文字小文字を制御します。 feは小文字の出力を生成し、FEは大文字を生成します。

>>>

>>> x = float('NaN')
>>> '%f, %e, %F, %E' % (x, x, x, x)
'nan, nan, NAN, NAN'
>>> y = float('Inf')
>>> '%f, %e, %F, %E' % (y, y, y, y)
'inf, inf, INF, INF'

これは、fFの変換タイプの唯一の違いです。

gおよびG変換タイプは、指数の大きさと.<precision>に指定された値に応じて、浮動小数点または指数出力のいずれかを選択します。 (以下を参照してください。)指数が-4未満または.<precision>以上の場合、出力はe /Eと同じです。 それ以外は、f /Fと同じです。

>>>

>>> '%g' % 3.14
'3.14'

>>> '%g' % 0.00000003
'3e-08'
>>> '%G' % 0.00000003
'3E-08'

基本的に、これらの変換タイプは「合理的な」選択を行うものと考えることができます。 問題の値が適切な場合は浮動小数点出力を生成し、それ以外の場合は指数形式を生成します。

他の浮動小数点変換タイプと同様に、gは小文字の出力を生成し、Gは大文字を生成します。

文字変換タイプ

cは単一の文字を挿入します。 対応する値は、整数または1文字の文字列です。

>>>

>>> '%c' % 97
'a'

>>> '[%c]' % 'y'
'[y]'

c変換タイプは、Unicode文字への変換もサポートします。

>>>

>>> '%c' % 8721
'∑'

sr、およびaは、それぞれ組み込み関数str()repr()、およびascii()を使用して文字列出力を生成します。

>>>

>>> '%s' % 'foo'
'foo'
>>> '%r' % 'foo'
"'foo'"
>>> '%a' % 'foo'
"'foo'"

文字列出力の位置揃えとパディングは、後で説明するように、<width>および.<precision>指定子を使用して制御できます。

'%'文字の挿入

リテラルの'%'文字を出力に挿入するには、フォーマット文字列に2つの連続する%文字を指定します。 1つ目は(通常どおり)変換指定子を導入し、2つ目は変換タイプが%であることを指定します。これにより、出力に単一の'%'文字が生成されます。

この例では、%d%%は、10進整数変換タイプとそれに続くリテラル'%'文字を意味します。

>>>

>>> 'Get %d%% off on %s today only!' % (30, 'bananas')
'Get 30% off on bananas today only!'

%変換タイプは、文字列モジュロ演算子の右側にある<values>を消費しないことに注意してください。

幅と精度の指定子

<width>.<precision>は、変換指定子の中央にあります。

%[][][.]

フォーマットされた値が占める水平スペースの量を決定します。

<width>指定子

<width>は、出力フィールドの最小幅を指定します。 出力が<width>より短い場合、デフォルトでは、<width>文字幅のフィールドで右寄せされ、左側にASCIIスペース文字が埋め込まれます。

>>>

>>> '%5s' % 'foo'
'  foo'

>>> '%3d' % 4
'  4'

(ジャスティフィケーションおよびパディング文字は変更できます。 以下のconversion flagsを参照してください。)

出力長が<width>より大きい場合、<width>は効果がありません。

>>>

>>> '%2d' % 1234, '%d' % 1234
('1234', '1234')
>>> '%2s' % 'foobar', '%s' % 'foobar'
('foobar', 'foobar')

これらの各例では、フィールド幅を2と指定しています。 ただし、フォーマットする値は3文字以上であるため、<width>を指定しない場合と同じ結果になります。

.<precision>指定子

.<precision>は、浮動小数点、指数、および文字列の変換タイプに影響します。

fFe、およびEタイプの場合、.<precision>は小数点以下の桁数を決定します。

>>>

>>> '%.2f' % 123.456789
'123.46'

>>> '%.2e' % 123.456789
'1.23e+02'

gおよびGタイプの場合、.<precision>は、小数点の前後の有効桁の総数を決定します。

>>>

>>> '%.2g' % 123.456789
'1.2e+02'

sr、およびaタイプでフォーマットされた文字列値は、.<precision>で指定された長さに切り捨てられます。

>>>

>>> '%.4s' % 'foobar'
'foob'

<width>.<precision>が一緒に使用されているのを見るのは非常に一般的です。

>>>

>>> '%8.2f' % 123.45678
'  123.46'

>>> '%8.3s' % 'foobar'
'     foo'

<width>または.<precision>のいずれかをアスタリスク文字(*)として指定できます。この場合、使用される値は<values>タプルの次の項目から取得されます。 :

>>>

>>> '%*d' % (5, 123)
'  123'

<width>の値が定数として指定されている場合、これはあまり必要ありません。 上記の例とこれとの間に機能的な違いはありません。

>>>

>>> '%5d' % 123
'  123'

ただし、変数で<width>.<precision>を指定することもできます。

>>>

>>> for i in range(3):
...     w = int(input('Enter width: '))
...     print('[%*s]' % (w, 'foo'))
...
Enter width: 2
[foo]
Enter width: 4
[ foo]
Enter width: 8
[     foo]

これにより、実行時に幅または精度を決定することができ、実行ごとに幅が変わる可能性があります。

変換フラグ

オプションの変換<flags>は、最初の%文字の直後に指定されます。

%[][][.]

これらにより、特定の変換タイプの表示をより細かく制御できます。 <flags>には、次の表に示す任意の文字を含めることができます。

キャラクター コントロール

#

整数値と浮動小数点値の基数または小数点の表示

0

指定されたフィールド幅より短い値のパディング

-

指定されたフィールド幅よりも短い値の正当化

+
' '(スペース)

数値の先頭記号の表示

以下のセクションでは、変換フラグがどのように機能するかについて詳しく説明します。

#フラグ

8進数および16進数の変換タイプの場合、#フラグにより​​、フォーマットされた出力に基本情報が含まれます。 o変換タイプの場合、このフラグは先頭の'0o'を追加します。 xおよびX変換タイプの場合、先頭の'0x'または'0X'が追加されます。

>>>

>>> '%#o' % 16
'0o20'

>>> '%#x' % 16, '%#X' % 16
('0x10', '0X10')

#フラグは、10進変換タイプdi、およびuでは無視されます。

浮動小数点値の場合、#フラグは、出力に常に小数点を含めるように強制します。 通常、浮動小数点値の後に小数点がない場合、浮動小数点値には小数点が含まれません。 このフラグは小数点を強制的に含めます:

>>>

>>> '%.0f' % 123
'123'
>>> '%#.0f' % 123
'123.'

>>> '%.0e' % 123
'1e+02'
>>> '%#.0e' % 123
'1.e+02'

これは、示されているように、指数表記で表示される値に対しても機能します。

0フラグ

書式設定された数値が指定されたフィールド幅より短い場合、デフォルトの動作では、フィールドにASCIIスペース文字が埋め込まれます。 0フラグは、代わりに'0'文字でパディングします。

>>>

>>> '%05d' % 123
'00123'

>>> '%08.2f' % 1.2
'00001.20'

0フラグは、すべての数値変換タイプ(diuxXo)で使用できます。 )s、fFeEg、およびG

-フラグ

フォーマットされた値が指定されたフィールド幅より短い場合、通常はフィールド内で右寄せされます。 -フラグを使用すると、代わりに、指定されたフィールドで値が左寄せされます。

>>>

>>> '%-5d' % 123
'123  '

>>> '%-8.2f' % 123.3
'123.30  '

>>> '%-*s' % (10, 'foo')
'foo       '

-フラグは、文字列変換タイプsar、およびすべての数値変換タイプで使用できます。 数値タイプの場合、0-の両方が存在する場合、0は無視されます。

+および' 'フラグ

デフォルトでは、正の数値には先行符号文字がありません。 +フラグは、数値出力の左側に'+'文字を追加します。

>>>

>>> '%+d' % 3
'+3'
>>> '%+5d' % 3
'   +3'

' '(スペース文字)フラグを使用すると、正の数値の前にスペース文字が付きます。

>>>

>>> '% d' % 3
' 3'

これらのフラグは、常に先頭に'-'文字が含まれる負の数値には影響しません。

辞書マッピングによる値の指定

フォーマット文字列に挿入された<values>は、タプルではなくディクショナリとして指定できます。 その場合、各変換指定子には、'%'文字の直後の括弧内に辞書キーの1つが含まれている必要があります。

例を示しましょう。

>>>

>>> '%d %s cost $%.2f' % (6, 'bananas', 1.74)
'6 bananas cost $1.74'

>>> d = {'quantity': 6, 'item': 'bananas', 'price': 1.74}
>>> '%(quantity)d %(item)s cost $%(price).2f' % d
'6 bananas cost $1.74'

この手法を使用すると、挿入された値を任意の順序で指定できます。

>>>

>>> d = {'quantity': 6, 'item': 'bananas', 'price': 1.74}

>>> '%(quantity)d %(item)s cost $%(price).2f' % d
'6 bananas cost $1.74'

>>> 'It will cost you $%(price).2f for %(item)s, if you buy %(quantity)d' % d
'It will cost you $1.74 for bananas, if you buy 6'

上記のすべての変換指定子項目(<flags><width>.<precision>、および<type>)は、引き続き同じ意味を持ちます。

>>>

>>> 'Quantity: %(quantity)03d' % d
'Quantity: 006'

>>> 'Item:     %(item).5s' % d
'Item:     banan'

Note:ディクショナリマッピングによって<values>を指定する場合、*を使用して<width>または.<precision>を指定することはできません。

Pythonの入出力:結論

このチュートリアルでは、Pythonの入力と出力、およびPythonプログラムがユーザーと通信する方法について学習しました。 これで、input()を使用してユーザーからデータを取得し、print()を使用して結果をコンソールに表示できるようになります。

また、string modulo operatorでフォーマットすることにより、ユーザーに表示されるデータをより見やすくする方法も学びました。

文字列のモジュロ演算子と同じように用途が広いPythonは、文字列データをフォーマットするための2つの新しい方法、string .format() methodformatted string literalを提供します。 次のチュートリアルに進んで、それらについて学んでください!