1.2K Views
March 10, 25
スライド概要
- Python の歴史と位置づけ
- Python の基本
- Python のプログラム構造
- Python のエコシステム
- Python と生成AI
機械学習や音声認識に関する書籍を執筆しています。
プログラミング 新 作法 これからプログラムを書く のために ~ 8. Python: スクリプト言語からエコシステムへ の歴史と位置づけ Python の基本 Python のプログラム構造 Python のエコシステム Python と生成AI 人 〉 〈 ~ Python 1
8.1 Python の歴史 の歴史と位置づけ Python ヴァンロッサム⽒がPython 0.90 のソースコードを公開 ‧オブジェクト指向 ‧簡潔性を重視 Scipy 3.x Hugging Face をネイティブに Unicode async/await データクラス 1.x 関数型の機能を 取り込む 1991 1994 2.x 利⽤可 ガベージコレクション Unicode 2000 2008 サポート終了 2020 2
8.1 Python の歴史と位置づけ の特徴 コンパイルが不要なスクリプト言語 インデントでブロックを表現 動的型付け 関数のデフォルト引数機能 充実したライブラリ Python 3
8.2 Python の基本 変数 慣習として変数名には小文字のみを用い,複数単語からなる場合はアンダー バーで単語をつなぐ(いわゆるスネークケース) 型 数値型:int(整数), float(浮動小数点数), complex(複素数) 文字列・リスト・関数・オブジェクトなども変数の値にできる 文字列は二重引用符 " または 一重引用符 ' で囲む 代入される値によって型が自動的に決まる動的型付け言語なので,型の 宣言は不要 ポインタの機能はない 4
8.2 Python
の基本
演算
算術演算子,比較演算子はほぼC言語と同様
算術演算子 : +, -, *, /, //, %, **
比較演算子 : ==, !=, <, <=, >, >=
論理演算子の表記は and, or, not
例: a >= 1 and a <= 12
print() などの組み込み関数はライブラリの読み込みを行わずに利用できる
組み込み関数一覧 https://docs.python.org/3/library/functions.html
5
8.2 Python の基本 入出力 表示は組み込みの print() 関数,書式指定はフォーマット済み文字列リテ ラル(f文字列) f文字列 文字列リテラル中に変数名を {} で囲うことでその値を挿入できる 例: print(f'Your name is {name}.') デバッグには f'{変数名=}' で変数名と値が表示される キーボードからの値の読み込みは組み込みの input() 関数 文字列をプロンプトとして引数に与えることができる 返却値は文字列型なので,数値にするには int() などで型変換を行う 6
8.2 Python の基本 記憶・演算・入出力の例 定数の定義 # price = 150 ユーザ入力の取得 # amount = int(input("How many do you need?: ")) 合計金額の計算と表示 # total = price * amount print(f"Total: {total} yen") How many do you need?: 3 Total: 450 yen 7
8.2 Python の基本 データ構造と型 リスト 要素数が可変 要素の追加・削除やリスト同士の結合などのメソッドを持つ 各要素は同じ型でなくてもよい 特定の要素の取り出しは0から始まるインデックスを用いる リストへのアクセスの例 # num_list = [10, 20, 30, 40, 50] num_list[2] # 30 8
8.2 Python の基本 リストのスライス [先頭のインデックス : 終端のインデックス+1 : ステップ] でリストの一部を取り 出す 例) num_list[1:4] は [20, 30, 40] 負のインデックス -5 正のインデックス 0 -4 -3 -2 -1 1 2 3 4 num_list = [ 10, 20, 30, 40, 50 ] 正のスライス 負のスライス 0 1 2 3 4 -5 -4 -3 -2 -1 5 9
8.2 Python の基本 タプル カンマで区切られた要素を丸括弧で囲ったもの 要素は異なる型でもよい 要素へのアクセスはインデックスによって行える イミュータブルなので,要素の追加や変更はできない タプルの例 # min_and_index = (10, 'Masa') min_and_index[0] # 10 10
8.2 Python の基本 辞書 キーと値のペアで複数の要素をまとめる方法.辞書全体は中括弧で囲む 要素へはキーでアクセスする キーは文字列などのイミュータブルなオブジェクト 辞書自体は要素の追加・変更・削除ができるミュータブルなオブジェクト 辞書の例 # b = {'name': 'Tom Bean', 'age': 21, 'point':80} b['name'] # 'Tom Bean' 11
8.2 Python の基本 要素の型 リストの要素や,辞書のキー・値など,特定の型に限定しておいた方が安全 な場合がある 型ヒントを使うことで,関数の引数や戻り値の型を明示できる 型ヒントは引数名の後にコロン : で型を指定する 戻り値の型は -> で指定する 型ヒントは実行時には無視されるが,解析ツールによるチェックが可能 type IntList = list[int] def sum_list(a: IntList) -> int: return sum(a) 12
8.3 Python のプログラム構造 条件分岐 if 文 : if 条件式 : のあとに改行,次の行からブロックを記述 条件が成立しない場合の処理は else: で記述 条件を追加したい場合は elif: を使うと入れ子を避けられる match 文 : match 式 : のあとに改行,次の行から case を記述 式の値は整数型に限定されず,タプル・辞書・オブジェクトなども指定 可能 case 値: の後に改行して処理を記述する.値は式と比較するパターン case _: でデフォルトの処理を記述 13
8.3 Python のプログラム構造 繰り返し : for 文 for 変数名 in イテラブルオブジェクト : のあとに改行,次の行からブロックを 記述 イテラブルオブジェクトはリストやタプル,辞書,文字列などを指定 range() 関数を使って数値の範囲を指定することもできる 繰り返し対象のブロックを実行するときに,変数にイテラブルオブジェクト の要素が順に代入される 14
8.3 Python
のプログラム構造
平方根を求めるコード1
import sys
x = int(input('Enter integer: '))
if x <= 0:
print('Input error!')
sys.exit()
rnew = float(x)
for i in range(3):
r1 = rnew
r2 = x/r1
rnew = (r1 + r2)/2
print(f'{r2:7.5} < {rnew:7.5} < {r1:7.5}')
Enter integer: 3
1.0 <
2.0 <
1.5 <
1.75 <
1.7143 < 1.7321 <
3.0
2.0
1.75
15
8.3 Python
のプログラム構造
繰り返し部分を while 文に変更
...
rnew = float(x)
diff = rnew - x/rnew
while diff > 1.0E-3:
r1 = rnew
r2 = x/r1
rnew = (r1 + r2)/2
diff = abs(r1 - r2)
print(f'{r2:10.8} < {rnew:10.8} < {r1:10.8}')
Enter integer: 5
2.2360671 <
2.236068 <
2.2360689
16
8.3 Python のプログラム構造 エラーへの対処 : try-except エラー(例外)が起こりえるコードを try 以下のブロックで記述 例外の典型例 ゼロ除算 : ZeroDivisionError 変数の型変換エラー : ValueError ファイルのオープンエラー : FileNotFoundError そこで発生した例外に対して except 以下のブロックで対処 17
8.3 Python のプログラム構造 エラーへの対処を行うプログラムの例 import sys while True: x = input('Enter positive number: ') try: x = float(x) except ValueError: print(f'{x} ') continue except: print(' ') sys.exit() if x <= 0: print(f'{x} ') continue break print(x) は数値に変換できません. 予期せぬエラーです は正の数値ではありません. 18
8.3 Python 実行例 のプログラム構造 Enter positive number: -1 -1.0 Enter positive number: abc abc Enter positive number: 3 3.0 は正の数値ではありません. は数値に変換できません. 19
8.3 Python 関数 def のプログラム構造 関数名(引数1, 引数2,...): のあとに改行,次の行からブロックを記述 関数外部で定義されたグローバル変数は,関数内では参照のみ可能 変更可能にするためには global 宣言を行う 値を与えられた引数はデフォルト引数となり,呼び出し時に省略可能 ブロック内では return 文で返却値を返す 関数の呼び出しは関数名に続いて引数を与える 引数は位置引数とキーワード引数の両方を使える キーワード引数は引数名を指定して値を渡す 20
8.3 Python のプログラム構造 関数を用いたプログラムの例 import sys def input_number(): while True: x = input('Enter positive number: ') try: x = float(x) except ValueError: print(f'{x} ') continue except: print(' ') sys.exit() if x <= 0: print(f'{x} ') continue break return x は数値に変換できません. 予期せぬエラーです は正の数値ではありません. 21
8.3 Python
のプログラム構造
def square_root(x):
rnew = x
while True:
r1 = rnew
r2 = x/r1
rnew = (r1 + r2)/2
if r1 - r2 < 1.0E-6:
break
return rnew
x = input_number()
sq = square_root(x)
print(f'Square root of {x} is {sq}')
Enter positive number: 2
Square root of 2.0 is 1.414213562373095
22
8.3 Python のプログラム構造 デフォルト引数を持つ関数定義の例と呼び出し方 def square_root(x, eps=1.0E-6): rnew = x while True: r1 = rnew r2 = x/r1 rnew = (r1 + r2)/2 if r1 - r2 < eps: break return rnew square_root(2, 1.0E-2) square_root(2, eps=1.0E-2) square_root(2) # # # 仮引数の順に実引数を与える キーワード引数で実引数を与える デフォルト引数を使う 23
8.3 Python クラス class のプログラム構造 クラス名(親クラス): のあとに改行,次の行からブロックを記述 ブロック内は冒頭にコンストラクタを定義し,その後にメソッドを定義 冒頭部にはクラス変数を定義することもある コンストラクタ __init__ はインスタンス作成時に自動実行される インスタンス変数の初期化などを行う self はインスタンス自身で,定義するメソッドの最初の引数とする インスタンス変数や他のメソッドにアクセスするために使う メソッド呼び出し時には self は記述不要 クラス外の if __name__ == 'main': は,単独実行時のみ動作するコード 24
8.3 Python のプログラム構造 スタックをクラスとして定義する例 class MyStack(): def __init__(self, data): self.num_list = data def push(self, elem): self.num_list.append(elem) def pop(self): if self.is_empty() == True: return None else: x = self.num_list[-1] self.num_list = self.num_list[:-1] return x def is_empty(self): return self.num_list == [] def clear(self): self.num_list = [] 25
8.3 Python のプログラム構造 if __name__ == '__main__': st = MyStack([5, 2, 3]) print(st.pop()) print(st.pop()) st.push(8) st.push(9) print(st.pop()) print(st.pop()) print(st.pop()) print(st.pop()) 3 2 9 8 5 None 26
8.3 Python データクラス のプログラム構造 デコレータを付けて宣言する Java の Recod のように,コンストラクタや表示用のメソッドなどが自動生 成される frozen=True でイミュータブルなクラスになる @dataclass @dataclass(frozen=True) class HealthRecord(): name: str height: int weight: float 27
8.3 Python のプログラム構造 ミックスイン Python では多重継承が可能 クラス定義時に,継承する親クラスをカンマで区切って列挙する 複数のクラスを継承して機能を追加することができる 典型的なミックスインの例 ログの記録,JSONへのデータ変換,データベースへの保存など 28
8.3 Python のプログラム構造 ファイル入出力 open() でファイル名とモードを指定して,返却値でファイルオブジェクト を得る モードは 'r' が読み込み, 'w' が書き込み 内容の読み込みメソッドは read() (全体) または readline() (1行ずつ) 1行ずつ読むときは,ファイルオブジェクトに対して拡張 for 文を使う 例) for line in f: 書き込みメソッドは write() 処理が終われば, close() メソッドでファイルを閉じる with 文を使うと,ブロックを抜けるときに自動的にファイルを閉じる 29
8.3 Python のプログラム構造 ファイルからデータを読み込む例 from dataclasses import dataclass @dataclass(frozen=True) class Student(): score: int name: str def read_data(filename): with open(filename, 'r') as f: data = [] for line in f: score, name = line.split(',') data.append(Student(int(score), name.strip())) return data 30
8.3 Python のプログラム構造 data = read_data('data.csv') for d in data: print(f'name: {d.name:<9} score: {d.score}') name: Alice name: Bob name: Caroline name: David name: Eve score: 80 score: 65 score: 70 score: 93 score: 77 31
8.4 Python のエコシステム ライブラリ 数値計算 Numpy グラフ描画 matplotlib データ操作 pandas, Polars 科学計算 scipy 機械学習 scikit-learn 深層学習 Keras, Tensorflow, PyTorch 32
8.4 Python のエコシステム の科学技術計算ライブラリ Python 33
8.4 Python のエコシステム 機械学習ライブラリの事例 : scikit-learn 分析・識別・回帰などの多くのアルゴリズムを提供 使用するクラスの選択基準 Start データ数が50以上 YES クラスを予測 YES NO NO もっとデータを 集める ラベル付き データがある NO YES 識別:Naive Bayes, SVC, ... YES クラスタリング:KMeans, ... 密度ベース推定:MeanShift, ... クラス数が既知 NO YES 値を予測 NO 回帰:Lasso, Ensamble Regressors, ... 分析:PCA, Kernel Approximation, ... 34
8.4 Python のエコシステム を使った教師あり学習のコード例 scikit-learn from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score アヤメのデータの読み込み # iris = load_iris() X, y = iris.data, iris.target データを訓練用とテスト用に分割 # X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=3) 35
8.4 Python のエコシステム ロジスティック回帰モデルの学習 # model = LogisticRegression() model.fit(X_train, y_train) テストデータでの予測 # y_pred = model.predict(X_test) モデルの性能評価 # accuracy = accuracy_score(y_test, y_pred) print(f'Accuracy: {accuracy:.2f}') Accuracy: 0.98 36
8.4 Python のエコシステム 教師あり学習の手順 iris data f1 f2 f3 f4 class 5.1 3.5 1.4 0.2 setosa 4.9 3.0 1.4 0.2 setosa 5.7 2.8 4.1 1.3 versicolor 6.3 3.3 6.0 2.5 virginica 4.9 3.5 1.5 0.1 setosa 6.4 3.2 4.5 1.5 versicoior 7.6 3.0 6.6 2.1 virginica model 初期モデル fit(X_train, y_train) predict(X_test) 評価結果 model 学習済みモデル 37
8.4 Python のエコシステム Project Jupyter さまざまなプログラミング言語に対応したオープンソースソフトウェア・オ ープンスタンダード・サービスを開発することを目的として設立 JupyterLab 統合的な開発環境 Jupyter Notebook の作成・実行やターミナルでのコマンド実行, GitHub との連携機能など Jupyter Notebook ブラウザ上でコードの記述・実行・結果の表示を行う マークダウン記法による説明文の記述も可能 38
8.4 Python のエコシステム Jupyter Notebook 39
8.4 Python のエコシステム Google Colaboratory Jupyter notebook をオンラインで実行するサービス 40
8.5 Python と生成AI を利用した生成AIによる問題解決 例) OpenAI社の Advanced Data Analysis Python ファイルのアップロード ⽣成 プロンプト ユーザ 実⾏結果の表⽰∕ダウンロード Python サーバ コード 実⾏ LLM 41
8.5 Python と生成AI 生成AI において有効に活用できる Python のライブラリ python-pptx: PowerPoint ファイルを生成 例: 「python-pptx を使って,... のスライドを作成してください」 matplotlib.animation :グラフなどをアニメーションにしてMP4ファイルを生成 例: 「...のグラフをアニメーション表示し MP4で出力してください」 OpenCV, dlib など : 画像加工・顔抽出などの画像処理 42
8.6 まとめ は,比較的明示的に問題が設定でき,その実装のための効率の良い開発方 法の需要が高い分野において有用 データサイエンス・機械学習や web アプリケーションなど, Python はオブジェクト指向や関数型など,有用なプログラミングパラダイムを取 り入れながら発展してきた言語であるといえる Python 43