i117 プログラミング演習ii i117 programming …shinoda- プログラミング演習ii i117...

57
I117 プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター Research Center for Advanced Computing Infrastructure (RCACI) 小原 泰弘 / Yasuhiro Ohara [email protected]

Upload: dophuc

Post on 26-Mar-2018

224 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター

I117 プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター Research Center for Advanced Computing Infrastructure (RCACI)

小原 泰弘 / Yasuhiro Ohara

[email protected]

Page 2: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター

スケジュール / SCHEDULE

1. 2011/06/07(Tue): プログラミングの基礎 / Basic of Programming

2. 2011/06/09(Thu): 基本データ構造 / Fundamental data structures

3. 2011/06/14(Tue): メモリ管理1 / Memory Management 1

4. 2011/06/16(Thu): メモリ管理2 / Memory Management 2

5. 2011/06/21(Tue): デバッグ / Debugging

6. 2011/06/23(Thu): ソフトウェア開発環境1 / Software Development Env. 1

7. 2011/06/28(Tue): ソフトウェア開発環境2 / Software Development Env. 2

8. 2011/06/30(Thu): 木 / Data Structure : Tree

  9. 2011/07/05(Tue): ハッシュ / Data Structure: Hash

  10. 2011/07/07(Thu): プログラム理解1 / Understanding Programs 1

  11. 2011/07/12(Tue): プログラム理解2 / Understanding Programs 2

  12. 2011/07/14(Thu): スクリプト言語1 / Script Language 1

  13. 2011/07/19(Tue): スクリプト言語2 / Script Language 2

  14. 2011/07/21(Thu): その他の言語 / Other Languages

  15. 2011/07/26(Tue): 試験 / Examination

Page 3: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター

課題(自由課題) / FINAL REPORT

  自由課題 free topic

 提出: The deadline: 7/26(Tue)   Submit

  the source code, and the report.   by e-mail: [email protected] by 7/26(Tue) 23:59.

  例)   サウンドファイルの変換プログラム / Sound file converter   ウェブクローラー / web crawler   カレンダープログラム(CalDAVコマンド群) calendar program   新しいシェル・エディタ・ウィンドウマネージャー new shell, editor, window

manager   圧縮解凍・暗号化アルゴリズム、rsyncの実装 encrypt/decrypt, rsync   形態素解析を利用した人工無能プログラム markov-chain program

  レポートには高度な考察・議論を。The final report must have deep consideration

Page 4: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター

今日の目次 / TODAY'S INDEX

  python

Page 5: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター

PYTHON

Page 6: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター

PYTHON

 高級、高機能寄り。   無名関数   関数のインスタンス(クロージャ)   カリー化

 関数型言語より簡易。   シェル寄りの文法

C sh Perl

手続き型言語

関数型言語

純粋型 非純粋型

Java Ruby Python

C++ Erlang LISP Scheme

ML OCaml Haskel

オブジェクト指向

Page 7: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター

PYTHONとは

 スクリプト言語のひとつ  超高級言語(very-high-level language)と謳っている  名前は,英BBC放送のコメディ番組 “Monty Python’s

Flying Circus” (モンティ・パイソン空を飛ぶ)に由来  以下の機能・特徴を備える

  Cなどよりも優れたエラーチェック機能   動的配列や辞書などのビルトインデータタイプ   クラスベースオブジェクト指向   動的型付け   ガベージコレクション   インデントベースのステートメントグルーピング   関数型言語由来のラムダ式

Page 8: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター

PYTHONのバージョン

 Python 2.x   現在,最も広く使われているバージョン   最新バージョンは,2.7   本講義では2.x系列のPythonについて解説

 Python 3.x   いくつかの言語仕様的な変更が行われている   後方互換性が無く,Python 2.x 用のプログラムは,Python

3.x のインタプリタでは動作しない   現在のところ,あまり普及はしていない

Page 9: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター

