目次記事
前の記事
文字列を表示する関数 print
関数
文字列オブジェクトの内容を表示するには、print
関数を使用します。実は少しだけ奥が深いこの print
関数を見ていきます。
print
関数の使い方
print
関数は引数に任意のオブジェクトをとります。print
関数の引数に入ったオブジェクト...を表現する文字列を標準出力に流すという役割を果たします。
>>> msg = "Hello, Python"
>>> print(msg)
Hello, Python
オブジェクト...を表現する文字列ってなんや! って感じだと思いますが、これについてはオブジェクトの学習の際に詳しくやります。
標準出力とは、基本的にはPCのディスプレイのことと思っておいてください。
print
関数の引数は、ほとんどの場合に文字列オブジェクトが入ります。「文字列オブジェクト」を表現する文字列は、文字列オブジェクトの中の要素を連結したものです。
ほかの場合も見ていきます。
>>> print(10) # 整数型オブジェクトの文字列表現は、その数値を文字列にしたもの
10
>>> print(2.5**1.8) # float 型オブジェクトの文字列表現は、その数値を文字列にしたもの
5.203457546261707
>>> print(None) # None 型オブジェクトの文字列表現は、"None"という文字列
None
>>> print(True) # 論理値型オブジェクトの文字列表現は、Trueなら"True"という文字列。Falseなら"False"という文字列
True
>>> print(range(3)) # range オブジェクトの文字列表現は、"range(x, y)" という文字列
range(0, 3)
>>> print([i for i in range(3)]) # リストの文字列表現は "[要素0, 要素1, ..., 要素n]" という文字列
[0, 1, 2]
>>> print({i for i in "Hello"})# 集合の文字列表現は "{要素0, 要素1, ..., 要素n}" という文字列
{'H', 'l', 'o', 'e'}
>>> print({i:j for i,j in zip(range(5), (*"HELLO",))}) # 辞書の文字列表現は "{K0:V0, K1:K2, ...} という文字列
{0: 'H', 1: 'E', 2: 'L', 3: 'L', 4: 'O'}
print
関数は複数の引数を受け取ることも可能です。
>>> print("Yes,", "I am.") # 二つの文字列オブジェクト"Yes,"と"I am."の表示
Yes, I am.
>>> print(*"ABC") # アンパックにより3つの文字列オブジェクト"A", "B", "C"の表示
A B C
>>> print(*[1, 2, 3]) # アンパックにより3つの整数オブジェクト1, 2, 3の文字列表現を表示
1 2 3
複数の引数を print
関数に与えた場合、半角スペース
区切りで文字列表現を並べます。
print
関数のオプション
print
関数はオプションを指定することが可能です(実際にはキーワード引数の指定でしかないですが、まぁそれはのちほど)。
print
関数のオプションは以下の通りです。
オプション | 説明 |
---|---|
sep |
区切り文字を指定します。デフォルトは半角スペースです。 |
end |
末尾の文字を指定します。デフォルトは改行コード \n です。 |
file |
書き込み先を指定します。 |
flush |
バッファにたまったデータを強制的に書き込ませます。 |
では、上記のオプションのうち sep
, end
を試してみます。
>>> print("Hello,", "Python.", "がんばろう!") # まずは普通に表示
Hello, Python. がんばろう!
>>> print("Hello,", "Python.", "がんばろう!", sep=" / ") # 区切り文字を" / "に変更
Hello, / Python. / がんばろう!
>>> print("Hello,", "Python.", "がんばろう!", end="^^") # 最後の文字を"^^"に変更。改行されないので表示はバグる
>>> o, Python. がんばろう!^^
ここでオプションと言っていたのはすべてキーワード引数と呼ばれるものです。辞書型オブジェクトは **
をつけることでキーワード引数のアンパックとして解釈されます。これを利用すると次のようにしてキーワード引数を指定することが可能です。
>>> print_op = {"sep":" / ", "end":"改行しとく\n"} # オプション名をキーに持つ辞書の作成
>>> print("Hello,", "Python.", "がんばろう!", **print_op) # print関数の中でアンパック
Hello, / Python. / がんばろう!改行しとく
詳しくはあとでやりますが、ここでも目に入れといて損はないでしょう。
文字列オブジェクト
Python の文字列オブジェクトは、Unicode のイミュータブル(変更不可能)なシーケンスです。(Python3系での話)
文字列オブジェクトはシングルクォーテーションかダブルクォーテーションで囲うと作成できます。
>>> strs = "Hello" # 変数 strs に文字列オブジェクト "Hello" を参照させた
>>> print(strs)
Hello
>>> strs = ("https://" # 長い文字列は ( で初めて
... "qiita.com/") # 改行することができます
>>> print(strs)
https://qiita.com/
print
関数によって文字列オブジェクトの文字列表現(参照する文字列の中身)を表示できます。その時、文字列の中にエスケープシーケンスと呼ばれる特殊な文字があると、表示する文字列の制御を行うことが可能です。
【エスケープシーケンス一覧】
エスケープシーケンス | 役割 |
---|---|
\n |
改行 |
\" |
文字列内でダブルクォーテーションを表示 |
\' |
文字列内でシングルクォーテーションを表示 |
\t |
タブ文字の挿入 |
\\ |
文字列内でバックスラッシュを表示 |
\r |
キャリッジリターン。文字を表示するカーソルを先頭にする |
\b |
バックスペース。一文字削除 |
いくつか使用してみます。
>>> msg = ("To. maomao.nekoneko@shamoo.go.jp\n" # \nで改行
... "From. meow-meow@shamoo.go.jp\n"
... "\tDear Ms. Maomao\n\n" # \tでタブ文字。\nを二回で改行二回。
... "\tHi! How are you? :)\n"
... "\tDo you remember when I said,\n"
... "\t\"Let's go to Starbucks\"?\n" # \"でダブルクォーテーション表示
... "\tIf you\'re free today, I\'d like to go!\n" # \'でシングルクォーテーション表示
... "\tBest regards,\n\n"
... "MeowMeow Meow")
>>> print(msg) # 結果を確認 ↓
To. maomao.nekoneko@shamoo.go.jp
From. meow-meow@shamoo.go.jp
Dear Ms. Maomao
Hi! How are you? :)
Do you remember when I said,
"Let's go to Starbucks"?
If you're free today, I'd like to go!
Best regards,
MeowMeow Meow
なんかいい感じで文字を出すことができました。他のエスケープシーケンスについては、出てきたらその都度あらためて説明することにします。
文字列オブジェクトを生成する様々な方法
文字列オブジェクトの生成方法はいろいろあります。ここでいくつか確認しておきます。
ヒアドキュメント
大きめの文章を書くのに毎度改行コード \n
を書くのは不便ですね。そこで便利なのはヒアドキュメントというものです。
ヒアドキュメントは """
で初めて、"""
で終わらせることで作成することができる文字列型オブジェクトです。ヒアドキュメント内の改行は、自動で改行コードがつくという特徴があります。
>>> msg = """\t⠀ /\\____/\\
... \t=(,,> ヮ<,,)=
... \t / ◠ ◠ \\ノ"""
>>> print(msg) # ヒアドキュメント内でエスケープシーケンスを使用することもできます。
⠀ /\____/\
=(,,> ヮ<,,)=
/ ◠ ◠ \ノ
r文字列
逆にエスケープシーケンスを認識させたくない場合にはr文字列(raw文字列)を使用します。
r文字列と呼ばれる文字列オブジェクトの生成には r" "
と書きます。
>>> msg = r"AAA\nBBB"
>>> print(msg) # エスケープシーケンスがただの文字として認識される!
AAA\nBBB
f文字列
変数の中身を表示したいときに便利なのがf文字列です。生成には f" "
と書きます。(Python3.6以降で使えます)
>>> import math
>>> a = 2.0
>>> msg = f"{a}の平方根は{math.sqrt(a)}です"
>>> print(msg)
2.0の平方根は1.4142135623730951です
f文字列にはデバッグ用f文字列というものがあります。生成には f"{変数名 = }"
と書きます。
>>> a, b = 10, 23 # 変数a,bにタプル(10, 23)をアンパック代入
>>> print(f"a + b = {a + b}") # f文字列で表示
a + b = 33
>>> print(f"{a + b = }") # 「変数名 = 値」という表示はデバッグ用f文字列が良き
a + b = 33
ほかにもある!値の埋め込み
f文字列で文字列の中に値を埋め込むことができます。他にもあるので確認しておきましょう。
テンプレート文字列
詳しくはこちら。
文字列オブジェクトに substitute
関数を適用することで文字列内に値の埋め込みを行います。
>>> from string import Template
>>> msg = "a = $a, b = $b"
>>> t = Template(msg)
>>> print(t.substitute(a=10, b="bbb"))
a = 10, b = bbb
printf
形式
詳しくはこちら。
C言語に慣れてる人は非常に使いやすい埋め込み方式です。%
で指定した箇所に値の埋め込みを行います。ただ、公式に次の注釈がつけられてます。
注釈 ここで解説されているフォーマット操作には、(タプルや辞書を正しく表示するのに失敗するなどの) よくある多くの問題を引き起こす、様々な欠陥が出現します。
まぁ、あんま使わないほうがよさそう。
>>> members = [{"id":1, "name":"山田太郎"}, {"id":13, "name":"Jhon"}, {"id":1991, "name":"小田山がぎぐげご"}]
>>> print("今回のプロジェクトの参加メンバー\n",
... "id:%(id)5d 名前:%(name)s\n" % members[0],
... "id:%(id)5d 名前:%(name)s\n" % members[1],
... "id:%(id)5d 名前:%(name)s\n" % members[2])
今回のプロジェクトの参加メンバー
id: 1 名前:山田太郎
id: 13 名前:Jhon
id: 1991 名前:小田山がぎぐげご
ほかにもformat関数を使ったやり方とかあります。が、ここでは省略します。