ある程度 Python に慣れ、イロイロな方のコードを見ているのですが、Python 3.6 で使えるようになった f-string があまり使われていないようです。
他にも良い Pythonic な使い方があるにも関わらず、それさえも使われていないケースが多いように思います。
あまり認知されていないのかな?と思いまとめてみました!
ぜひ参考にしてみてください!
“+” で文をつなげる: Pythonic 度(★☆☆☆☆)
一番簡単でどの言語でも同様の方法で書けますが、一番 Pythonic ではない書き方ですね。
Javascript でよく見かける書き方でしたが、ES6 (ECMAScript 2015) でテンプレートリテラルが導入され、Javascript でさえこのような記述をしないようになっています。
短文だとあまり問題ないですが、長文であったり、たくさんの変数をつかう場合に「コードの可読性が落ちる」ので、あまり使わない方が良いでしょう。
使い方
このように書きます。
age = 30
print("I'm " + str(age) + " years old.")
言語を問わずよく見る書き方ですね。
こういうときに困る
既に上のサンプルでわかりますが、
- スペースを追加したテキストに意識的に追加しないと型変換や
- 型変換をしないとエラーになる
- 長文になると、どこがテキストでどこが変数かがわかりにくくなる。
慣れれば問題なく対応できますが、より直感的な書き方があるので(f-string)、そちらを使った方が良いでしょう。
“%” で挿入する場所を指定する: Pythonic 度(★★☆☆☆)
公式ページに明記されていますが、何かと問題があり、推奨されていない使い方です。
printf 形式の文字列書式化
ここで解説されているフォーマット操作には、(タプルや辞書を正しく表示するのに失敗するなどの) よくある多くの問題を引き起こす、様々な欠陥が出現します。
こちらに関しても、Python ではより直感的な書き方があるので(f-string)、そちらを使った方が良いでしょう。
使い方
このように書きます。
age = 30
print("I'm %s years old." % age)
“$s” で String で出力と指定しているので、
name = 'John'
age = 30
print("My name is %s and I'm %s years old." % (name, age))
とタプル形式でまとめることで可能です。
こういうときに困る
書いていくと分かりますが、
- パラメータが多くなって来ると、煩雑になる
- 複数の変数を使う場合、順番通りに記述しないといけない
とういうことで、可読性がかなり落ちます。
可読性が落ちるということは、エラーが起きやすく or エラーに気づきにくくなるので避けるべきですね。
“.format” で順番指定やリピートをさせる: Pythonic 度(★★★☆☆)
この書き方は Python 2.6 から使えるようになり、すごい使いやすくなりました。
【公式ページ】文字列の書式化操作
使い方
このように書きます。
name = 'John'
age = 30
print("My name is {} and I'm {} years old.".format(name, age))
すごい便利になりましたね。
print("My name is {0} and I'm {1} years old. YES, {1}!!".format(name, age))
このように順番を指定したり、同じ変数を何度も利用することもできます。
person = {'name': 'John', 'age': 30}
print("My name is {name} and I'm {age} years old.".format(**person))
というように、”**” を使い辞書型を渡すこともできます。
こういうときに困る
確かにこれまで説明してきた “+” や “%” を使った書き方よりかは便利です。
ですが、それでも文字列が長くなったると可読性がおります。
特に、変数名が長くなるとテキスト部分(“この中”)と変数部分(str.format(この中))で二重に書くため、可読性が落ちます。
もちろん、辞書型を使えば改善できるので利用するのは全く問題ないですが、Python バージョンの制限で利用できないという場合を除き、次に説明する f-string が一番便利ですので、そちらを使えるなら使った方が良いでしょう。
“f-string” を使う: Pythonic 度(★★★★★)
Python 3.6 から利用できるようになったできたてホヤホヤのめちゃめちゃ便利なものになります。
【公式ページ】 フォーマット済み文字列リテラル
使い方
このように書きます。
name = 'John'
age = 30
print(f"My name is {name} and I'm {age} years old.")
いかがでしょうか?
なかなか直感的になり、読みやすくなったと思いませんか?
これだけではなんとも。。。というそこのあなた!!
他にも便利なことができるんですよ!!
便利機能 1: 計算ができる
“{}” の中に計算式を直接かき、計算させることができます。
print(f’8 bit は、10 進数では {2**8} となる’)
これで無駄に計算結果を格納・表示するために変数を準備する必要がなくなりますね。
便利機能 1: 関数が実行できる
任意に作成した関数や標準関数が利用することができます。
import datetime
name = 'John'
print(f"My name is {name.upper()} and I'm {age} years old as of {datetime.date.today()}.")
もちろん、関数には引数を渡すこともできます。
まとめ
いくつもの方法がありますが、推奨されていないものもあったりしますので、ご利用には注意してください。
ただ、Python 3.6 以上であれば、無条件で f-string を使った方が良いでしょう。
Github などで昔の書き方をしている人もいるので、他の記述方法は「読める」程度で問題ないですね。