🍣

Pythonの便利な小ネタ

2022/03/21に公開

まえがき

プログラミング言語というものは一度覚えて使いこなし始めると、自分の記述パターンが確立してきます。その結果、存在を知らないままの便利な記法が生じます。新たな記法に出会う最良の方法は人の書いたコードを読むことです。そのようにして知った便利な記法を、思いつくままにいくつか紹介します。Pythonのバージョンによっては対応していないものもありますのでご注意ください。

enumerateの第二引数で開始番号を指定できる

通常0から番号が振られるところを任意の番号で始められる。

data = ["a", "b", "c"]
for i, x in enumerate(data, 2):
    print(i, x)

出力

2 a
3 b
4 c

デフォルト値のスマートな与え方

x = value or default_valueという構文で、valueがNoneや0の場合はxにdefault_valueが代入される。

a = None
b = 10
x = a or 1
y = b or 1
print(x)
print(y)

出力

1
10

listにcountというメソッドがある

値の出現回数をカウントできる。

data = ["a", "b", "a", "c", "c"]
print(data.count("a"))

出力

2

長い数値を区切って表記する

数字リテラルに_を混ぜて記述することができます。なお、必ずしも3桁で区切る必要はありません。単に_は無視されます。

num1 = 100_000
num2 = 1_000_000

どこでも代入式

Walrusオペレータと呼ばれる記法です。Walrusとはセイウチの意味で、:=がセイウチの顔に似ていることが由来のようです。
例を示したほうがわかりやすいです。

dataをdictオブジェクトだとします。dataがキー'a'を持っていたらその値を表示するというコードです。従来はこのように書くことでしょう。

value = data.get("a")
if value:
    print(value)

Walrusオペレータを用いるとこのようにシンプルに書くことができます。

if value := data.get("a"):
    print(value)

PythonはC言語と違ってどこでも代入式=が書けるわけではないのですが、:=ならばどこでも代入できます。
ただし、=は右辺を評価した結果を左辺の変数に代入するものですが、:=は右辺に別名(エイリアス)を付けるイメージです。
上記の例では、if条件の判定のためにdata.get("a")が評価された後、print(value)valuedata.get("a")に展開されて再度評価されます。
そのため、右辺が重い処理だと:=を多用するのは避けたほうがいいでしょう。

Discussion