SlideShare a Scribd company logo
http://www.globalwalkers.co.jp/
Global Walkers, inc.
【 GWゼミ #0 】
Pythonの基礎について
Global Walkers 杉野
http://www.globalwalkers.co.jp/
Global Walkers, inc.
Pythonでプログラムを書きたい!
このセクションの目的
http://www.globalwalkers.co.jp/
Global Walkers, inc.
Pythonの基礎に入る前に
「スクリプトが書ける」ということへのニーズとは?
■ 作業する時に、ちょっとした便利機能を作ることができる
3
http://www.globalwalkers.co.jp/
Global Walkers, inc.
Pythonを勉強したいけど
■ 公式ドキュメントを見ても、何をどこから見ていいやら・・・
■ チュートリアルに沿って進んでいると、とっても時間がかかる・・・
■ なかなか、目的に到達しない・・・
4
http://www.globalwalkers.co.jp/
Global Walkers, inc.
やる気を高めよう!
5
【 Python チュートリアルより抜粋 】
コンピュータを使って様々な作業をしていたら、自動化したい作業が出てくるでしょう。たとえば、たくさんのテキストファイルで検索-置換操作を行いたい、
大量の写真ファイルを込み入ったやりかたでリネームまたは整理したいといったものです。ひょっとすると、小さなカスタムデータベースや、何かに特化した
GUIアプリケーション、シンプルなゲームを作りたいかもしれません。
もしあなたがプロのソフト開発者なら、C/C++/Java ライブラリを扱う必要があって、通常の write/compile/test/re-compile サイクルが遅すぎると感じるかもしれ
ません。ひょっとするとそのようなライブラリのテストスイートを書いていて、テスト用のコードを書くのにうんざりしているかもしれません。拡張言語を使え
るプログラムを書いていて、アプリケーションのために新しい言語一式の設計と実装をしたくないと思っているかもしれません。
Pythonはそんなあなたのための言語です。
http://www.globalwalkers.co.jp/
Global Walkers, inc.
今回の目的
■ 「書いてみる」事の敷居を下げる
■ 調べるときのインデックスや引き出しを作る!
6
Pythonの言語仕様を全て話すわけではありません!
言語仕様なんて暗記するものでもありません!
http://www.globalwalkers.co.jp/
Global Walkers, inc.
Pythonとは?
http://www.globalwalkers.co.jp/
Global Walkers, inc.
Pythonとは
■ インタプリタ型のスクリプト言語
■ オブジェクト指向言語
■ 科学演算や機械学習で利用可能なライブラリが多数用意されている
■ Pythonで作られているもの
Google App Engine, YouTube, DropBox, etc…
8
http://www.globalwalkers.co.jp/
Global Walkers, inc.
Python Version には 2系と3系があるけど
■ 今回の講習では python 3系で進みますが・・・
→ 公式ドキュメントでは、2系の方がライブラリサポートが多いと書いてある
→ やりたいことに即して調べてからバージョンを決めましょう・・・
■ Python3で何が変わったの?
9
printが関数に
dict の keys, items, valuesメソッドはイテレート可能なオブジェクトを返す
文字列の標準の方がUnicode型に統一
etc …
http://www.globalwalkers.co.jp/
Global Walkers, inc.
Python を書いてみよう
■ 実際のコードを見ながら、キーポイントをピックアップしていきます
■ 「Python を書ける人」と思われるための初歩
http://www.globalwalkers.co.jp/
Global Walkers, inc.
テーマ
■ file_list.pyというスクリプトを作って
指定したディレクトリの中に格納されている
ファイル名をターミナルに表示してみよう
11
http://www.globalwalkers.co.jp/
Global Walkers, inc.
Update 1
■ まずは
→ コマンドラインの第一引数を取る
→ ディレクトリ内のファイル名を取得してみる
12
http://www.globalwalkers.co.jp/
Global Walkers, inc.
Update 1
13
http://www.globalwalkers.co.jp/
Global Walkers, inc.
Update 1: 詳細
14
globモジュールのglob関数に検索したいディレクトリ名を渡すと、
その配下にあるファイルの一覧がリスト(厳密にはイテレータ)で返されます。
コマンド引数の値は、sysモジュールのargvというリストに格納されています。
リストの何番目の値を参照するかは、[ index番号 ] でアクセスします。
http://www.globalwalkers.co.jp/
Global Walkers, inc.
Pythonの特徴
■ 型宣言がない!
→ pythonでは、型は自動判定してくれます(動的型付け)
■ { } がない!
→ pythonでは、ステートメントブロックはインデントで表現されます
■ “ ; ”もいらない!
→ pythonでは、1行1ステートメントが基本です
15
http://www.globalwalkers.co.jp/
Global Walkers, inc.
Update 1:実行結果
16
あれ? dir_2, dir_3 の下にあるファイルは出てこないんだ・・・
http://www.globalwalkers.co.jp/
Global Walkers, inc.
Update 2
17
http://www.globalwalkers.co.jp/
Global Walkers, inc.
Update 2:詳細
18
os.path モジュールを使って、
検索されたパスがファイルもしくはディレクトリなのか判定し、
ディレクトリならば、その配下のファイルを検索するようにしてみました。
http://www.globalwalkers.co.jp/
Global Walkers, inc.
Pythonの特徴
■ if文やfor文に { } がない!
→ pythonでは、ステートメントブロックはインデントで表現されます
19
http://www.globalwalkers.co.jp/
Global Walkers, inc.
Update 2:実行結果
20
とは言え、最下層のディレクトリはまだ検索できていませんね・・・そりゃ、そうだ・・・
階層が違うだけでやることは、同じことの繰り返し。
関数化して再帰的に処理してエレガントにいきたいなー・・・
http://www.globalwalkers.co.jp/
Global Walkers, inc.
Update 3
21
http://www.globalwalkers.co.jp/
Global Walkers, inc.
Update 3:詳細
22
ディレクトリの時には再度同じ関数をよぶ再帰呼出しにして
階層が深くなっても同様に動作するように変えてみました。
http://www.globalwalkers.co.jp/
Global Walkers, inc.
Pythonの特徴
■ 関数は以下のように宣言する
23
def 関数名( 引数 ):
ステートメントブロック
http://www.globalwalkers.co.jp/
Global Walkers, inc.
Update 3:実行結果
24
よし、全部キレイにファイル名取れたし、表示できたな。
しかしファイル名を置換したりできるように使いまわせるようにしたいなー
http://www.globalwalkers.co.jp/
Global Walkers, inc.
Update 4
25
http://www.globalwalkers.co.jp/
Global Walkers, inc.
Update 4:詳細
26
「ファイルを検索する」という処理と、
「ファイル名を表示する」という処理を分けてみました。
http://www.globalwalkers.co.jp/
Global Walkers, inc.
Pythonの特徴
■ Iterator は yield を使って表現する
27
yield とは・・・
簡単に言うと関数の処理を一旦とめて、呼び出し元に値を返します
http://www.globalwalkers.co.jp/
Global Walkers, inc.
Update 4:実行結果
28
よし、全部キレイにファイル名取れたままで問題なしと。
しかし、ファイルについての情報を何かの処理で参照したくなるかもなー
http://www.globalwalkers.co.jp/
Global Walkers, inc.
Update 5
29
http://www.globalwalkers.co.jp/
Global Walkers, inc.
Update 5:詳細
30
ファイルの情報を記憶するための
FileInfomationというクラスを作ってみました。
http://www.globalwalkers.co.jp/
Global Walkers, inc.
Pythonの特徴
■ classは以下のように宣言する
■ 初期化関数は以下のように宣言する(特殊メソッドのオーバーロード)
■ クラス内でinstanceアクセスは self
31
class クラス名( 親クラス ):
class クラス名( 親クラス ):
def __init__( self, 引数 ):
ステートメントブロック
■ ガベージコレクションはどうなっている?
■ クラス内の関数宣言でのスコープは?
クラスに対して関数宣言をする場合には第一引数には必ず self がいる!
http://www.globalwalkers.co.jp/
Global Walkers, inc.
Update 5:実行結果
32
よし、実行結果変わらず、問題なしと・・・
もうちょっと、知ったかぶってみようかな・・・
http://www.globalwalkers.co.jp/
Global Walkers, inc.
Update 6
33
http://www.globalwalkers.co.jp/
Global Walkers, inc.
Update 6:詳細
34
objectの特殊メソッドで文字列表現用のメソッドがあったのでオーバーロードしてみました
手続き型処理部分に __name__ == ‘__main__’ なる条件をつけてみました
http://www.globalwalkers.co.jp/
Global Walkers, inc.
Pythonの特徴
■ 手続き処理部分には if __name__ == ‘__main__’ をつけよう
35
作成したスクリプトファイルを実行した際には、
トップレベルのコード名として、モジュール属性である __name__ に ‘__main__’ という名前が入る
複数ファイルで実装するときに使えるテクニック
http://www.globalwalkers.co.jp/
Global Walkers, inc.
Update 6:実行結果
36
よし、実行結果変わらず、問題なしと・・・
���ぁ、これならコード見られても恥ずかしくないかな・・・
http://www.globalwalkers.co.jp/
Global Walkers, inc.
OpenCV
■ PythonでOpenCVを使うために
http://www.globalwalkers.co.jp/
Global Walkers, inc.
Python + OpenCV
38
http://www.globalwalkers.co.jp/
Global Walkers, inc.
Appendix
■ Script Text Data
http://www.globalwalkers.co.jp/
Global Walkers, inc.
#!/usr/bin/env python
import sys, os, glob
class FileInfomation( object ):
def __init__( self, fname ):
self.fname = fname
def __str__( self ):
return "[file]: %s" % self.fname
def each_file( dir ):
for fname in glob.glob( "%s/*" % dir ):
if os.path.isfile( fname ):
yield FileInfomation( fname )
if os.path.isdir( fname ):
for finfo in each_file( fname ):
yield finfo
raise StopIteration
flie_list.py
40
if __name__ == '__main__':
target_dir = sys.argv[1]
for finfo in each_file( target_dir ):
print( finfo )
http://www.globalwalkers.co.jp/
Global Walkers, inc.
#!/usr/bin/env python
import sys, cv2
import numpy as np
def create_window( img, wname, x, y ):
cv2.namedWindow( wname )
cv2.moveWindow( wname, x, y )
cv2.imshow( wname, img )
def show_image( fname, target_func ):
mimg = cv2.imread( fname, cv2.IMREAD_UNCHANGED )
oimg = target_func( mimg )
height, width = mimg.shape[:2]
create_window( mimg, fname, 50, 50 )
create_window( oimg, 'after convert', width + 50, 50 )
cv2.waitKey( 0 )
cv2.destroyAllWindows()
def simple_view( img ):
return img
def gray_scale( img ):
gray_img = cv2.cvtColor( img, cv2.COLOR_RGB2GRAY )
_, threshold_img = cv2.threshold( gray_img, 60, 255, cv2.THRESH_BINARY )
return cv2.cvtColor( threshold_img, cv2.COLOR_GRAY2RGB )
opencv_sample.py
41
if __name__ == '__main__':
show_image( sys.argv[1],
# (lambda img: simple_view(img) )
(lambda img: gray_scale(img) )
)

More Related Content

勉強会 Cvml python基礎