# coderunnnerについて - https://pouhon.net/vscode-excute/1636/ - ctrl alt n で実行する(手入力や右上の実行ボタンを押さなくても実行できる) <br> # 音楽ダウンロードアプリ - キーワードを入力すると、それに関連する曲が出てきてインストールできる機能 - 音楽のトップランキングの曲を取得できる <br> # 使っている内容 - pandas         データ分析 - numpy          計算系 - lambda         関数の表現を簡単にする - 内包表記         繰り返し処理簡単にする - map filter(高階関数)   内包表記の延長線上     - 日付型         日付(曜日の取得 何日から何日まで) 株の取得など 曜日や日付による相関が必要な場合に使う - json、yaml       設定ファイルなど  - 例外処理         問題を起こさないようにあらかじめ止める - スクレイピング      データ収集 - opencv         データ加工 - 正規表現         データから決まりで取得する - GUI処理        画面上に表示 <br> <br> # 時間について ## 時間がかかるもの - pandas          - numpy           - スクレイピング      - opencv          - __GUI処理__ <br> ## 少し時間がかかるもの(2時間前後) - 内包表記 1 [i for i in range(3)] - __正規表現__ 4 "aiu あいう aou"の中からa*uの文字列を取得 - __日付型__  5 "2010年から今日までの平日だけの日を取得" <br> ## 時間がかからないもの(30分程度) - lambda        2    - __json、yaml__      6 設定ファイル - __例外処理__       7      - __map filter(高階関数)__ 3 <br> <br> ## 1週で1時間少し1ヶ月程度 <br> <br> # どうしても - pandas - numpy - 内包表記 - lambda - __map filter(高階関数)__ <br> <br> # 本日行うこと - map filter(高階関数) - GUI処理(tkinter) <br> <br> # map, filterについて ## lambda式についての復習 ``` def func(x: int) -> int: return x + 2 func_ = lambda x: x + 2 print(func_(1)) # 3 ``` ## mapとは - listやnumpyなどfor文で回すことができるもの全てに対して、その中の要素全てに関数を適用する ## list型に対して行ってみる ``` pra_list = [i for i in range(10)] # 0から9のlist # 全ての要素に1を足す func = lambda x: x + 1 # mapの引数は関数と適応させたいもの pura_1 = map(func, pra_list) print(type(pura_1)) # <class 'map'> pura_1 = list(pura_1) print(pura_1) # 1から10のlist ``` ### まとめて行う ``` pra_list = [i for i in range(10)] # 0から9のlist pura_1 = list(map(lambda x: x + 1, pra_list)) print(pura_1) # 1から10のlist ``` ### ここまでのまとめ - mapを使うと全ての要素に対して関数の動作を行うことができる - list(map(関数, 適応させたいlist))で記述する(この覚え方だと不十分) - 最後にlist型にするのを忘れない - 関数は引数が1つで、lambdaを使うと便利(引数が複数ある場合は後ほど説明) <br> ### ndarrayに行ってみる ``` import numpy as np pra_array = np.arange(10) # 0から9のnumpy_array pura_1 = list(map(lambda x: x + 1, pra_array)) print(pura_1) ``` ### 集合型に変換してみる ``` pra_list = [i for i in range(10)] # 0から9のlist pura_1 = set(map(lambda x: x * 0, pra_list)) print(pura_1) # 0の集合 ``` ## ここまでのまとめ - list(map(関数, for文で回るもの(list, ndarray, pandas.Series(dfの一行) )))で記述する - listの部分はsetを用いることで集合型で表現することができる <br> ## 練習問題 - pra_list = ["1", "1", "2", "3", "5", "8"] - これらを int型の配列に変換しよう ``` pra_list = ["1", "1", "2", "3", "5", "8"] pra_list = list(map(lambda x: int(x), pra_list)) print(pra_list) ``` int(x)が引数1つの関数と捉えることで ``` pra_list = ["1", "1", "2", "3", "5", "8"] pra_list = list(map(int, pra_list)) print(pra_list) ``` strやabs(絶対値を求める)についても同じことができる ## 引数が複数ある関数に対して行う場合 ``` pra_list_1 = [i for i in range(10)] pra_list_2 = pra_list_1.copy() # 0から9のlist result = list(map(lambda x, y: x + y, pra_list_1, pra_list_2)) print(result) # [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] ``` ## ここまでのまとめ - 引数が複数ある場合はzipのような動き <br> # mapのまとめ - mapを使うと全ての要素に対して関数の動作を行うことができる - list(map(関数, for文で回るもの(list, numpy.array, pandas.Series(dfの一行) )))で記述する - listの部分はsetを用いることで集合型で表現することができる - 引数が複数ある場合はzipのような動き <br> ## 補足 - 引数が複数あり、固定させたい場合はfunctools.partialを用いる - 入力値(整数)xをlist_y全てに足した新しい配列を作成 <br> <br> ## filterについて - listやnumpyarrayなどから条件に適する要素を取り出す - list yから3の倍数だけ取得したい https://www.youtube.com/watch?v=64xmy9_FtoM ``` a_list = [i for i in range(9)] multiple_three = list(filter(lambda x: x % 3 == 0, a_list)) print(multiple_three) # [0, 3, 6] ``` <br> <br> <br> # tkinterについて(画面) - tkinterはデスクトップアプリ(デスクトップ上のアプリ) - flaskなどを用いたものがwebアプリ(web上で動くアプリ) <br> ## 今日の目標 - 空の画面を作成することができるようにする - 画面上にボタンを配置実行することができるようにする - テキストボックスの利用 - その他に便利なもの <br> <br> # 空の画面を作成しよう ``` import tkinter # ウィジェット(画面の土台)を作製 root = tkinter.Tk() root.title("勉強会練習") # 画面サイズの示す x方向の長さx(エクス)縦の長さ+左上の場所のx座標+左上のy座標 root.geometry("100x200+500+500") # ボタンなどの情報はここに書く # イベント処理が起きるまで待機する root.mainloop() ``` <br> ``` import tkinter # ウィジェット(画面の土台)を作製 root = tkinter.Tk() root.title("勉強会練習") # 画面サイズの示す x方向の長さx(エクス)縦の長さ+左上の場所のx座標+左上のy座標 root.geometry("100x200+500+500") # ボタンなどの情報はここに書く # イベント処理が起きるまで待機する root.mainloop() # 画面の終了後に表示される print("終了しました") ``` <br> ## ここまでのまとめ - 画面の作成方法 1. 土台の作成を行う 2. 画面の内容を書く 3. mainloopする - 画面が閉じられるまでmainloop内からぬけない <br> <br> # 画面上にボタンを配置しよう - フレームを作成する - フレームとは - 同じようなボタンをひとまとまりにする - スマホの表示画面でも同じようなものはひとまとまりにする(ゲームの分類、ニュースの分類など)ゲームの分類は1ページ目に置こうというように場所を決める。 - ひとまとまりにしておくと Aのまとまりは画面の左端、Bは右端に置こう <br> ## フレームを作成する(selfがフレームになる) ``` class Applicatation(tkinter.Frame): # rootはウィジェット(画面の土台)を渡す def __init__(self, root= None): # widthは横幅 heightは縦幅 boardwidthは境界線の太さ relief 境界線の種類 super().__init__(root, width = 200, height = 100, borderwidth = 4, relief = 'groove', background="red") self.root = root # 配置する self.pack() # self.place(x = 100, y = 100) # フレームの中身に合わせてサイズを自動調整しないようにする self.pack_propagate(0) # ウィジェット(画面の土台)を作製 root = tkinter.Tk() # 画面サイズの示す x方向の長さx(エクス)縦の長さ+左上の場所のx座標+左上のy座標 root.geometry("1000x1000") content = Applicatation(root) root.mainloop() ``` <br> ### 内容 - スマホの画面全体(ウィジェット)がroot - その中の小さな区切り(フレーム)が selfになる - 配置について - pack 指定した方向から順番においていく(上下左右から) - place 座標を指定して配置する <br> <br> ## ボタンを作製しよう ``` import tkinter # フレームを作成する(selfがフレームになる) class Applicatation(tkinter.Frame): # rootはウィジェット(画面の土台)を渡す def __init__(self, root= None): # widthは横幅 heightは縦幅 boardwidthは境界線の太さ relief 境界線の種類 super().__init__(root, width = 200, height = 100, borderwidth = 4, relief = 'groove', background="red") self.root = root self.pack() self.pack_propagate(0) self.create_button() def create_button(self): # ボタンを作製する 引数配置する場所 文章 実行する関数 quit_button = tkinter.Button(self, text = "close", command= self.close) # 配置する quit_button.pack() def close(self): # ウィジェットを削除する self.root.destroy() # ウィジェット(画面の土台)を作製 root = tkinter.Tk() # 画面サイズの示す x方向の長さx(エクス)縦の長さ+左上の場所のx座標+左上のy座標 root.geometry("1000x1000") content = Applicatation(root) root.mainloop() ``` <br> ### 内容 - スマホの画面全体がウィジェットでそれを削除するからroot.destroy() <br> ## 引数付きの関数を実行しよう ## 誤った例 ``` import tkinter # フレームを作成する(selfがフレームになる) class Applicatation(tkinter.Frame): # rootはウィジェット(画面の土台)を渡す def __init__(self, root= None): # widthは横幅 heightは縦幅 boardwidthは境界線の太さ relief 境界線の種類 super().__init__(root, width = 200, height = 100, borderwidth = 4, relief = 'groove', background="red") self.root = root self.pack() self.pack_propagate(0) self.create_button() self.create_button_2() def create_button(self): # ボタンを作製する 引数配置する場所 文章 実行する関数 quit_button = tkinter.Button(self, text = "close", command= self.close) # 配置する quit_button.pack() def close(self): # ウィジェットを削除する self.root.destroy() def create_button_2(self): print_text_button = tkinter.Button(self, text = "文章表示", command= self.print_text(text = "lambdaを使う")) # 配置する print_text_button.pack() def print_text(self, text: str): label = tkinter.Label(self.root, text=f"引数があるときは{text}") label.pack() # ウィジェット(画面の土台)を作製 root = tkinter.Tk() # 画面サイズの示す x方向の長さx(エクス)縦の長さ+左上の場所のx座標+左上のy座標 root.geometry("1000x1000") content = Applicatation(root) root.mainloop() ``` ## 正しい例題 ``` import tkinter # フレームを作成する(selfがフレームになる) class Applicatation(tkinter.Frame): # rootはウィジェット(画面の土台)を渡す def __init__(self, root= None): # widthは横幅 heightは縦幅 boardwidthは境界線の太さ relief 境界線の種類 super().__init__(root, width = 200, height = 100, borderwidth = 4, relief = 'groove', background="red") self.root = root self.pack() self.pack_propagate(0) self.create_button() self.create_button_2() def create_button(self): # ボタンを作製する 引数配置する場所 文章 実行する関数 quit_button = tkinter.Button(self, text = "close", command= self.close) # 配置する quit_button.pack() def close(self): # ウィジェットを削除する self.root.destroy() def create_button_2(self): print_text_button = tkinter.Button(self, text = "文章表示", command= lambda: self.print_text(text = "lambdaを使う")) # 配置する print_text_button.pack() def print_text(self, text: str): label = tkinter.Label(self.root, text=f"引数があるときは{text}") label.pack() # ウィジェット(画面の土台)を作製 root = tkinter.Tk() # 画面サイズの示す x方向の長さx(エクス)縦の長さ+左上の場所のx座標+左上のy座標 root.geometry("1000x1000") content = Applicatation(root) root.mainloop() ``` <br> ## ここまでのまとめ - ウィジェットが土台でスマホの画面全体 root - フレームはスマホのアプリをひとまとめにした部分 classのselfの部分 - 関数に引数があるときはlambda(関数で渡す) - ボタンや文章を表示(配置するときはウィジェットに表示したいのかフレームに表示したいのかを考える) <br> <br> # テキストボックスの利用 ``` import tkinter class Applicatation(tkinter.Frame): # rootはウィジェット(画面の土台)を渡す def __init__(self, root= None): # widthは横幅 heightは縦幅 boardwidthは境界線の太さ relief 境界線の種類 super().__init__(root, width = 200, height = 100, borderwidth = 4, relief = 'groove', background="red") self.root = root self.pack() self.pack_propagate(0) # テキストボックスを入力できるようにする self.create_text_box() # 記述された内容を読み取り self.create_button() def create_text_box(self): lbl = tkinter.Label(self.root, text='数値') lbl.place(x=30, y=70) # テキストボックス self.txt = tkinter.Entry(self.root, width=20) self.txt.place(x=90, y=70) def create_button(self): # ボタンを作製する 引数配置する場所 文章 実行する関数 quit_button = tkinter.Button(self, text = "get_content", command= self.read) # 配置する quit_button.pack() def read(self): content = self.txt.get() print(f"読み取った型は{type(content)}") print(f"読み取った内容は{content}") self.root.destroy() # ウィジェット(画面の土台)を作製 root = tkinter.Tk() # 画面サイズの示す x方向の長さx(エクス)縦の長さ+左上の場所のx座標+左上のy座標 root.geometry("1000x1000") content = Applicatation(root) root.mainloop() ``` <br> ## ここまでのまとめ - テキストボックスを使うにはtkinter.Entryを用いる - テキストボックスは読み取るとstr型になる