読者です 読者をやめる 読者になる 読者になる

MyEnigma

とあるエンジニアのブログです。#Robotics #Programing #C++ #Python #MATLAB #Vim #Mathematics #Book #Movie #Traveling #Mac #iPhone

Effective Pythonを読んで心に響いたこと

Python Programming

Effective Python ―Pythonプログラムを改良する59項目

Effective Python ―Pythonプログラムを改良する59項目

目次

はじめに

以前、C++の名著Effective C++を読んで

心に響いたことを記事にまとめました。

myenigma.hatenablog.com

 

実はこのEffectiveシリーズは、

様々なプログラミング言語で発売されており、

PythonバージョンのEffective Pythonも発売されています。

Effective Python ―Pythonプログラムを改良する59項目

Effective Python ―Pythonプログラムを改良する59項目

 

今回もこのEffective Pythonを読んで、

心に響いたことをメモとして

残しておきたいと思います。

Pythonのランタイムの種類

Pythonには、標準のCで実装された

CPython以外にも、

  • Jython: PythonのJava実装

Jython - Wikipedia

  • IronPython: PythonのC#,.Net実装

IronPython.net /

IronPython - Wikipedia

  • PyPy: PythonのPython実装

pypy.org

PyPy - Wikipedia

 

自分の得意な言語と上手く連携できるとより便利ですね。

プライベート属性はアンダーバーを2つ先頭におく

Pythonは厳密にはクラスのプライベート属性は無いようですが、

アンダーバーを2つ先頭に置くことで、

プライベート属性を表すことができます。

 

Pythonにおけるプライベート属性は下記の記事が参考になります。

woodyring.blog.so-net.ne.jp

d.hatena.ne.jp

d.hatena.ne.jp

 

リストや文字列の空判定にlenなどは使わない

下記のように,リストや文字列が空の時は

if文にそのまま入れるとFalseが返る機能を使いましょう。

alist=[]

if not alist:
    print("empty")

astr=""

if not astr:
    print("empty")

 

mapやfilterよりもリスト内包表記を使う

あるリストのそれぞれの要素に同じ処理を実施したいことは、

多々ありますが、

そのために良く使用されるのがmapやfilterです。

 

しかし、Effective Pythonでは、

リスト内包表記のforをmapの代わりに、

ifをfilterの代わりに使うことを推奨しています。

例えば、0から100の偶数リストを取得する場合には

下記のようなリスト内包表記を使います。

a = [x for x in range(100) if x % 2 == 0]

ちなみにリスト内包表記は、

for文などに比べて、非常に高速に処理できるらしいです。

 

rangeよりはenumarateを使う

あるリストに対してループを回す時に、

Pythonでは inを使うと思いますが、

同時にリストの添字の数字も取得したい場合があります。

そんな時は、enumerateを使うと便利です。

 

下記のようにリストの中身と添字を同時に取得できます。

list1 = ['a', 'b', 'c']
for (i, x) in enumerate(list1):
    print i,x

  

オプションのキーワード引数は、位置ではなくキーワードで与えるとコードが読みやすい

pythonの関数の引数は、

下記のようにキーワードでデフォルト値を決めることができますが、

def CalcHoge(a,b,time=200,length=10):
   u"""
      何かの計算
   """

上記のような関数を使う時に、

下記のように位置で引数を指定することもできますが、

CalcHoge(10,5,200,10)

下記のように、ちゃんとキーワードで引数を与えると、

どのようなパラメータで値を与えたのかがわかりやすくなります。

CalcHoge(10,5,time=200,length=10)

 

どんなクラスオブジェクトでも__dict__ですべてのフィールド辞書にアクセスできる

Pythonのすべてのクラスオブジェクトは__dict__というメンバ変数を持っており、

これは、そのクラスが持っているフィールド辞書、

つまり、メンバ変数やメソッドを辞書形式で保持しています。

 

例えば、下記のように、

mathモジュールの__dict__を表示すると、

多くのメソッドとメンバ変数を有していることがわかります。

f:id:meison_amsl:20160326213641p:plain

 

複雑なクラスオブジェクトの中身を確認するのに便利ですね。

 

Pythonコードのプロファイルを取るにはcProfileを使うと便利

計算時間がかかるPythonプログラムを

最適化したい場合、プロファイルを取ることが重要です。

 

そんな時に便利なのが、

Pythonの標準ライブラリであるcProfileです。

(ただOSによっては、別途インストールが必要なようです。)

 

使い方は非常に簡単で、

下記のようにcProfileの中で対象のスクリプトを起動するだけです。

$ python -m cProfile -s time スクリプト名.py

すると下記のように、

計算時間が長くかかったメソッドが順番に表示されます。

f:id:meison_amsl:20160326213250p:plain

 

参考資料

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

Effective Python ―Pythonプログラムを改良する59項目

Effective Python ―Pythonプログラムを改良する59項目