PYTHONの実装

  CPython   Cで書かれている   Pythonインタプリタというと,普通,このCPythonのことを指す

  JPython   Javaで書かれている   Java VM上で動作

  PyPy   Pythonで書かれたPythonインタプリタ

  IronPython   C#で書かれている   .NETフレームワーク上で動作

  Unladen Swallow   CPythonを高速化する目的で作られている   LLVMを用いたJITコンパイラを内包

  Stackless Python   マイクロスレッド,コルーチン,タスク間の通信チャネル,タスクシリアライズなど,並行処理のための拡張を行ったPythonの変種・方言

  Eve Online,Second LifeなどのMMORPGや,CiscoのメールゲートウェイであるIronPortなどで利用されている

Page 10: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター

HELLO WORLD!

 標準出力への出力は,print命令で行う   pythonインタプリタを起動し,インタラクティブシェル中で実行した例

  インタラクティブシェルから抜けるには,Ctrl+Dを入力   もちろん,スクリプトファイルを指定して実行することも可能

  Pythonファイルの拡張子は,.pyとなる

$ python >>> print ‘Hello World’ Hello World!

$ cat hello.py print ‘Hello World’ $ python hello.py Hello World!

Page 11: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター

HELLO WORLD! IN PYTHON 3.X

 Python 3.x では 出力は print() 関数で行う >>> print(‘Hello World’) Hello World!

Page 12: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター

PYTHONスクリプトを実行可能にする

 Shellスクリプトと同様に,1行目に #! でスクリプトのインタプリタを指定し,実行権限を付加することで実行可能となる

$ cat hello.py #!/usr/bin/env python print ‘Hello World’ $ chmod +x hello.py $ ./hello.py Hello World!

Page 13: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター

スクリプトファイルの文字エンコーディング

 Pythonでは様々な文字エンコーディングでスクリプトを書ける

 ASCII以外の文字コードを利用する際には,文字コードを指定する必要がある   文字コードの指定は,# -*- coding: encoding -*- で行う   UTF-8で指定した例

$ cat morning.py #!/usr/bin/env python # -*- coding: utf-8 -*- print u‘おはよう日本’ $ ./morning.py おはよう日本

Page 14: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター

PYTHONでの文字列と文字エンコーディング

 文字列の演算  部分文字列の取得  多倍長言語とUnicode型

Page 15: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター

文字列の扱い

 文字列は,’ か “ で囲う.どちらでも構わない   どちらも同じ意味となる

 文字列中に,” や ‘ を使いたい場合は,エスケープシーケンスの\を使う   \”は’,\”は”,\n は改行,\tはタブ,\\は\となる

“Hello World!” ‘Hello World!’

>>> print “Hello \”World!\”” Hello “World!” >>> print ‘Hello\\World!’ Hello\World! >>> print ‘Hello\nWorld!’ Hello World

Page 16: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター

文字列の演算

 文字列の結合は + で行う

 繰り返しは * で行う

 文字列長はlen()で取得

>>> ‘Hello’ + ‘World!’ ‘HelloWorld!’

>>> ‘Hello’ * 5 'HelloHelloHelloHelloHello'

>>> len(‘Hello’) 5

Page 17: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター

部分文字列の取得

 部分文字列の取得は,[]演算子で行う   先頭の文字は0文字目となる   :で範囲を指定可能

  -1 で一番最後の文字,-2で最後から二番目の文字・・・ というようになる

>>> word = ‘Hello’ >>> word[1] # 1文字目 ‘e’ >>> word[1:4] # 1文字目から3文字目 ‘ell’ >>> word[:3] # 0文字目から2文字目 ‘hel’ # 範囲指定の左辺の省略は先頭を意味 >>> word[1:] # 1文字目以降 ‘ello’ # 範囲指定の右辺の省略は最後尾を意味 >>> word[:-2] # 先頭から,最後からの3文字目まで ‘hel’

Page 18: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター

