第1回 python勉強会

株式会社MNU 下村 佳生
自己紹介
• 下村 佳生 1984/03/07
• 株式会社MNU 取締役(4月で3年目
• 使ったことがある言語

python / js / c# / php / c / c++
• 大学ではCPUシミュレータ弄ってました
勉強会目標(仮)
• python(django)でwebアプリケーション作成
• pythonの使い方をパラパラめくっても

楽しくない
• 目標がないと分かった気になって終わる
勉強会での課題募集中
pythonお試し環境
• ブラウザ上で色々な言語を実行できるサイト
• http://ideone.com/
• https://paiza.io/
今日の内容
• python紹介
• 基本的なデータ構造
• コードの書き方基礎
• パッケージとモジュール
• クラスの記述
• 特殊な記述
• ライブラリを使おう
python紹介
外見の特徴
• 中括弧 { , } ではなくインデントで構造を表す
• 関数や制御文の後はインデントを1つ下げる
• 中身を省略したい場合は「pass」と書く



• タブではなくスペース4つでインデント
• 1行は80文字(100文字)以内
• → 誰が書いても似たような見た目になる
中身の特徴
• データも関数も全てオブジェクト
• 1 → 数字型のオブジェクト
• 引数に関数を渡すことが可能
• 関数に属性を追加できる
組み込み定数
• 真偽値
• True / False
• null値
• None
基本的なデータ構造
基本的なデータ構造
• リスト(配列のようなもの)
• タプル(変更できないリスト)
• 辞書(ハッシュ,連想配列のようなもの)
• セット(集合,順序のないリスト)
リスト(list)
• 大括弧で宣言
• a = [1, 2, 3]
• リストの追加はappendメソッドを使用
• a.append(4)
• 連結はextend もしくは +
• extendは元の配列に追加, + は新しい配列の作成
• a[0], a[1]のように参照可能
タプル(tuple)
• 編集できないリスト
• 括弧で宣言
• x = (1, 2, 3)
• appendやextendはない
• + 演算子は使用可能 (新しいタプルができる)
• 要素一個のタプルを作る場合は後ろに , をつける
• x[0] x[1]のように参照可能
辞書(dict)
• 中括弧で宣言, key: valueのペアを , で繋げる
• d = {1: 2, 2: 4, a : b }
• key で参照可能
• 存在しないかもしれないkeyの取得はgetを使う
辞書オブジェクトの関数色々
• d.get(key, default)
• d[key]の取得.なかったらdefaultを返す
• key in d
• keyがdにあればTrue, なければFalseを返す
• d.setdefault(key, value)
• d[key]がなければvalueをセット,あれば何もしない
• d.update(dict)
• 辞書を新しい辞書で上書き
• d.items()
• keyとvalueのタプルのリストを返す

[(key, value), (key, value), …]
集合(set)
• 順序のないリスト
• 中括弧で宣言
• {1, 2, 3, 4}
• ユニークな値の抽出や重複のチェックなどに便利
{1} {4}{2, 3}
コードの書き方基礎
pythonファイルを作ろう
• 拡張子は .py
• コメントは先頭に #
• 文字列は  か で囲む
• 日本語がある場合は uをつけて囲む 

u こんな感じ
• python2系統で日本語を使う場合は

ファイル1行目に以下を記述
記述方法
• スペースや改行,カンマの位置などは以下を推奨
• PEP8本家

http://legacy.python.org/dev/peps/pep-0008/
• PEP8(日本語訳)

http://pep8-ja.readthedocs.org/ja/latest/
繰り返し文
• 構文は以下のとおり

for 代入する変数名 in イテレータ:
• 辞書は keys(), values(), items()で

keyだけ,値だけ, (key, value) が取れる
繰り返し文補足
• 辞書のfor文は以下のように書くことが多い
※タプルは a, b = (1, 2) のように代入できる
if文
• 構文は以下の通り

if 条件:
• 複数条件がある場合は and や or を使う
関数の記述
• def の後ろに関数名
• カッコの中に引数を定義
• = を付けることでデフォルト値を設定可能
• * , ** と記述することで可変引数の取得が可能
• 最後に :
関数の呼び出し方
• = を付けることで特定の引数のみ渡せる
• リスト(タプル)に * を付けると一気に渡せる
• 辞書に ** を付けると名前付きで一気に渡せる
関数の戻り値
• return a b のように書くことで複数個返せる
• 呼び出し元はタプルで受け取る
• タプル,リストは a, b = arr で代入可能
• スコープ外で定義されたObjectの参照も可能
• スコープ内で宣言前に参照するとエラーになる
• 以下の順序で適用
• 関数
• クラス
• ファイル
• グローバル
スコープ
OK
NG
パッケージとモジュール
モジュール
• 「.pyファイル」がモジュールとなる
• 中身は関数やクラス,変数の集まり
• __name__でモジュール名が取得できる
• 一番最初に実行されるモジュール名は__main__
直接読み込んだ場合に定義した関数を実行する例
パッケージ
• モジュールをまとめたもの
• ディレクトリの中に__init__.pyを用意する
• 中身は空でよい
SoftLayerパッケージの中身
モジュール/パッケージの読込
• import [パッケージ/モジュール名]
• from [パッケージ名] import [モジュール名]
• 後ろに as を付けると別名にできる
クラスの記述
クラスの記述
• class 名前(継承元): の形で記述
• 継承元がない場合は object を書く
• メソッドの第1引数は全てselfを取る
• クラスメソッドの場合も同様(こっちはclsにする)
クラス記述例
コンストラクタとデストラクタ
• __init__メソッドがコンストラクタに相当
• __del__メソッドがコンストラクタに相当
• __(アンダーバーを2つ)を前後に挟んだメソッドは

大体特殊な用途のメソッド
特殊メソッド
• 演算子オーバーロード
• オブジェクトに定義することで動作を追加,変更
表記 意味 使用例等
__str__ 簡易文字表現 printなど
__repr__ 詳細文字表現 logなど
__eq__ 比較演算子(=) insA == insB
__getitem__ 辞書表現 ins[key]
__call__ 関数化 ins()
特殊メソッドの例
特殊メソッド実装例
辞書アクセスとインスタンスの例 実行結果
特殊メソッド色々
• python2
• http://docs.python.jp/2/reference/
datamodel.html#specialnames
• python3
• http://docs.python.jp/3/reference/
datamodel.html#specialnames
特殊な記法
特殊な記法
• リスト内包表記
• http://docs.python.jp/2/tutorial/datastructures.html#id6
• デコレータ
• http://docs.python.jp/2/glossary.html#term-decorator
• with
• http://docs.python.jp/2/reference/
datamodel.html#context-managers
リスト内包表記
• [作成する要素 for x in list 判定式]
• {}で囲むと辞書,()で囲むとジェネレータになる
0から9までの偶数を10倍したリストを作るコードの比較
デコレータ
• 関数をラップして関数を返す関数
• 引数や戻り値のチェックや変換が可能
• 認証処理やProxyなど,共通ロジックで使用
• 関数やメソッドの前の行に @ をつけて指定する
• 入れ子も可能(下から順番に適用される)
デコレータの例(1/4)
• 関数を受け取って,その関数をそのまま返すデコレータ
• 左右でやってることは同じ
デコレータの例(2/4)
• 関数を受け取って,全く別の関数を返すデコレータ
デコレータの例(3/4)
• 引数を増やしてみる
デコレータの例(4/4)
• 引数を装飾し,渡された関数を呼びなおす
with構文
• 明確なタイミングで終了処理をしたい時に利用
• fileのopen, closeなど
• javaなどのtry-catch-finallyに相当
• __enter__,__exit__メソッドを実装することで
自作可能
htmlタグを出力するwith
ライブラリを使おう
ライブラリを使おう
• python standard library
• 標準でついてくるライブラリ
• http://docs.python.jp/2/library/
• http://docs.python.jp/3/library/
• pip
• サードパーティ製の便利コード色々
• https://pypi.python.org/pypi/pip
カレンダー操作
• calendar.Calendar
• 様々なiteratorを返すカレンダークラス
• 各メソッドに年月を渡す
引数はスタートの曜日
0:月曜 ∼ 6:日曜
カレンダー表示
• calendar.TextCalendar
• カレンダー表示を行う
日付型と操作 (1/2)
• datetime.date 日付を表すクラス
• datetime.timedelta 日付や時間の差分
日付同士は引き算可能 結果はtimedelta型
日付型と操作 (2/2)
• timedeltaは足すことも可能
結果はdate型
時間単位や週単位も指定可能
では1ヶ月後はどう計算する?
日付計算
• 単純に一ヶ月を足すと…
• 5/31 → 6/31 でエラー
• 12/1 → 13/1 でエラー
→月の最大日数を考慮しよう
from calendar import monthrange
→12月の場合は翌年の1月に設定
日付計算 実装例
もっと簡単な日付操作
• python-dateutilライブラリ(pipでinstall)
• dateutil.relativedelta.relativedelta
• より詳細な日付操作が可能
http://dateutil.readthedocs.org/en/latest/relativedelta.html
2月31日(3月3日)ではなく2月28日になる
monthではなくmonthsなのに注意
日付操作応用 問題
• 月末を取得してみよう
日付操作応用 答え
• 今月の月末の取得
日付操作おまけ
クラスをカスタマイズしよう
dateクラスを継承し,月末を返すメソッドを追加

第1回python勉強会