# 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型になる