『Effective Python 第2版』 第1章＜Pythonic思考＞

# はじめに
* はじめまして。takadowaといいます。Qiita記事を書くのはこれが初めてとなります。
* 私はPythonを使ってソフトウェア開発をすることが多く、Pythonを使い始めてもう8年目になります。
* そんな私でも[『Effective Python 第2版』](https://www.oreilly.co.jp/books/9784873119175/)を読んで初めて知ることが多々ありました。それらをベースに、さらに調べて知ったことや自分の感想をまとめていきたいと思います。
* あなたの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](https://qiita.com/IshitaTakeshi/items/e4145921c8dbf7ba57ef)

ちなみに、[PEP 20 -- The Zen of Python](https://www.python.org/dev/peps/pep-0020/)によると、インタプリタで`import this`を実行すると「The Zen of Python」が表示されるのはイースターエッグとして仕込まれたもののようですね。

## `len(somelist) == 0`ではなく`not somelist`を使うべき

リストが空であることを調べたいとき、 `if len(somelist) == 0` と評価したくなりますが、そうではなく、`if not somelist` と書くべきです。
これは、リストが空であるときは暗黙的に`False`と評価されることを利用しており、[PEP 8（Pythonコードのスタイルガイド）](https://pep8-ja.readthedocs.io/ja/latest/)にも記されています。

2値を評価するときに `if flag == True` とは書かず `if flag` と書くと思いますが、それと同じものだと思っておけば覚えやすいかもしれませんね。

## `for`と`while`における`else`は使わないこと

`for`文や`while`文には、ループ内で`break`が実行されなかった場合に**のみ**実行される`else`ブロックがあります。

```python
for i in range(3):
    print(i)
    if i == 1:
        break
else:
    print("Hello")  # breakが実行されるので表示されない

>>>
0
1
```

```python
for i in range(3):
    print(i)
else:
    print("Hello")  # breakが実行されなかったので表示される

>>>
0
1
2
Hello
```

上記のサンプルコードを読んでも感じるように、どのときに`else`が実行され、どういったときは`else`が実行されないのか、といったことがパッとわからないと思います。このように振る舞いが直感的でないコードは誤解を生みやすくバグの原因にもなりますので、使用すべきではありません。

代わりに、以下のようにヘルパー関数を作成して実装すればいいでしょう。

```python
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`と書きます。
代入「式」を使うことで、これまではどうしてもコードが重複していた部分が以下のように簡潔に書けるようになります。

```python
# これまで
import re
string = "abcABC"

match = re.match(r"([a-z]+)", string)
if match:
    print(f"{match.group(1)}")
else:
    print("Not match")

>>>
abc
```

```python
# これから（代入式を使って書いた場合）
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章＜リストと辞書＞](https://qiita.com/takadowa/items/8c2cadf896cd62343ff2)

# 参考文献
* Effective Python 第2版
    * https://www.oreilly.co.jp/books/9784873119175/

# 参考サイト
* プログラマが持つべき心構え (The Zen of Python) -- Qiita
    * https://qiita.com/IshitaTakeshi/items/e4145921c8dbf7ba57ef
* PEP 20 -- The Zen of Python
    * https://www.python.org/dev/peps/pep-0020/
* PEP 8（Pythonコードのスタイルガイド）
    * https://pep8-ja.readthedocs.io/ja/latest/