はじめに
- はじめまして。takadowaといいます。Qiita記事を書くのはこれが初めてとなります。
- 私はPythonを使ってソフトウェア開発をすることが多く、Pythonを使い始めてもう8年目になります。
- そんな私でも『Effective Python 第2版』を読んで初めて知ることが多々ありました。それらをベースに、さらに調べて知ったことや自分の感想をまとめていきたいと思います。
- あなたのPythonソフトウェア開発の一助になれば幸いです。
実行環境
サンプルコードを掲載する際は、以下の実行環境で実行した結果を掲載します。
できる限りミスのない形で提供することを心がけますが、動かない、間違っているなどがありましてもご容赦ください。
- macOS 10.14.6
- Python 3.8.5
第1章<Pythonic思考>
import this
みなさんは「The Zen of Python」をご存知ですか?
Pythonのインタプリタを立ち上げてimport this
を実行すると以下のように「The Zen of Python」が表示されます。
>>> import this
The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
ここには、"Python"というプログラミング言語そのものを作っていく人たちに対する指導原則を格言の形で落とし込んだものが記されています。
PythonのメジャーコントリビュータであるTim Petersによって書かれたものであり、いわば"Python"の精神、哲学みたいなものが記されているのではないかと思います。
Pythonを使ってソフトウェア開発するなら、一度は読んでおきたいものですね。(といっても自分は最近初めて知ったのですが・・・
日本語訳とともに詳しく説明されたQiita記事がありますので、こちらをご覧になるとそれぞれの格言がよりイメージつきやすくなるのではないかと思います。
プログラマが持つべき心構え (The Zen of Python) -- Qiita
ちなみに、PEP 20 -- The Zen of Pythonによると、インタプリタでimport this
を実行すると「The Zen of Python」が表示されるのはイースターエッグとして仕込まれたもののようですね。
len(somelist) == 0
ではなくnot somelist
を使うべき
リストが空であることを調べたいとき、 if len(somelist) == 0
と評価したくなりますが、そうではなく、if not somelist
と書くべきです。
これは、リストが空であるときは暗黙的にFalse
と評価されることを利用しており、PEP 8(Pythonコードのスタイルガイド)にも記されています。
2値を評価するときに if flag == True
とは書かず if flag
と書くと思いますが、それと同じものだと思っておけば覚えやすいかもしれませんね。
for
とwhile
におけるelse
は使わないこと
for
文やwhile
文には、ループ内でbreak
が実行されなかった場合にのみ実行されるelse
ブロックがあります。
for i in range(3):
print(i)
if i == 1:
break
else:
print("Hello") # breakが実行されるので表示されない
>>>
0
1
for i in range(3):
print(i)
else:
print("Hello") # breakが実行されなかったので表示される
>>>
0
1
2
Hello
上記のサンプルコードを読んでも感じるように、どのときにelse
が実行され、どういったときはelse
が実行されないのか、といったことがパッとわからないと思います。このように振る舞いが直感的でないコードは誤解を生みやすくバグの原因にもなりますので、使用すべきではありません。
代わりに、以下のようにヘルパー関数を作成して実装すればいいでしょう。
def hoge():
for i in range(3):
print(i)
if i == 1:
return False
return True
if not hoge():
print("Hello")
>>>
0
1
Hello
代入式で繰り返しを防ぐ
代入式とは、Python3.8から新たに導入された構文で、
通常、代入「文」では、a = b
と書きますが、代入「式」では、a := b
と書きます。
代入「式」を使うことで、これまではどうしてもコードが重複していた部分が以下のように簡潔に書けるようになります。
# これまで
import re
string = "abcABC"
match = re.match(r"([a-z]+)", string)
if match:
print(f"{match.group(1)}")
else:
print("Not match")
>>>
abc
# これから(代入式を使って書いた場合)
import re
string = "abcABC"
if match := re.match(r"([a-z]+)", string): # matchへの代入と評価が1行で行える
print(f"{match.group(1)}")
else:
print("Not match")
>>>
abc
ちなみに、代入式は、書籍によると
「aウォルラスb」と発音されます(
:=
がセイウチの目玉と牙に見えるから)
とのことです。
「aウォルラスb」と発音してドヤりたくなりますが、きっと相手に通じず「aコロンイコールb」と言い直すことになるんでしょうね・・・笑
まとめ
『Effective Python 第2版』 第1章<Pythonic思考> の内容をベースに、調べて知ったことや感想を記しました。
- インタプリタで
import this
を実行すると「The Zen of Python」が表示されるので読んでおくと良いでしょう -
if len(somelist) == 0
ではなくif not somelist
を使って簡潔に書くべきでしょう -
for
文やwhile
文におけるelse
ブロックは使わないようにすべきでしょう - Python 3.8以降で開発する際は代入式
:=
を使ってコードの重複を減らすべきでしょう
(2020/08/20追記)続きの記事はこちら:『Effective Python 第2版』 第2章<リストと辞書>
参考文献
- Effective Python 第2版
参考サイト
- プログラマが持つべき心構え (The Zen of Python) -- Qiita
- PEP 20 -- The Zen of Python
- PEP 8(Pythonコードのスタイルガイド)