Pythonの文字列を拡張するf,r,b,uについて

Kai
LSC PSD
Published in
5 min readJun 16, 2020

pythonでは文字列の先頭にf, r, b,uを付けることが付けることが可能です。それぞれ別個の機能を持っており、大文字にしても同じ機能を持ちます。

はじめに(用語の確認)

リテラル:プログラム内に書かれた文字とか数字などの定数のことです。3とか、”hello”とか。

文字列リテラル:リテラルのうち、文字列を表すものです。”hello”や“I’m seventeen forever.”は文字列リテラルです。

f…フォーマット済み文字列リテラル(f-string)

python3.6で追加された新機能で、 .format() を使うことなく 文字列の中に変数を埋め込むことが出来ます。

before

name = 'King Kai'
like = 'driving'
print("My name is {0}. I like {1}.".format(name, like))
# My name is King Kai. I like driving.

after

name = 'King Kai'
like = 'driving'
print(f"My name is {name}. I like {like}.")
# My name is King Kai. I like driving.

簡単だし便利ですね。fというのはformatのfのことなのでした。ちなみに以下のように関数を呼ぶことも出来ます。

def add(a,b):
return a+b
x = 3
y = 5
print(f'When x = {x} and y = {y}, the sum is {add(x,y)}.')
# When x = 3 and y=5, the sum is 8.

r… raw string

pythonでは文字列で表せない文字(タブや改行、改ページなど)をバックスラッシュを付けた記号で記述します。これをエスケープシーケンスと言います。例えば以下の様に記述できます。

# \nは改行、\bはバックスペース、\"はダブルクォーテーションマークprint("hello!\nMy naz\bme is \"King Kai\".")# hello!
# My name is "King Kai"

通常はバックスラッシュがあった場合エスケープシーケンスが働きますが、raw stringを用いることでそれを無視することが出来ます。

print(r"hello!\nMy naa\bme is \"King Kai\".")# hello!\nMy naa\bme is \"King Kai\"

\を表示できるため、パスを入力するときなんかに使えます。

b…バイト列リテラル

str型ではなくバイト型のインスタンスを作成します。

greeting = b'hello'
print(greeting)
print(type(greeting))
# b'hello'
# <class 'bytes'>

接頭のbがバイト型を表すものです。外部からbyte列を渡されたりする場合に役に立つでしょう。ただしバイト列リテラルはASCII文字しか含むことが出来ません。日本語を扱いたい場合は素直にencodeしてください。

greeting = b'こんにちは'
→SyntaxError: bytes can only contain ASCII literal characters.
greeting = 'こんにちは'
print(greeting.encode('utf-8'))
# b'\xe3\x81\x93\xe3\x82\x93\xe3\x81\xab\xe3\x81\xa1\xe3\x81\xaf'
# (\x〇〇はascii文字であることを示す。〇〇は16進数

encode/decodeがある以上、 b’...‘に出番はあるのでしょうか…

u…Unicodeに変換する

python2.xではバイト列も文字列として使っていた都合上、標準の文字コードがASCIIであったため、日本語を扱いたい場合には文字列の先頭にuをつけ print(u'こんにちは') とする必要がありました。python3.xからはバイト列と文字列が分けられ、文字列はUnicodeとして扱われることになっため、先頭のuが使われることはなくなりました。python3.xでuを付けても何のエラーもなく動きますが、付けない場合と比べて何も変化はありません。

組み合わせる

上記の4文字は組み合わせることが可能です。例えばfとrだと以下の様になります。

def add(a,b):
return a+b
x = 3
y = 5
print(f'When x = {x} and y = {y}.\nThe sum is {add(x,y)}.')
# When x = 3 and y = 5.
# the sum is 8.
print(fr'When x = {x} and y = {y}.\nThe sum is {add(x,y)}.')
# When x = 3 and y = 5.\nthe sum is 8.

まとめ

fとrだけ使えればOK!

もしより詳しく知りたい方がいましたら、下記をご覧ください。

https://docs.python.org/ja/3/reference/lexical_analysis.html

--

--