#author("2019-10-06T16:46:32+09:00","default:takataka","takataka") #author("2019-10-08T13:10:55+09:00","default:takataka","takataka") *応用プログラミング及び実習 2019年度 第4回 [#ex04] //&color(#ff0000){''工事中''}; #contents ** 今日の notebook [#c5575be4] は [[AProg/2019]] からたどってください. Notebook の扱いが分からないというひとはこちら: [[AProg/2019/ex01/Step1#step1_3]] **課題A (self) 期限: 授業当日11:45 [#kadaiA] 今日の notebook を開いてそこに記されたことを読んで&実行して学習しなさい. 完了したらチェックを受けなさい(notebookを開いたままにしておくこと). **課題B (self) 期限: 当日の授業終了まで [#kadaiB] **課題B (self) 期限: 当日の授業終了10分前まで [#kadaiB] [[04exB.ipynb>AProg:04exB.ipynb]] ([[04exB.html>AProg:04exB.html]]) 上記リンク先の Jupyter Notebook を開いてその指示にしたがいなさい. 完了したらチェックを受けなさい. **課題C (TA) 期限: 次回2講時開始直後 [#kadaiC] 次のことを全てやりなさい.IPython 使おう: [[AProg/PythonProgramming#ipython]] + 右のリンク先のファイルを ~/aprog20XY に保存しなさい.: [[zipdata>AProg:zipdata]] -- 自分のPC等でやりたい人向けの注意: このファイルは,文字コード UTF-8 /UNIX改行コードで作成されたテキストファイルです.Windows環境ではそれらを変換しないとうまく扱えないかもしれません.takataka に相談してください. + less コマンドを使ってファイル zipdata の内容を確認しなさい.less を終了するには 'q' + 以下の内容のファイル 04exC.py を作りなさい. #pre{{ #### AProg2019 第4回課題C ### 関数 readZIP() の定義 # 中身は一部知らないこともあるので,現時点では眺めてふーんって感じでよい def readZIP(fn): dZIP = {} # 空のディクショナリを作る with open(fn, "r") as f: # ファイル名 fn のファイルを読み込みモードで開く for line in f: # ファイルから1行ずつ読み込んでループ x, y = line.split() # 空白区切りで分割.1つ目を x に,残り(2つ目)を y に dZIP[x] = y # キー x, 値 y のペアを登録.x, y とも文字列 return dZIP # 引数にファイル名を指定して readZIP() を呼ぶ # 何を引数に指定するかは自分で考えよう.戻り値は郵便番号データのディクショナリ zip = readZIP( ) # ディクショナリに対する len() は,キーの数を返す print(len(zip), "件の郵便番号データを読み込みました") }} + 上記がエラーにならず実行できるようにするには,一箇所修正が必要である.コメントを参考に修正して動作確認しなさい. + IPython 上で 04exC.py を実行し,その後 IPython 上で以下をひとつずつ入力・実行して結果を確認しなさい. #pre{{ "0010010" in zip "9998525" in zip "5202123" in zip "1234567" in zip }} + このプログラムを実行すると,次のように郵便番号から住所を検索できるようにしなさい. #pre{{ 118014 件の郵便番号データを読み込みました 郵便番号を入力してください(負の数だったら終了): 1057219 1057219 東京都港区東新橋汐留メディアタワー(19階) 郵便番号を入力してください(負の数だったら終了): 1057220 1057220 東京都港区東新橋汐留メディアタワー(20階) 郵便番号を入力してください(負の数だったら終了): 0010010 0010010 北海道札幌市北区北十条西(1〜4丁目) 郵便番号を入力してください(負の数だったら終了): 9998525 9998525 山形県飽海郡遊佐町直世 郵便番号を入力してください(負の数だったら終了): 5202123 5202123 滋賀県大津市瀬田大江町 郵便番号を入力してください(負の数だったら終了): 1234567 見つかりません 郵便番号を入力してください(負の数だったら終了): -1 }} ヒント: -- 郵便番号の入力を繰り返す処理は,以下を参考にしたらよい. #pre{{ # 無限ループ while True: num = input("なんか入力よろ: ") print(num) }} -- 「負の数だったら終了」を実現するには,break文使ったらよいだろう(p.141).今回の notebook の論理演算の話もからんできます.たぶん. + プログラムの適当な場所で,ディクショナリに郵便番号が 1234567 で住所が「ほげおんち」という要素を追加する行を書き,実行して動作確認しなさい. **課題S (omake) [#kadaiS] //&color(#ff0000){工事中}; ''画像処理してみよう'' &ref(http://www-tlab.math.ryukoku.ac.jp/~takataka/course/AProg/blackuni3.png,nolink); + 上記の画像を手元に保存しなさい. + 次のプログラムを実行しなさい.ファイル名は 04exS.py としよう. #pre{{ import cv2 # OpenCV モジュール import numpy as np # NumPy # 画像の読み込み img = cv2.imread('blackuni3.png') if img is None: print('File Not Found') print(img.shape) # 正しく読み込めたら, img は NumPy の3次元配列になる(カラーの場合) # 画像を表示 cv2.imshow("hoge", img) cv2.waitKey(0) # 画像を表示したウィンドウ内で何かキーが押されるまで待つ # 画像を書き込み cv2.imwrite("hoge.png", img) }} + 上記の画像とは別の画像を使って実行してみよう. + 上記を書き換えて遊ぼう.ただし,次の処理を必ず行うこと.情報収集は「opencv python ほげ」でウェブ検索したりがよいだろう. -- 左右and/or上下反転 -- 色反転 -- 画像の大きさを変える -- 適当に上記のもの以外の何か面白い処理を追加 + (おまけのおまけ)ビデオカメラ付きのPCまたはウェブカメラを持ってるひとは,上記のプログラムを少し書き換えるだけで,カメラで画像を撮りながらリアルタイムで処理して遊ぶこともできます.やりたいひとは takataka に相談してください.