UNICODEの扱い  Python 2.x では文字列はバイト単位で扱われる

  文字列はバイト単位で扱う str 型となる   日本語などの多バイト言語は unicode 型となる.u’hello’ と先頭に u を付けると unicode 型となる   type関数で型を確認してみる

  str 型と unicode 型の違い

>>> type('hello') <type 'str'> >>> type(u'こんにちは') <type 'unicode'>

>>> ‘こんにちは’[0] # 1バイト単位で扱われる '\xe3' >>> u‘こんにちは’[0] # 1文字単位で扱われる u'\u3053’ >>> len('こんにちは') 15 # 15バイト >>> len(u'こんにちは') 5 # 5文字

Page 19: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター

UNICODE IN PYTHON 3.X

 Python 3.x の文字列は,全てUnicodeとなる   バイト単位で扱う型とリテラル

  str 型(2.x)  bytes 型 (3.x)   ‘hello’ b’hello’   Python 2.6 以降は,前方互換性のめに,b’hello’ という表記も可能

  Unicode文字で扱う型とリテラル   unicode 型(2.x) str 型 (3.x)   u’hello’ ‘hello’

Page 20: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター

UNICODE型とSTRの変換

 unicode型をバイト列に変換するには,encode() メソッドを利用   引数に変換する文字エンコードを指定

 バイト列からunicode型に変換するには,unicode() 関数を利用   第一引数に変換するバイト列,第二引数にバイト列の文字エンコードを指定

>>> u‘こんにちは’.encode(‘utf-8’) # UTF-8に変換 '\xe3\x81\x93\xe3\x82\x93\xe3\x81\xab\xe3\x81\xa1\xe3\x81\xaf’ >>> u‘こんにちは’.encode(‘sjis’) # Shift-JISに変換 '\x82\xb1\x82\xf1\x82\xc9\x82\xbf\x82\xcd'

>>> unicode('\x82\xb1\x82\xf1\x82\xc9\x82\xbf\x82\xcd', 'sjis') u'\u3053\u3093\u306b\u3061\u306f' >>> print unicode('\x82\xb1\x82\xf1\x82\xc9\x82\xbf\x82\xcd', 'sjis') こんにちは

Page 21: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター

PYTHONの型,データ構造

  list型   deque型   set型   tuple型   dict型

Page 22: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター

LIST 型

 C言語での配列に近いデータ構造   リストの定義は [] で行う

  []演算子で,要素にアクセス

  [:]でリストの一部分を取得

>>> foo = ['apple', 'orange', 100, 200] >>> foo ['apple', 'orange', 100, 200]

>>> foo[2] 100

>>> foo[1:3] ['orange', 100] >>> foo[:2] ['apple', 'orange']

Page 23: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター

LISTの演算

 リスト同士の結合は + で行う

 リストの要素への代入も可能

>>> foo = ['apple', 'orange', 100, 200] >>> foo + ['banana', 500] ['apple', 'orange', 100, 200, 'banana', 500]

>>> foo ['apple', 'orange', 100, 200, 'banana', 500] >>> foo[1] = 'cherry' >>> foo ['apple', 'cherry', 100, 200, 'banana', 500] >>> foo[2:3] = [300, 400] >>> foo ['apple', 'cherry', 300, 400, 200, 'banana', 500]

Page 24: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター

LIST 型のメソッドによるリスト操作  様々なリスト操作の方法

>>> a = [66.25, 333, 333, 1, 1234.5] >>> print a.count(333), a.count(66.25) # 値の数を数える 2 1 >>> a.insert(2, -1) # 2番目に-1を挿入 >>> a [66.25, 333, -1, 333, 1, 1234.5] >>> a.index(333) # 333が初めに登場する位置を調べる 1 >>> a.remove(333) # 初めに登場する333を要素から削除 >>> a [66.25, -1, 333, 1, 1234.5] >>> a.reverse() # 逆順に並べ替える >>> a [1234.5, 1, 333, -1, 66.25] >>> a.sort() # ソートする >>> a [-1, 1, 66.25, 333, 1234.5] >>> len(a) # リストの長さを取得 5

