77
69

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

『Effective Python 第2版』 第1章<Pythonic思考>

Last updated at Posted at 2020-08-16

はじめに

  • はじめまして。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 と書くと思いますが、それと同じものだと思っておけば覚えやすいかもしれませんね。

forwhileにおける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章<リストと辞書>

参考文献

参考サイト

77
69
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
77
69

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?