yiskw note

機械学習やプログラミングについて気まぐれで書きます

【Python】アンダースコア(_)の使い方


Pythonにおけるアンダースコア(_)の使い方について調べたので,こちらにメモを残しておきます.
主な使い方は以下の通りです.

  1. Jupyter Notebookやインタラクティブシェルで,最後に表示された値として使用する
  2. 不要な変数や返り値をアンダースコア(_)に割り当てる
  3. 変数や関数,メソッドの命名で使用する
    1. アンダースコア(_)で終わる名前
    2. アンダースコア(_)で始まる名前
    3. dunder(__; double underscore)で始まる名前
    4. dunder(__; double underscore)に挟まれた名前
  4. 桁の多い数字を見やすくする

一つ一つ解説していきたいと思います.

Jupyter Notebookやインタラクティブシェルで,最後に表示された値として使用する

Jupyter Notebookやインタラクティブシェルで最後に表示したものを参照することができます.

 python
Python 3.9.1 (default, Jun 20 2021, 10:59:30) 
[Clang 12.0.5 (clang-1205.0.22.9)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> a = 1
>>> a
1
>>> _
1

注意点としてはprintで表示させたものではなく,変数のみを実行したときの結果に対して使用できます.

 python
Python 3.9.1 (default, Jun 20 2021, 10:59:30) 
[Clang 12.0.5 (clang-1205.0.22.9)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> print("hoge")
hoge
>>> _
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name '_' is not defined
>>> a = "hoge"
>>> a
'hoge'
>>> _
'hoge'

不要な変数や返り値をアンダースコア(_)に割り当てる

不要な変数や関数の返り値をアンダースコア(_)に割り当てることができます.

for _ in range(10):
    print("Hello")

詳しい内容については,こちらも参照してみてください.

yiskw713.hatenablog.com

ちなみに,Jupyter Notebookやインタラクティブシェル内でアンダースコア_を変数として扱っている場合は,
最後に表示された値としての_ではなく,変数としての_が優先されます.

 python                     
Python 3.9.1 (default, Jun 20 2021, 10:59:30) 
[Clang 12.0.5 (clang-1205.0.22.9)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> _ = "hoge"
>>> a = 100
>>> a
100
>>> _
'hoge'

変数や関数,メソッドの命名で使用する

アンダースコア(_)で終わる名前

予約語と同じ名前で変数や関数を使いたいときに,アンダースコア(_)で終わる名前をつけます.

list_ = [1, 2, 3, 4]
print(list_)

アンダースコア(_)で始まる名前

外部から参照されたくないモジュールや関数などの命名の際に,慣習的にアンダースコア(_)から始まる名前をつけます.

class Person:
    def __init__(self):
        self._say_hello()

    def _say_hello(self):
        print("Hello!")

person = Person()    # Hello!

注意点としては,実際には外部から参照できてしまうという点です.

class Person:
    def __init__(self):
        self._say_hello()

    def _say_hello(self):
        print("Hello!")

person = Person()    # Hello!
person._say_hello()    # Hello!

dunder(__; double underscore)で始まる名前

外部から変数やメソッドを参照できないようにするために,dunderを先頭に追加します.
dunderから始まる変数やメソッドには,ネームマングリングが適用されます.
ネームマングリングによって,変数やメソッドの名前は_<Class Name>が先頭についたものに変換されます.

class Sample:
    def __init__(self, name):
        self.name = name
        self._name = name
        self.__name = name

sample = Sample('hoge')

print(sample.name)  # クラス外から参照可能

print(sample._name)  # クラス内でのみ使用することを示している (ただし参照自体は可能)

print(sample.__name)  # Error; ネームマングリングされているためクラス外から参照できない

print(sample._Sample__name)  # ネームマングリング後の名前で参照可能

dunder(__; double underscore)に挟まれた名前

dunder(__)に挟まれた名前のメソッドや属性は,特殊メソッドや特殊属性として扱われます.
__init____call__, __str__などがその代表例です.

docs.python.org

桁の多い数字を見やすくする

アンダースコアを使うことで数字の桁を区切ることができます.

a = 100_000_000
b = 100000000
print(a == b). # True

Reference