Page 25: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター

LISTを用いたスタック

  appendとpopを用いるとスタックが実現可能 >>> stack = [3, 4, 5] >>> stack.append(6) # 最後尾に6を追加 >>> stack.append(7) # 最後尾に7を追加 >>> stack [3, 4, 5, 6, 7] >>> stack.pop() # 最後尾の値を取り出す 7 >>> stack [3, 4, 5, 6] >>> stack.pop() 6 >>> stack.pop() 5 >>> stack [3, 4]

Page 26: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター

DEQUE 型

 キューは効率化のためdeque型を利用 >>> import collections # collectionsモジュールを読み込み >>> queue = collections.deque([1, 2, 3]) # キューを初期化 >>> queue deque([1, 2, 3]) >>> queue.append(4) # 最後尾に4を追加 >>> queue.append(5) # 最後尾に5を追加 >>> queue deque([1, 2, 3, 4, 5]) >>> queue.popleft() # 先頭の要素を取り除く >>> queue.popleft() >>> queue deque([3, 4, 5])

Page 27: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター

SET 型

 重複なしの非整列集合を定義可能な型   挿入・検索が高速に行える

>>> basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana’] >>> fruit = set(basket) # set型を作成 >>> fruit set(['orange', 'pear', 'apple', 'banana']) >>> ‘orange’ in fruit # ‘orange’が存在するかを True # 高速に検索 >>> 'crabgrass' in fruit False >>> fruit.add(‘peach’) # ‘peach’ を追加 >>> fruit set(['apple', 'banana', 'orange', 'peach', 'pear']) >>> fruit.remove(‘orange’) # ‘orange’ を削除 set(['apple', 'banana', 'peach', 'pear'])

Page 28: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター

TUPLE 型

  list 型と似ているが,tuple 型は要素が不変となる   データベースのレコード,座標を表すデータ構造など,長さなどが変化しないデータ列として利用

  tupleを用いると,複数のデータを一つに扱うことが可能.C言語の構造体に近い考え

>>> point = 10, 30 # tuple を作成 >>> point (10, 30) >>> point[0] # 0番目の要素を参照 10 >>> x, y = point # x, y にtupleの値を代入 >>> x 10 >>> y 30

Page 29: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター

DICT 型

 KeyとValueのペアを格納可能な型.辞書   Keyとして利用可能な型

 文字列  数値  文字列か数値のみからなるタプル

>>> fruit = {‘orange’: 100, ‘apple’: 200} # 辞書を作成 >>> fruit[‘orange’] # key ‘orange’ の値を取得 100 >>> fruit[‘orange’] = 300 # ‘orange’ の値を変更 >>> fruit {'orange': 300, 'apple': 200} >>> fruit[‘banana’] = 500 # 新たに ‘banana’ を追加 >>> fruit {'orange': 300, 'apple': 200, 'banana': 500} >>> del fruit[‘apple’] # ‘apple’を削除 >>> fruit {'orange': 300, 'banana': 500}

Page 30: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター

PYTHONの制御構文

 インデントベースのステートメントグルーピング   ifによる条件分岐   forを用いたループ

  リストの反復処理   辞書の反復処理   range()を用いた処理

  continueとbreak文   pass文

Page 31: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター

インデントベースのステートメントグルーピング

 Pythonではステートメントのグループングはインデントを基準に行う   インデントはスペース4つとなる   C言語とPythonの比較

  誰が書いても,似たような字下げスタイルになる   C言語の場合,K&Rスタイル,GNUスタイル,BSDスタイル,などなど様々な宗教がある

C言語の場合 if (a == b) { a = b * 2; printf(“%d\n”, a); }

Pythonの場合 if a == b: a = b * 2 print a

Page 32: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター

IF文

 C言語のif文とほぼ同じ

