【初心者脱却シリーズ】アンダーバーの使い方まとめ【Python】

【初心者脱却シリーズ】アンダーバーの使い方まとめ【Python】

どうもこんにちはコウヘイです。

本シリーズは、Pythonについて完全初心者の私がpythonをある程度使えるようになるまで頑張るをテーマに日々の作業ログを記録する内容になります。


以下のような疑問を持ちました。


Pythonってソースコードを見た際にやたらとアンダーバーが目に入ってくるな。。メソッドとかアンダーバーがついているけど、どういう意味があるのだろう?


今回はPythonのアンダーバーの扱いについての作業ログと調べた内容をまとめたいと思います。

それでは本題。
今回は以下の内容になります。

著者情報

ちなみにですが、私は5年以上IT系エンジニアとして働いており、主にJavaを主戦場にしています。Webアプリケーションと業務系のアプリケーションの経験を持つごく普通のエンジニアです。

アンダーバーの使い方まとめ

Pythonにおけるアンダーバーが扱われる場合は以下があるみたいです。

  • 関数名につける(4通りあります)
  • 数値を見やすくする
  • 戻り値を無視
  • インタプリタで最後に表示された値を表す



順に説明します。

【使い方①】関数名につける(4通りあります)

関数名にアンダーバーをつける場合はさらに以下に分かれます。

  • 関数名の前に1つ
  • 関数名の後に1つ
  • 関数名の前に2つ
  • 関数名前後に1つ


すべてで意味が違います。順に見ていきましょう。

関数名の前に1つ

内部用の関数として定義する場合に関数名の前にアンダーバーを1つ付けます。

Javaでいうprivate関数みたいな感じですね。
※pythonにはprivate関数はないので注意

関数名の後に1つ

Pythonには他のプログラミング言語(Javaとか)と同様に予約語が用意されています。

その予約後や重要関数と同じ名前は使用できないので、被らないように関数名の後に1つアンダーバーをつけます。

これはイメージしやすいですよね。

ちなみに、予約後は以下になります。

>>>
>>> import keyword
>>> import pprint
>>> pprint.pprint(keyword.kwlist, compact=True)
['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break',
 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for',
 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not',
 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']
>>>


重要関数とは、importのいらないprint関数とかだと思います。

関数名の前に2つ

名前のマングリングを呼び出すみたいです。

うん、よくわからないです笑

おそらく普通の関数ではなくなるイメージだと思います。

外部からは通常の関数呼び出し方法ではなく、_クラス名__関数名で呼び出すみたいです。

関数名の前に1つアンダーバーをつける場合と同様に、内部で使用する関数だと思うことにします。

関数名前後に1つ

magic methodと呼ばれる関数になります。

よく見かける_init_や_call_、_iter_などのメソッドです。

自分では新しく定義しないほうがいいみたいです。

【使い方②】数値を見やすくする

よくゼロが何個も並ぶと見にくかったりしますよね。

そういった場合はアンダーバーを使用します。

ちなみにpython3.6以降で使えるようになったみたいです。

使用例は以下になります。

>>>
>>> 1000000
1000000
>>> 1_000_000
1000000
>>>

数値の最後にアンダーバーをつけるとエラーになります。

【使い方③】戻り値を無視

関数の戻り値を無視することができます。

無視された戻り値はメモリに残らないのでリソースを少なくできます。

例えば、以下のような感じです。

>>>
>>> x,_=(1,2)
>>> print(x)
1
>>>


こういうのって意外と大事ですよね。
Java開発時でもリソース管理の重要性を実感しているので意外と便利だなと思いました。

余談

話はずれますが、Pythonって戻り値が複数指定できるんですね。

しかも、カンマ区切りだけで返せるとか便利だと感じました。

Javaではできないので、違和感がありますがなるほどといった感じです。

【使い方④】インタプリタで最後に表示された値を表す

文字通りですが、インタプリタで最後に表示された値を表します。

具体例を見たほうがわかりやすいとおもいますので、以下に示します。

>>>
>>> 10
10
>>> _*3
30
>>>


bashで言う$?の標準出力版みたいなものだと思いました。
※bashの$?は前に実行したコマンドの結果をもつ変数です。

余談

インタプリタはPythonのコードを実行するために必要になるものですが、インタプリタにも色々あるみたいですね。

詳細は書きませんが、以下があるみたいです。

  • CPython:たぶんPython標準、C拡張モジュールとの互換性がある
  • PyPy:処理が高速
  • Jython:Javaのライブラリを使える
  • IronPython:.NETフレームワークライブラリ使える
  • PythonNet:よくわからない。。



以上、Pythonのアンダーバーについてでした。参考になれば幸いです。