cs-12. 式の抽象化と関数,モジュール,算法(アルゴリズム)

110 Views

December 17, 21

スライド概要

コンピューターサイエンス
URL: https://www.kkaneko.jp/cc/cs/index.html

profile-image

金子邦彦(かねこくにひこ) 福山大学・工学部・教授 ホームページ: https://www.kkaneko.jp/index.html 金子邦彦 YouTube チャンネル: https://youtube.com/user/kunihikokaneko

シェア

埋め込む »CMSなどでJSが使えない場合

各ページのテキスト
1.

cs-12. 式の抽象化と関数,モジュー ル,算法(アルゴリズム) (コンピューターサイエンス) URL: https://www.kkaneko.jp/cc/cs/index.html 金子邦彦 1

2.

第12回の内容 1. 式の抽象化,関数 2. モジュール 3. 算法(アルゴリズム) 2

3.

12-2 式の抽象化と関数 (コンピューターサイエンス) URL: https://www.kkaneko.jp/cc/cs/index.html 金子邦彦 3

4.

変数と式 • 値が変化するオブジェクトのことを変数 という • 式の実行結果として,値が得られる 4

5.

問いかけ • プログラミングでの根本問題は 何でしょうか? • プログラミングの一番の基礎は 何でしょうか? 5

6.

式の抽象化 100 * 1.1 150 * 1.1 400 * 1.1 類似した複数の式 a * 1.1 変数 a を使って,複数 の式を1つにまとめる (抽象化) 6

7.

式の抽象化と関数 100 * 1.1 a * 1.1 150 * 1.1 400 * 1.1 類似した複数の式 変数 a を使って,複数 の式を1つにまとめる (抽象化) 式「a * 1.1」を含む 関数 foo を定義 関数 foo を使用. 100, 150, 400 は引数 7

8.

関数 • この関数の本体は 「return a * 1.1」 • この関数は,式「a * 1.1」に,名前 foo を付 けたものと考えることもできる 8

9.

式の抽象化と関数 抽象化前 類似した複数の式 実行結果 抽象化後 関数の定義と使用 同じ 実行結果になる 9

10.

• プログラミングでの根本問題は 何でしょうか? 誤り(バグ)の無いプログラムの 作成 私の意見 • プログラミングの一番の基礎は 何でしょうか? • 抽象化を行うこと. • 抽象化により,繰り返し同じこ とを書くことが減り,バグを防 げる. • プログラムの変更(消費税率 10%変更)も簡単に. 10

11.

12-3 関数の実行 (コンピューターサイエンス) URL: https://www.kkaneko.jp/cc/cs/index.html 金子邦彦 11

12.

例題 式 100 * 1.1 150 * 1.1 変数を含む式 a * 1.1 関数 def foo(a): return(a * 1.1) 400 * 1.1 12

13.

Python をビジュアルに体験,演習ができ るオンラインサービス ① ウェブブラウザで次の URL を開く Python Tutor http://www.pythontutor.com/ ② 「Visualize your code and get live help now」をクリック ③ 言語を選ぶ.この授業では Python 3.6 13

14.

「Visualize your code and live help now」を クリック 14

15.

「Python 3.6」になっている エディタ (プログラムを書き換えることができる) 実行のためのボタン 15

16.

次のプログラムを実行し,結果を確認 表示を確認 16

17.

問いかけ • 関数 では,変数が使用されるこ とがあります. • 「関数内で使用される変数 は, 関数の実行終了とともに,自動 で消える」は正しいですか? 17

18.

• 関数 foo では,変数 a が使用されています • 「関数内で使用される変数 a は,関数の実行終了 とともに,自動で消える」は正しいですか? 18

19.

次のプログラムを実行し,結果を確認 実行結果を確認 19

20.

・変数 p は残っている ・変数 a は自動的に消えている 20

21.

12-4 関数呼び出し (コンピューターサイエンス) URL: https://www.kkaneko.jp/cc/cs/index.html 金子邦彦 21

22.

関数呼び出し 呼び出し 呼び出され 関数foo 22

23.

ステップ実行 ステップ実行により、プログラム 実行の流れをビジュアルに観察 23

24.

今から行うこと • 関数呼び出しにおけるジャンプ • 関数内で使用される変数が消えるタイミング 24

25.

①「First」をクリックして,最初に戻す 25

26.

② 「Step 1 of 11」と表示されているので, 全部で,ステップ数は 11 あることが分かる (ステップ数と,プログラムの行数は違うもの) 26

27.

③ プログラム実行を最初に戻したので ・すべての変数は消えている ・赤い矢印は,先頭行に戻っている 27

28.

④ ステップ実行したいので,「Next」をクリック しながら,矢印の動きを確認. ※「Next」ボタンを何度か押し,それ以上進めなく なったら終了 見どころ foo との間で ジャンプするところ 28

29.

⑤ 終わったら,もう一度,「First」をクリッ クして,最初に戻す 29

30.

⑥ もう一度,ステップ実行. 「Next」をクリックしながら, ・赤の矢印の動きを確認. • 変数 a が現れるのは,どういうタイミングか? 関数 foo の実行中は, 変数 a が現れる 30

31.

⑦ 終わったら「Edit self code」をクリックして, 元の画面に戻る 31

32.

⑧ 次のように書き換えて,②から⑦と同じこと を繰り返す 32

33.

関数呼び出し 呼び出し 呼び出され 呼び出され 関数foo 関数bar 33

34.

式の抽象化 a * 100 * 1.1 1つの式に抽象化 5 * 100 * 1.1 12 * 100 * 1.1 類似した複数の式 a * 100 a * 1.1 2つの式に抽象化 できるという考え方も. この場合関数は2つ. 34

35.