>>> x = 3 >>> if x < 0: ... print ‘x is less than zero’ ... elif x == 0: ... print ‘zero’ ... elif x == 1: ... print ‘single’ ... else ... print ‘more’ ... more

Page 33: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター

FOR文

  for文はC言語のforとかなり違うので注意  リストや文字列などのデータ列に対して反復する

>>> animal = [‘dog’, ‘cat’, ‘bird’] >>> for a in animal: # ループ毎にanimalの要素が順にaに代入される ... print a ... dog cat bird

Page 34: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター

FOR文によるDICTの操作

  dictのkeys()メソッドにより,Keyのリストを取得して行う

  iteritems()メソッドにより行う.3.x系の場合は,items()

>>> fruit = {'orange': 100, 'apple': 200, 'banana': 400} >>> for f in fruit.keys(): ... print f, ‘: ‘, fruit[f] ... orange : 100 apple : 200 banana : 400

>>> fruit = {'orange': 100, 'apple': 200, 'banana': 400} >>> for k, v in fruit.iteritems(): ... print k, ‘: ‘, v ... orange : 100 apple : 200 banana : 400

Page 35: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター

RANGE()関数

  range()関数を用いると,特定範囲を表すリストを作成可能

>>> range(10) # 0から9までのリストを作成 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> range(3, 10) # 3から9までのリストを作成 [3, 4, 5, 6, 7, 8, 9] >>> range(3, 20, 4) # 3から20までのリストを作成 [3, 7, 11, 15, 19] # ただし,ステップ幅は4となる

Page 36: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター

C言語的なインクリメントベースのFOR

  range()関数を用いて行う

 ただし,値が大きい場合はxrange()関数を用いる   xrange()関数は,リストを生成しないため効率的

>>> month = [‘April’, ‘May’, ‘June’, ‘July’] >>> for i in range(len(month)): ... print i, month[i] ... 0 April 1 May 2 June 3 July

Page 37: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター

CONTINUEとBREAK

 ループから抜けるためにはbreakを利用  ループの次の先頭に進むためにはcontinueを利用

>>> for n in range(2, 10): ... for x in range(2, n): ... if n % x == 0: ... print n, 'equals', x, '*', n/x ... break ... else: # C言語などと違い,for文にもelse文が使える ... # else以下は全てのリストが反復されなかった場合に実行される ... print n, 'is a prime number' ... 2 is a prime number 3 is a prime number 4 equals 2 * 2 5 is a prime number 6 equals 2 * 3 7 is a prime number 8 equals 2 * 4 9 equals 3 * 3

Page 38: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター

PASS文

  pass文は何もしない  インデントベースのため,必要になる時がある

>>> while is_func(): # is_func()が真になるまで繰り返し ... pass # ループの中は何もしない

Page 39: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター

PYTHONの関数

  defによる名前付き関数   デフォルト引数   キーワード引数   可変長引数   アンパック引数リスト

  lambda式による無名関数  関数の特殊化,カリー化,クロージャ

  特殊化:関数を引数によって特別扱いすること(C++から)   カリー化:

  2引数の関数f(x, y)に対して、「gがfのカリー化」だとは、 f(x, y) = g(x)(y) が常に成立すること

  クロージャ:無名関数の関数内定義(関数への変数参照)

 高階関数:関数を引数として受け取る関数 €

f : X ×Y →Z

g : X →(Y →Z)

Page 40: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター

関数定義

  def で定義  関数内で定義した変数は,関数内でのみ有効  返り値は,return で返す

>>> def twice(x): # defで,関数を定義 ... return x * 2 # return で返り値を設定 ... >>> twice(100) # 関数呼び出し 200 >>> twice(45) 90 >>> x # xのスコープはtwice関数内のみ Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name ‘x’ is not defined

Page 41: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター

デフォルト引数

 引数の値を予め指定しておくことが可能  デフォルト値を持つ引数は,引数の後ろに配置する必要がある(C言語と同じ)

