自己紹介
普段私は、
一番得意な機械学習(深層学習)をしたり、
Python/Django でWebアプリを開発したり、
TypeScript/Vue or React でフロントエンドの開発をしたり、
PHP/Laravel でWebアプリを開発したり、
さまざまなことを行っています。
趣味で休みの日にGo言語で色々作成しているのですが、型のある世界は素敵だなと昨今感じています。
今最もやりたいことは、Goで大規模なWebアプリケーションを作成したい。
企業案件やご連絡等ございましたらお気軽に下記よりご連絡いただければと思います。
nagamatsu-k@dym.jp
第3次AIブームの到来
米Google DeepMindが開発した人工知能(AI)の囲碁プログラム「AlphaGo」が世界トップレベルの実力を持つ韓国のプロ棋士、李世ドル(イ・セドル)九段に4勝1敗と大きく勝ち越したことが着火剤となり、2015年より第3次AIブームへと突入した。(ちなみにAIが誕生したのは1950~1960年代で第1次AIブームの到来)
余談になるがAlphaGo(4億円の知能)はなぜすごいのか?
AlphaGoがそれ以前のチェスや将棋のAIと異なるのは、畳み込みニューラルネットワーク(CNN)を応用している点だ。このCNNはさらに強化学習を行い、自分自身と対局を数千万回も繰り返した。
Pythonってすごくない??
機械学習やデータ解析に必要なライブラリが充実しているだけでなく、Webアプリケーションを開発するフレームワークDjangoの完成度の高さ(特にセキュリティ面のサポートがすごい)
できないことはないにも関わらず、簡単に書けてしまう。
やっぱりPythonってすごい。
Pythonは書きやすいが読みにくい?
柔軟なコードが書けるがゆえ、初心者が書いてしまうと2度見、いや4度見してしまうコードがたくさんある。
Pythonは「誰が書いても同じようなコードが完成する」をモットーに作られている、その真理から程遠い俗にいう「うんこーど」が生まれるのも事実である。
Pythonのコードが人より上手く書けるように伝授しようではないか
Pythonを書いているのにアンダースコアの区別がつかないって?
下記のような疑問を抱く初学者は多くいるだろう。
「def __init__(self):
の__init__
のアンダースコアは何故二つなのか?」
「def _function(x):
と def function(x):
と def function_(x):
に違いはあるのか?」
「y, _ = _function(x)
のアンダースコアは何か?」
このようにわかりそうでわからないアンダースコアの使い方を、紐解いていこう。
そもそもアンダースコアはいつ使われるのか?
- 戻り値を無視する。
- 関数の名付けで使い方を区別する。
- 数字や文字を読みやすくする。(スネークケース)
- インタプリタで最後に表示された値を代表する。
以上4種類を意識しアンダースコアを使いこなす事により、読みやすいpythonicなコードを書くことができる。
1、Return値を無視
x, _, z = (1, 2, 3)
# x=1, z=3
# * 2つの戻り値を返す関数
def func_return_2():
return 'X', 'Y'
x, _ = funct_return_2()
# x='X'
# * enumerateはイテレータ(リスト等)の要素とIndexを返す関数
numbers = ["りんご", "ぶどう", "バナナ"]
for idx, _ in enumerate(numbers):
print(idx)
"""結果
0
1
2
"""
これが一番多いアンダースコアの使い方だ。
Pythonはライブラリが沢山あって、関数をインポートして使う事が多い。
そういう時、もし関数からのreturn値が複数あって使わない部分があった場合、
アンダースコアを使ってreturn値のメモリの占用をしないまま廃棄ができる。
これを意識するだけで処理速度が速くなるかも??
2、関数の名付けで使い方を区別
関数の名付けで使うアンダースコアは、アンダースコアの付ける位置と数で関数の使い方を4種類に区別します。
それぞれPEP8のコーディング規約で定義されている。
Ⅰ、_function(x): #関数前に一つ
def _single_leading_underscore(x):
return something
# weak "internal use" indicator. E.g. from M import * does not
# import objects whose names start with an underscore
関数前に一つアンダースコアを付ける事により、関数を”内部用”に定義できる。
他のプログラミング言語のPrivate属性と似たような物ですが、
Pythonには事実上のPrivate属性が存在しない。
PEP8の説明ではweak internal useと説明されていて、
from M import *
の時では,一つのアンダースコアで始まる関数はインポートされませんが、class内の関数だとclassx._func()で関数を呼ぶ事が出来ます。
Ⅱ、function_(x): #関数後に一つ
def single_trailing_underscore_:
return something
# used by convention to avoid conflicts with Python keyword, e.g.
# Tkinter.Toplevel(master, class_='ClassName')
関数後に一つアンダースコアを付けるのはPython内の重要関数と名付けを被らせない為だ。
例えばclass内でどうしてもlistと言う関数や引数を設定したい時、
list_ と名付けてPythonのlistと被ることを避ける。
Ⅲ、__function(x): #関数前に二つ
def __double_leading_underscore:
return something
# when naming a class attribute, invokes name mangling
# (inside class FooBar, __boo becomes _FooBar__boo; see below).
class内の関数前に二つアンダースコア付けることで、名前の マングリング機構を呼び出す。
ここのマングリングとは、インタプリタやコンパイラーが普通の方法で変数を扱わなくなる事です。
例えばclass FooBarの関数_booについて説明すると、Foobar.__barでは関数を呼べ出せなく、_Foobar_booという使い方になる。擬似的にPrivate属性を作れます。
Ⅳ、function(x): #関数前後に二つずつ
def __double_leading_and_trailing_underscore__:
return something
# "magic" objects or attributes that live in user-controlled
# namespaces. E.g. __init__, __import__ or __file__. Never invent
# such names; only use them as documented.
class内の関数の前後に二つずつアンダースコア付けることで、magic methodになります。
_init_や_call_、_str_、_iter_等既存のmagic methodがあってクラスを華やかに書けるが、普段の開発では自分で新しくマジックメソッドを定義しないことをお勧めする。
3、数字を読みやすく
>>> 1000000
Out: 1000000
>>> 1_000_000
Out: 1000000
Python 3.6以降では、数字を読みやすくする様にアンダースコアを数字内に加える事が出来る。
一般で使われてる3桁ごとにカンマを実現可能。
結論
アンダースコアは使いこなすと凄く見える!
実は他にも使い方がありますが、あまりにも使わないので今回は割愛しました。
ちなみに _ はアンダーバーやアンダーラインとか呼ばれていますが、英語ではアンダースコア(underscore)が正しい読み方です。
__の様にアンダースコアが二回連続で使われてるとdunders (double underscore)と言うかっこいい名前がある。
コメント
@_Kohei_0
@Enchan1
@_Kohei_(編集済み) 0
@naminodarie
8
@umachi0
@Atsushi776 Atsushi776さん
ご指摘ありがとうございます。
markdownでは__が連続するとitalic扱いになるんですね、編集反映させていただきました!
markdownでは__が連続するとitalic扱いになるので、バックティックで囲ってコード化するといいと重います。 by Atsushi776 2021/07/21 16:41
とてもよい記事でした、参考になりました!
引用元の記事はこちらでしょうか(違っていたら申し訳ございません): Pythonのアンダースコア( _ )を使いこなそう! - Medium
引用元を明記すると、この記事に書かれている以上のことを調べにきた人に優しいと思います
@Enchan
ありがとうございます!!
おっしゃる通りですね、引用元も明記しておきます!!
_
は有効な変数名なので普通にメモリを消費します。処理速度が速くなるかも!?
…ってまったく根拠ない。