I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117...
Transcript of I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117...
![Page 1: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター](https://reader034.fdocument.pub/reader034/viewer/2022051723/5ab8f5a07f8b9ad5338d6fd1/html5/thumbnails/1.jpg)
I117 プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター Research Center for Advanced Computing Infrastructure (RCACI)
小原 泰弘 / Yasuhiro Ohara
![Page 2: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター](https://reader034.fdocument.pub/reader034/viewer/2022051723/5ab8f5a07f8b9ad5338d6fd1/html5/thumbnails/2.jpg)
スケジュール / 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 情報社会基盤研究センター](https://reader034.fdocument.pub/reader034/viewer/2022051723/5ab8f5a07f8b9ad5338d6fd1/html5/thumbnails/3.jpg)
課題(自由課題) / 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 情報社会基盤研究センター](https://reader034.fdocument.pub/reader034/viewer/2022051723/5ab8f5a07f8b9ad5338d6fd1/html5/thumbnails/4.jpg)
今日の目次 / TODAY'S INDEX
python
![Page 5: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター](https://reader034.fdocument.pub/reader034/viewer/2022051723/5ab8f5a07f8b9ad5338d6fd1/html5/thumbnails/5.jpg)
PYTHON
![Page 6: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター](https://reader034.fdocument.pub/reader034/viewer/2022051723/5ab8f5a07f8b9ad5338d6fd1/html5/thumbnails/6.jpg)
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 情報社会基盤研究センター](https://reader034.fdocument.pub/reader034/viewer/2022051723/5ab8f5a07f8b9ad5338d6fd1/html5/thumbnails/7.jpg)
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 情報社会基盤研究センター](https://reader034.fdocument.pub/reader034/viewer/2022051723/5ab8f5a07f8b9ad5338d6fd1/html5/thumbnails/8.jpg)
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 情報社会基盤研究センター](https://reader034.fdocument.pub/reader034/viewer/2022051723/5ab8f5a07f8b9ad5338d6fd1/html5/thumbnails/9.jpg)
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 情報社会基盤研究センター](https://reader034.fdocument.pub/reader034/viewer/2022051723/5ab8f5a07f8b9ad5338d6fd1/html5/thumbnails/10.jpg)
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 情報社会基盤研究センター](https://reader034.fdocument.pub/reader034/viewer/2022051723/5ab8f5a07f8b9ad5338d6fd1/html5/thumbnails/11.jpg)
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 情報社会基盤研究センター](https://reader034.fdocument.pub/reader034/viewer/2022051723/5ab8f5a07f8b9ad5338d6fd1/html5/thumbnails/12.jpg)
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 情報社会基盤研究センター](https://reader034.fdocument.pub/reader034/viewer/2022051723/5ab8f5a07f8b9ad5338d6fd1/html5/thumbnails/13.jpg)
スクリプトファイルの文字エンコーディング
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 情報社会基盤研究センター](https://reader034.fdocument.pub/reader034/viewer/2022051723/5ab8f5a07f8b9ad5338d6fd1/html5/thumbnails/14.jpg)
PYTHONでの文字列と文字エンコーディング
文字列の演算 部分文字列の取得 多倍長言語とUnicode型
![Page 15: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター](https://reader034.fdocument.pub/reader034/viewer/2022051723/5ab8f5a07f8b9ad5338d6fd1/html5/thumbnails/15.jpg)
文字列の扱い
文字列は,’ か “ で囲う.どちらでも構わない どちらも同じ意味となる
文字列中に,” や ‘ を使いたい場合は,エスケープシーケンスの\を使う \”は’,\”は”,\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 情報社会基盤研究センター](https://reader034.fdocument.pub/reader034/viewer/2022051723/5ab8f5a07f8b9ad5338d6fd1/html5/thumbnails/16.jpg)
文字列の演算
文字列の結合は + で行う
繰り返しは * で行う
文字列長はlen()で取得
>>> ‘Hello’ + ‘World!’ ‘HelloWorld!’
>>> ‘Hello’ * 5 'HelloHelloHelloHelloHello'
>>> len(‘Hello’) 5
![Page 17: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター](https://reader034.fdocument.pub/reader034/viewer/2022051723/5ab8f5a07f8b9ad5338d6fd1/html5/thumbnails/17.jpg)
部分文字列の取得
部分文字列の取得は,[]演算子で行う 先頭の文字は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 情報社会基盤研究センター](https://reader034.fdocument.pub/reader034/viewer/2022051723/5ab8f5a07f8b9ad5338d6fd1/html5/thumbnails/18.jpg)
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 情報社会基盤研究センター](https://reader034.fdocument.pub/reader034/viewer/2022051723/5ab8f5a07f8b9ad5338d6fd1/html5/thumbnails/19.jpg)
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 情報社会基盤研究センター](https://reader034.fdocument.pub/reader034/viewer/2022051723/5ab8f5a07f8b9ad5338d6fd1/html5/thumbnails/20.jpg)
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 情報社会基盤研究センター](https://reader034.fdocument.pub/reader034/viewer/2022051723/5ab8f5a07f8b9ad5338d6fd1/html5/thumbnails/21.jpg)
PYTHONの型,データ構造
list型 deque型 set型 tuple型 dict型
![Page 22: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター](https://reader034.fdocument.pub/reader034/viewer/2022051723/5ab8f5a07f8b9ad5338d6fd1/html5/thumbnails/22.jpg)
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 情報社会基盤研究センター](https://reader034.fdocument.pub/reader034/viewer/2022051723/5ab8f5a07f8b9ad5338d6fd1/html5/thumbnails/23.jpg)
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 情報社会基盤研究センター](https://reader034.fdocument.pub/reader034/viewer/2022051723/5ab8f5a07f8b9ad5338d6fd1/html5/thumbnails/24.jpg)
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 情報社会基盤研究センター](https://reader034.fdocument.pub/reader034/viewer/2022051723/5ab8f5a07f8b9ad5338d6fd1/html5/thumbnails/25.jpg)
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 情報社会基盤研究センター](https://reader034.fdocument.pub/reader034/viewer/2022051723/5ab8f5a07f8b9ad5338d6fd1/html5/thumbnails/26.jpg)
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 情報社会基盤研究センター](https://reader034.fdocument.pub/reader034/viewer/2022051723/5ab8f5a07f8b9ad5338d6fd1/html5/thumbnails/27.jpg)
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 情報社会基盤研究センター](https://reader034.fdocument.pub/reader034/viewer/2022051723/5ab8f5a07f8b9ad5338d6fd1/html5/thumbnails/28.jpg)
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 情報社会基盤研究センター](https://reader034.fdocument.pub/reader034/viewer/2022051723/5ab8f5a07f8b9ad5338d6fd1/html5/thumbnails/29.jpg)
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 情報社会基盤研究センター](https://reader034.fdocument.pub/reader034/viewer/2022051723/5ab8f5a07f8b9ad5338d6fd1/html5/thumbnails/30.jpg)
PYTHONの制御構文
インデントベースのステートメントグルーピング ifによる条件分岐 forを用いたループ
リストの反復処理 辞書の反復処理 range()を用いた処理
continueとbreak文 pass文
![Page 31: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター](https://reader034.fdocument.pub/reader034/viewer/2022051723/5ab8f5a07f8b9ad5338d6fd1/html5/thumbnails/31.jpg)
インデントベースのステートメントグルーピング
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 情報社会基盤研究センター](https://reader034.fdocument.pub/reader034/viewer/2022051723/5ab8f5a07f8b9ad5338d6fd1/html5/thumbnails/32.jpg)
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 情報社会基盤研究センター](https://reader034.fdocument.pub/reader034/viewer/2022051723/5ab8f5a07f8b9ad5338d6fd1/html5/thumbnails/33.jpg)
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 情報社会基盤研究センター](https://reader034.fdocument.pub/reader034/viewer/2022051723/5ab8f5a07f8b9ad5338d6fd1/html5/thumbnails/34.jpg)
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 情報社会基盤研究センター](https://reader034.fdocument.pub/reader034/viewer/2022051723/5ab8f5a07f8b9ad5338d6fd1/html5/thumbnails/35.jpg)
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 情報社会基盤研究センター](https://reader034.fdocument.pub/reader034/viewer/2022051723/5ab8f5a07f8b9ad5338d6fd1/html5/thumbnails/36.jpg)
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 情報社会基盤研究センター](https://reader034.fdocument.pub/reader034/viewer/2022051723/5ab8f5a07f8b9ad5338d6fd1/html5/thumbnails/37.jpg)
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 情報社会基盤研究センター](https://reader034.fdocument.pub/reader034/viewer/2022051723/5ab8f5a07f8b9ad5338d6fd1/html5/thumbnails/38.jpg)
PASS文
pass文は何もしない インデントベースのため,必要になる時がある
>>> while is_func(): # is_func()が真になるまで繰り返し ... pass # ループの中は何もしない
![Page 39: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター](https://reader034.fdocument.pub/reader034/viewer/2022051723/5ab8f5a07f8b9ad5338d6fd1/html5/thumbnails/39.jpg)
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 情報社会基盤研究センター](https://reader034.fdocument.pub/reader034/viewer/2022051723/5ab8f5a07f8b9ad5338d6fd1/html5/thumbnails/40.jpg)
関数定義
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 情報社会基盤研究センター](https://reader034.fdocument.pub/reader034/viewer/2022051723/5ab8f5a07f8b9ad5338d6fd1/html5/thumbnails/41.jpg)
デフォルト引数
引数の値を予め指定しておくことが可能 デフォルト値を持つ引数は,引数の後ろに配置する必要がある(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 情報社会基盤研究センター](https://reader034.fdocument.pub/reader034/viewer/2022051723/5ab8f5a07f8b9ad5338d6fd1/html5/thumbnails/42.jpg)
キーワード引数
引数名を指定して渡すことも可能 引数の順番を考えなくて良い
>>> 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 情報社会基盤研究センター](https://reader034.fdocument.pub/reader034/viewer/2022051723/5ab8f5a07f8b9ad5338d6fd1/html5/thumbnails/43.jpg)
可変長引数
キーワードありの引数は ** で指定 キーワードなしの引数は * で指定
>>> 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 情報社会基盤研究センター](https://reader034.fdocument.pub/reader034/viewer/2022051723/5ab8f5a07f8b9ad5338d6fd1/html5/thumbnails/44.jpg)
アンパック引数リスト
既に引数がリスト形式や,辞書形式で表されていた場合,* や,** を用いてそのまま渡すことが可能 リストの例
辞書の場合
>>> 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 情報社会基盤研究センター](https://reader034.fdocument.pub/reader034/viewer/2022051723/5ab8f5a07f8b9ad5338d6fd1/html5/thumbnails/45.jpg)
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 情報社会基盤研究センター](https://reader034.fdocument.pub/reader034/viewer/2022051723/5ab8f5a07f8b9ad5338d6fd1/html5/thumbnails/46.jpg)
関数の特殊化,クロージャ 特殊化
いくつかの引数を固定し,新たな関数を生成すること.カリー化と似た考え
クロージャ 変数のスコープを,それが定義された箇所で解決する関数
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 情報社会基盤研究センター](https://reader034.fdocument.pub/reader034/viewer/2022051723/5ab8f5a07f8b9ad5338d6fd1/html5/thumbnails/47.jpg)
高階関数
関数を返す関数 関数を引数に取る関数 ソート時に比較関数を引数に渡した例
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 情報社会基盤研究センター](https://reader034.fdocument.pub/reader034/viewer/2022051723/5ab8f5a07f8b9ad5338d6fd1/html5/thumbnails/48.jpg)
PYTHONの関数プログラミング
filter map reduce リスト内包表記
![Page 49: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター](https://reader034.fdocument.pub/reader034/viewer/2022051723/5ab8f5a07f8b9ad5338d6fd1/html5/thumbnails/49.jpg)
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 情報社会基盤研究センター](https://reader034.fdocument.pub/reader034/viewer/2022051723/5ab8f5a07f8b9ad5338d6fd1/html5/thumbnails/50.jpg)
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 情報社会基盤研究センター](https://reader034.fdocument.pub/reader034/viewer/2022051723/5ab8f5a07f8b9ad5338d6fd1/html5/thumbnails/51.jpg)
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 情報社会基盤研究センター](https://reader034.fdocument.pub/reader034/viewer/2022051723/5ab8f5a07f8b9ad5338d6fd1/html5/thumbnails/52.jpg)
リスト内包表記
数学的な記法で集合の記述が可能 { 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 情報社会基盤研究センター](https://reader034.fdocument.pub/reader034/viewer/2022051723/5ab8f5a07f8b9ad5338d6fd1/html5/thumbnails/53.jpg)
PYTHONのモジュール
スクリプトファイルとモジュール dir()関数によるモジュール内オブジェクトの確認 様々なインポート方法
![Page 54: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター](https://reader034.fdocument.pub/reader034/viewer/2022051723/5ab8f5a07f8b9ad5338d6fd1/html5/thumbnails/54.jpg)
スクリプトファイルとモジュール
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 情報社会基盤研究センター](https://reader034.fdocument.pub/reader034/viewer/2022051723/5ab8f5a07f8b9ad5338d6fd1/html5/thumbnails/55.jpg)
授業まとめ
![Page 56: I117 プログラミング演習II I117 PROGRAMMING …shinoda- プログラミング演習II I117 PROGRAMMING PRACTICE II その他の言語 OTHER LANGUAGES 情報社会基盤研究センター](https://reader034.fdocument.pub/reader034/viewer/2022051723/5ab8f5a07f8b9ad5338d6fd1/html5/thumbnails/56.jpg)
スケジュール / 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 情報社会基盤研究センター](https://reader034.fdocument.pub/reader034/viewer/2022051723/5ab8f5a07f8b9ad5338d6fd1/html5/thumbnails/57.jpg)
課題(自由課題) / 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