>>> def n_times(x, n = 2): # n倍する関数を定義 ... return x * n ... >>> n_times(40) # nを指定しないと n = 2 となる 80 >>> n_times(40, 3) # nを指定した場合 120

Page 42: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター

キーワード引数

 引数名を指定して渡すことも可能  引数の順番を考えなくて良い

>>> def person(name, age): ... print 'name = ' + name ... print 'age = ' + str(age) ... >>> person(‘Alice’, 16) # 普通に呼び出し name = Alice age = 16 >>> person(age = 18, name = ‘Bob’) # 引数を指定して呼び出し name = Bob age = 18

Page 43: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター

可変長引数

 キーワードありの引数は ** で指定  キーワードなしの引数は * で指定

>>> def var_args(*args, **kargs): ... print args ... print kargs ... >>> var_args(1, 2, 3, 'foo', 'bar', name = 'Alice', age = 20) (1, 2, 3, ‘foo’, ‘bar’) # キーワードなしの引数 {‘age’: 20, ‘name’: ‘Alice’} # キーワードありの引数

Page 44: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター

アンパック引数リスト

 既に引数がリスト形式や,辞書形式で表されていた場合,* や,** を用いてそのまま渡すことが可能   リストの例

  辞書の場合

>>> range(2, 7) # 普通の呼び出し [2, 3, 4, 5, 6] >>> args = [2, 7] >>> range(*args) # リストのまま引数に渡した呼び出し [2, 3, 4, 5, 6]

>>> def n_times(x, n): ... return x * n ... >>> args = {'n': 100, 'x': 3} >>> n_times(**args) # 辞書のまま引数の渡した呼び出し 300

Page 45: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター

LAMBDA式

  lambda(ラムダ)式は無名関数を記述するために利用   n_times() 関数と等価なラムダ式

  lambdaは式なので,計算結果がそのまま返り値となる   defの場合は,関数なので,return で結果を返す必要がある

>>> f = lambda x, n: x * n >>> f(10, 4) 40

Page 46: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター

関数の特殊化,クロージャ  特殊化

  いくつかの引数を固定し,新たな関数を生成すること.カリー化と似た考え

 クロージャ   変数のスコープを,それが定義された箇所で解決する関数

 n倍する関数を特殊化した例 >>> def n_times_f(n): # n倍する関数を作成する高階関数 ... return lambda x: n_times(x, n) # nのスコープに注目 ... >>> f1 = n_times_f(2) # 2倍する関数を作成 >>> f1(10) 20 >>> f1(15) 30 >>> f2 = n_times_f(5) # 5倍する関数を作成 >>> f2(10) 50 >>> f2(15) 75

Page 47: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター

高階関数

 関数を返す関数  関数を引数に取る関数  ソート時に比較関数を引数に渡した例

  2変数(x, y)を引数に取り,大小比較する関数をsort()に渡す   x < y, x == y, x > y のときに,-1, 0, 1 と返す関数を渡すと昇順にソート可能

>>> people = [('Bob', 20), ('Carol', 15), ('Alice', 17)] >>> people [('Bob', 20), ('Carol', 15), ('Alice', 17)] >>> people.sort() # 何も指定しないと,タプルの第一要素が初めに比較に >>> people # 使われる [('Alice', 17), ('Bob', 20), ('Carol', 15)] >>> people.sort(lambda x, y: x[1] - y[1]) # 第二要素を比較に >>> people # 用いた例 [('Carol', 15), ('Alice', 17), ('Bob', 20)]

Page 48: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター

PYTHONの関数プログラミング

  filter  map   reduce  リスト内包表記

Page 49: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター

FILTER

 リストから特定条件を満たす値のみ取り出す   filter(func, list)

  funcがフィルタ用関数   listが対象となるリスト

  リストから2と3で割り切れる値を取り除く例 >>> def f(x): ... return x % 2 != 0 and x % 3 != 0 ... >>> filter(f, range(2, 25)) [5, 7, 11, 13, 17, 19, 23]