関数呼び出し 呼び出し 呼び出され 関数foo 呼び出し 呼び出され 関数bar 35

36.

単価 100円で,税率 10% のときのプログラム例 変数 c は個数のつもり 5個は 550円 12個は 1320円 36

37.

全体まとめ • 式の抽象化とは,変数を使って,複数の式を1つ にまとめる • 関数の中でのみ使用される変数は,関数の終了と ともに自動で消える • 関数の評価値は return で返す 37

38.

プログラムの基礎 • プログラム中の誤り(バグ) ※ バグの発見を,すべて自動で行うことは困難 バグの無いプログラムを作るには,関数などの実践知識が役立つ.既 存のプログラムの活用を考えることも大事. • 性能,プログラムの見通しの良さ 算法(アルゴリズム)の工夫により,同じ問題をより簡単に,解くこ とができる • プログラムで解くことが難しい問題がある ※ プログラムで解こうと思っても,解くのに時間がかかりすぎる このことが暗号の基礎になっている 38

39.

12-5 Python モジュール, 標準ライブラリ (コンピューターサイエンス) URL: https://www.kkaneko.jp/cc/cs/index.html 金子邦彦 39

40.

Python のモジュール • Python のモジュールは、1つ以上の関数をまとめて,1つの ファイルにしたもの. この Python モジュールには, 関数 tax が入っている • Python のモジュールは単体でも実行できるように作るこ とができる.モジュールのテストを行いたときに便利 ※ (if __name__ == “__main__”: のところがミソ) 40

41.

Python のモジュールとインポート import コマンドでインポート モジュールの入ったファイル (ファイル名は hoge.py) 別のプログラム ・import hoge で,ファイル hoge.py をインポート ・hoge.tax は,ファイル hoge.py の中の 関数 tax という意味 その実行結果 41

42.

Python の標準ライブラリ • 公式ドキュメント https://docs.python.org/ja/3/library/index.html • 組み込み関数、組み込み定数、組み込み型、組み込み例外、 テキスト処理、バイナリデータ処理、データ型、数値と数 学、関数型プログラミング、ファイルとディレクトリ、 データの永続化、デー圧縮とアーカイブ、ファイルフォー マット、暗号、オペレーティングシステム、並列実行、コ ンテキスト変数、ネットワーク通信とプロセス間通信、イ ンターネット上のデータ操作、HTMLとXML、インター ネットプロトコルとサービス、マルチメディアサービス、 国際化、プログラムのフレームワーク、グラフィカルユー ザインタフェース、開発ツール、デバッグとプロファイル、 ソフトウエア・パッケージと配布、Pythonランタイムサー ビス、カスタム Python インタプリタ、モジュールのイン ポート、Python 言語サービス、各種サービス • 多くは「インポート」により取り込んで使用する 42

43.

モジュールをインポートするプログラムのイ メージ図 複数のモジュールをインポート モジュール math 自作の プログラム モジュール datetime 標準ライブラリ 内のモジュール モジュール optimize モジュール tensorflow モジュール keras 有志らが制作、 配布している モジュール など Python は、モジュールが豊富であることも、人気の理由 43

44.

12-6 算法(アルゴリズム) (コンピューターサイエンス) URL: https://www.kkaneko.jp/cc/cs/index.html 金子邦彦 44

45.

算法(アルゴリズム)の例 5×5×5×5×5×5×5×5×5×5×5×5×5× 5×5×5 は 152587890625 同じ 結果 掛け算: 15 回 掛け算: 4 回 算法(アルゴリズム)の工夫で、掛け算の回数を削減できる場合がある 45

46.

次の2つのプログラムは,同じ答えが出る. a=5*5 b=a*a c=b*b d=c*c print(d) print(5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5) 46

47.

次の2つのプログラムは,同じ答えが出る a = 10 * 10 b=a*a c=b*b print(c) print(10*10*10*10*10*10*10*10) 47

48.

暗号 エニグマ暗号作成機械 (Wikipedia より転載) 暗号解読機械 暗号の「コードブック」をすばやく探すための機 械「ボンベ」 →コンピュータの基礎に (Wikipedia に記載の「レプリカ」の写真を転載) 48

49.

ヒトゲノム・プロジェクト • 生物の「設計図」ともいわれるゲノム 塩基配列 • GenBankなどのウェブサイトで公開 • ゲノム塩基配列は,とても長い.細切れにした後で,装置で読 み取る. • 読み取った結果を(ジグソーパズルのように)つなぎあわせる とき,コンピュータが活躍 49

50.

暗号を作成する Python プログラム Diffie-Hellman法で暗号化(Pythonを使用) 参考ウェブページ http://nbviewer.jupyter.org/github/yoavram/CS1001.py/blob/master/recitation4.ipynb 50

51.

暗号を解読する Python プログラム Diffie-Hellman法の暗号を解読するプログラム 参考ウェブページ http://nbviewer.jupyter.org/github/yoavram/CS1001.py/blob/master/recitation4.ipynb 51

52.

暗号作成より,暗号解読の方が手間がかかる • 暗号解読の算法(アルゴリズム)は発見済み ということが多い → プログラムを作成可能 • しかし,プログラムが答えを出すまでに時間がかかる場合がある すでに,2012 年に,このようなレポートが. https://www.dit.co.jp/service/security/report/03.html 英大小文字+数字+記号を組み合わせた ZIP のパスワード 6桁の解読時間: 2分24秒 = 超危険 8桁の解読時間: 14日 = 危険 10桁の解読時間: 341年 52

53.

「計算可能性」 • 算法(アルゴリズム)の作成が不可能という問 題は,すでに発見済みである 人間にもコンピュータにも解けない問題 チューリングマシンの停止判定 53