Page 50: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター

MAP

 リストの各要素に演算を施す   map(func, list)

  funcが演算用関数   listが対象となるリスト

  リストの全要素を3乗する例

>>> def cube(x): ... return x**3 # ** はべき乗の演算子 ... >>> map(cube, range(1, 11)) [1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]

Page 51: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター

REDUCE

  2要素ずつの処理を繰り返し行い,その結果を返す   reduce(func, list, init)

  funcは処理関数   listは対象となるリスト   initは初期値

  リストをフラットにする例 >>> reduce(lambda x, y: x + y, ... [[1, 2, 3], [4, 5], [6, 7, 8]], ... []) [1, 2, 3, 4, 5, 6, 7, 8]

[1, 2, 3] + [4, 5] step 1:

[1, 2, 3, 4, 5] + [6, 7, 8] step 2:

[1, 2, 3, 4, 5, 6, 7, 8] result:

[6, 7, 8] + []

Page 52: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター

リスト内包表記

 数学的な記法で集合の記述が可能   { x * x | x ∈ L} をリスト内包表記で書いた例

  { x * x | x * x > 20, x ∈ L} をリスト内包表記で書いた例

>>> [x * x for x in range(10)] [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

>>> [x * x for x in range(10) if x * x > 20] [25, 36, 49, 64, 81]

Page 53: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター

PYTHONのモジュール

 スクリプトファイルとモジュール   dir()関数によるモジュール内オブジェクトの確認  様々なインポート方法

Page 54: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター

スクリプトファイルとモジュール

 Pythonでは1つのスクリプトファイルを,1つのモジュールとみなす

 モジュールの例   my_echo.pyファイルを作成し,echo()関数を作成

  my_echoのecho関数を呼び出す

$ cat my_echo.py def echo(word): print word

$ python >>> import my_echo # モジュールをインポート >>> my_echo.echo(“Hello World!”) # モジュール内の関数を呼び出し Hello World!

Page 55: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター

授業まとめ

Page 56: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター

スケジュール / SCHEDULE

1. 2011/06/07(Tue): プログラミングの基礎 / Basic of Programming

2. 2011/06/09(Thu): 基本データ構造 / Fundamental data structures

3. 2011/06/14(Tue): メモリ管理1 / Memory Management 1

4. 2011/06/16(Thu): メモリ管理2 / Memory Management 2

5. 2011/06/21(Tue): デバッグ / Debugging

6. 2011/06/23(Thu): ソフトウェア開発環境1 / Software Development Env. 1

7. 2011/06/28(Tue): ソフトウェア開発環境2 / Software Development Env. 2

8. 2011/06/30(Thu): 木 / Data Structure : Tree

  9. 2011/07/05(Tue): ハッシュ / Data Structure: Hash

  10. 2011/07/07(Thu): プログラム理解1 / Understanding Programs 1

  11. 2011/07/12(Tue): プログラム理解2 / Understanding Programs 2

  12. 2011/07/14(Thu): スクリプト言語1 / Script Language 1

  13. 2011/07/19(Tue): スクリプト言語2 / Script Language 2

  14. 2011/07/21(Thu): その他の言語 / Other Languages

  15. 2011/07/26(Tue): 試験 / Examination

Page 57: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター

課題(自由課題) / FINAL REPORT

  自由課題 free topic

 提出: The deadline: 7/26(Tue)   Submit

  the source code, and the report.   by e-mail: [email protected] by 7/26(Tue) 23:59.

  例)   サウンドファイルの変換プログラム / Sound file converter   ウェブクローラー / web crawler   カレンダープログラム(CalDAVコマンド群) calendar program   新しいシェル・エディタ・ウィンドウマネージャー new shell, editor, window

manager   圧縮解凍・暗号化アルゴリズム、rsyncの実装 encrypt/decrypt, rsync   形態素解析を利用した人工無能プログラム markov-chain program

  レポートには高度な考察・議論を。The final report must have deep consideration