<ここから> Chapter6 テキストの処理 > 323頁 6. 正規表現を扱う ─ re
<振り返り>
|
第1章 Pythonの特徴 |
・コンパイルが不要
・インタープリター ・インタープリタがモジュールを検索するバスをモジュール検索パスという ・インタープリタが検索する順番は「ビルトインモジュール」→「sys.path変数で得られるディレクトリ」 ・ビルトインモジュールとは組み込み関数のあるモジュールのこと。print()は組み込み関数で、正式には__builtins__.print() ・シンボリックリンクを置いてあるディレクトリはモジュール検索パスには入らない ・対話モードの終了方法には、関数の入力「quit()」によるものと、キー操作によるもの「ctrl + z」とがある ・「python -m timeit -h」を実行すると、timeitモジュールの詳細が出力さ ・対話モードでは、直前に評価した式が「_」に代入され、次の式で使用することができる 例 1 + 1; _ + 1
・処理のまとまりを表すとき、インデントを用いる
・Pythonという名の由来は英国BBCの番組「Monty Python's Flying Circus」にある
・他のプログラム言語で書かれたプログラムを使って機能拡張できる
・対話モード ・WindowsではコマンドプロンプトあるいはPowerShellで「python」と入力 ・macOSではTerminal.appで「python3」と入力 ・起動すると ・バージョン番号に続いてヘルプおよび著作権情報などを確認するためのコマンドが表示される ・一次プロンプトは「>>>」二次プロンプトは「...」 ・二次プロンプトが表示されるとき、インデントは自動挿入されない ・Windows環境ではPythonの環境変数PATHに設定されていないと対話モードが起動されない Pythonをインストールする際の「Add Python 3.x to PATH」にチェックを入れる 対話モードが起動しない場合はPythonの再インストールを行う
・文字コード ・ソースコードファイルはデフォルトではUTF-8でエンコードされたものとして扱う ・UTF-8以外の文字コードを使用するにはプログラムの先頭に以下を追加する。以下はshift_jisの場合 # -*- coding: shift_jis -*-
・多重代入 ・一度に複数の変数に値を代入する操作
Result 20 10
》補足
Result (100, 200) [100, 200]
Result 100 100 100
・コーディングスタイル ・可能であれがコメントは独立した行に書く ・ソースコードの幅が79文字を超えないように折り返す ・インデントにタブを使わず、空白4つをつかうことが推奨されている ・Pythonがプログラム言語として推奨しているスタイルガイドは通称「PEP8」と呼ばれる 名前は「Python Enhancement Proposalsの8番目」であることが由来
・文字列の記述 ・シングルクォート「'」、ダブルクォート「”」を使う ・関数やクラスの説明を書く際はトリプルクォート「'''」および「"""」を使う
・コメントの記述 ・ハッシュ文字「#」を使う
・入力履歴ファイル ・自動生成されるファイル ・ファイル名「.python_history」 ・ユーザーディレクトリーに作成される ・対話モードでカーソルキーの上下を押すと履歴として表示される
》補足 ・モジュール検索パス ・インタープリタはimportしたモジュールを以下の順番で探す。 ・ビルトインモジュール (インタープリタの組込モジュール) の中 ・sys.path 変数で得られるディレクトリのリスト ・sys.path は以下の場所で初期化されている。 ・入力スクリプトのあるディレクトリ ファイル名が指定されていない場合はカレントディレクトリ ・PYTHONPATH (ディレクトリ名のリスト) ・インストールごとのデフォルト ・シンボリックリンクを置いてあるディレクトリはモジュール検索パスに入らない。 ・sys.path は初期化後にプログラムから改変可能。 ・実行中のスクリプトのあるディレクトリは、検索パスの最初に置かれる。 ・検索順序は標準ライブラリのパスより前。 (注意)標準ライブラリのモジュールと同名のスクリプトを置くと、そちらが優先的にロードされてしまう。 |
Chapter2 コーディング規約 |
・PEP8 ・コードのレイアウト ・インデント ・スペース4つ ・関数定義の引数などのカッコ内部で改行した場合、縦に揃える ・辞書の要素は2行目スペース4つめから。閉じカッコは変数名に縦に揃える ・空行 ・トップレベルの関数やクラスの間は2行空ける ・クラス内のメソッドの定義は1行空ける ・import文 ・異なるモジュールはimport文を分ける ・次の順番でグループ化する(グループ間は1行空ける) 1.標準ライブラリ 2.サードパーティに関するもの 3.ローカルのライブラリ ・空白文字 ・代入演算子や比較演算子などの両側に1つ空白文字を入れる ・カンマの後ろに空白文字を入れる ・閉じカッコなど終わりを表す文字の前に空白文字を入れない ・コメント ・ブロックコメント ・コードと同じインデントで書く ・コメント自体は1つの#と1つの空白の後ろに書く ・インラインコメント ・コードとコメントの間に2つ以上のスペースを書く ・コメント自体は1つの#と1つの空白の後ろに書く ・docstring ・関数やメソッドの説明はdefの直後に書く ・"""で始まり、"""で終わる行とする ・概要の詳細の間に1行空ける ・命名規約 ・パッケージ、モジュール - 小文字のみ クラス - 単語の先頭を大文字 関数、変数、メソッド、インスタンス変数 - 小文字のみ。必要におうじてアンダースコアで区切る 定数 - 大文字のみ 例外 - クラスと同様 + 例外の名前の最後に "Error" をつけるべき ・PEP8のチェックツール Flake8 ・PEP8の整形ツール Black |
第2章 テキストと数の操作 |
・算術演算子の順序 ・優先順位:べき乗「**」、乗算/除算、加算/減算の順になる ・除算の結果は浮動小数点になる 例「100 - 5**2 + 5 / 5 」の結果は「76.0」になる ・相手が整数でも浮動小数点で算術すると結果も浮動小数点になる 例「10 % 2.0 」の結果は「0.0」になる ・// は切り捨て除算。商の少数部分を切り捨てて整数部分を求める ・% は剰余。剰余とは商のあまり ・「48 // 6 // 4」は左から演算が行われ演算結果は「48 // 6 = 8 → 8 // 4 = 2」 「2 ** 1 ** 3」は右から演算が行われ演算結果は「1 ** 3 = 1 → 2 ** 1 = 2」
・文字列リテラルの連結 ・文字列リテラルとはシングルクォートあるいはダブルクオートで囲まれた値を指す ・print('Py thon')を実行した結果からは間のスペースが除外されPythonと出力される ・複数行で記述する場合は () で囲んで改行しながら列挙する
Result Usage: -h help -v version
・改行文字 ・改行は\nで表され、1つの文字として扱われる。これを改行文字という ・トリプルクォート「"""」を使うとリテラル中の改行が改行文字として反映される
Result aaa bbb ccc dd
・len関数 ・文字列の長さを返す
・文字列のスライス ・スライスとは指定した範囲の文字列を切り取る操作 ・文字列 [ 開始位置 : 終了位置 ] ・スライスの位置 | a | b | c | d | e | f | g | 整数での指定の場合 0 1 2 3 4 5 6 7 負数での指定の場合 -7 -6 -5 -4 -3 -2 -1
》補足
・f文字列(フォーマット済み文字列リテラル) ※Python3.6で導入 ・f"文字列{値:書式指定文字列}" 例 price = 15000; print(f"価格:{price:7d}") ※07dで0埋めされる ・f文字列を使うことで文字列の中に式の値を入れられるようになる 例 a = 1; b = 1; print(f'{a + b}') ・式の後にフォーマット指定子のオプションを追加することで式の値にさまざまな書式を設定できる ・フォーマット指定子 b :値を2進数で出力する d :値を10進数で出力する x :値を16進数で出力する f :値を与えられた精度まで少数で出力(.5fで少数第5位で丸める) % :値を100倍しパーセント記号が付いた形式で出力
》補足
Result Hello alice. You are 30 years old.
Result 価格: 15000 価格:0015000 'hello '
・formatメソッド ※Python3.6以前の方法 ・"文字列{Field1}{Field2}{Field3}・・・".format(引数1, 引数2, 引数3) Field:フォーマットフィールド {インデックス:書式指定} ・記述方法には3種類ある ①フォーマットフィールドに引数のインデックスを記述 "spam: {0}, ham: {1}, eggs: {2}".format(x, y, z) ②空のフォーマットフィールドを使う。その場合は引数の値が順番に埋め込まれる "spam: {}, ham: {}, eggs: {}".format(x, y, z) ③フォーマットフィールドにキーワード引数を記述 "spam: {a}, ham: {b}, eggs: {c}".format(a=x, b=y, c=z) この場合、キーワード引数はa, b, c ※フォーマットフィールドに引数の変数名を直接記述することはできない
》補足
Result 数量:00100, 料金:015000.000
Result yyy yyy ababab
|
Chapter6 テキストの処理 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
・一般的な文字列操作 ・文字列のチェックメソッド
・文字列の変換を行う
・その他の文字列メソッド
・文字列定数
・f-string(フォーマット済み文字列リテラル) ・{変数名=}で「変数名=値」の形式で出力される
Result var='abc'
・フォーマットの指定方法 ・「:」の後ろに文字列変換のためのフォーマットを指定
・%演算子 ・「文字列 % 値」のように書く。文字列リテラル中の値を埋め込む場合には%で始まる変換指定子を書く
・正規表現 |
第3章 リストの操作 |
・リストはPythonで複数の値を扱うための基本的なデータ構造
・データの種類は、整数、浮動小数点、文字列など
・リストの構造 0 1 2 3 4 正のインデックス data = [ 1, 2, 3, 4, 5] 一つ一つが要素 -5 -4 -3 -2 -1 負のインデックス
・角括弧(かくかっこ)とカンマを使う ・文字列と同様にインデックスで要素を参照 ・文字列とは異なりインデックスで更新することが可能 ・先頭のインデックスは0を使用 ・末尾のインデックスは要素数-1
・リストのスライス範囲 ・[ 開始位置:終了位置 ] で記述 ・開始位置を省略すると先頭からになる ・終了位置を省略すると末尾までになる ・data[:] や data[1000:]、data[:1000]としてもエラーにならない
・リストに要素を追加 ・リスト名.append(値) または リスト名 += [値]
・リストの長さを取得 ・リストの長さとは要素数のこと。len関数で取得できる
・リストの入れ子 ・リストの要素に別のリストを持つことを入れ子にするという [ [ 1, 2 ], [ 2, 3] ] 要素数は2
・入れ子の参照方法 ・先頭の要素にインデックス[0]を使用。[ [ 1, 2 ], [ 2, 3] ]の [ 1, 2 ]のインデックスは[0]。 [ 1, 2 ]の1は[0][0]
・リストをスタックとして使う方法 ・スタックとは複数の値を扱えるでデータ構造の1つ ・リストと違うのは「要素を挿入するときも取り出すときも末尾から」という点(last-in, first-out) ・append(要素)で末尾に追加、pop()で末尾から削除
Result [] [4, 3, 2, 1]
・リストをキューとして使う方法 ・スタックとは複数の値を扱えるでデータ構造の1つ ・リストと違うのは「要素を挿入するとき末尾に追加れさ、取り出すときは先頭から削除される」(first-in, first-out) ・append(要素)で末尾に追加、pop(0)で先頭の要素を削除
Result [] [1, 2, 3, 4]
・リスト内包 ・リストの角括弧内でfor文を使って記述したもの ・書式 [ 式 for 変数 in リストなど ]
上記をリスト内包を使って記述
Result [ (1,2), (2, 1), (3, 1), (3, 2) ] |
》補足:リストの更新
|
Chapter3 Python言語使用 |
・内包表記 ・リスト内包表記の構文 ・[変数を使った処理 for 変数 in イテラブルオブジェクト] ・[変数を使った処理 for 変数 in イテラブルオブジェクト if 条件式]
・内容表記の可読性 ・map()やfilter()といった組み込み関数があるが、それらの関数より内包表記を使うほうが可読性の高いコードが書ける map関数 :リストなどの各要素に何らかの関数を適用し別のオブジェクトを作成 filter関数 :リストなどの各要素に何らかの関数を適用し、関数の戻り値がTrueとなる要素だけからなるオブジェクトを作成
|
第4章 判定と繰り返し |
《 判定 》 ・整数の真偽の判定 ・0が偽、それ以外は真 ・短絡演算子 ・A and B の場合、Aを判定して偽であればBを評価せずAの評価結果を返す。Aの判定が真であればBを評価してその評価結果を返す ・and がずっと続く場合、「最初に偽」になった評価結果を返す。すべて真の場合は最後の評価結果を返す ・or がずっと続く場合、「最初に真」になった評価結果を返す。すべて偽の場合は最後の評価結果を返す
Result 0 2 1
・None ・値が何も存在しない状態を表す ・最も適切な判定は if val is None: ・if val == None: でも判定できるが is None: より実行時間がかかるため最適とはいえない
《 繰り返し 》 ・range関数 ・range(stop) または range(start, stop) または range(start, stop, step) ・start, stop, step には整数を指定 ・startから始まりstopの直前まで、stepごとに整数を順番に取得 ・start省略時は0から始まる ・step省略時は1ごと
・for文 ・breakはループを直ちに終了する ・continueは現在のループを中止して次のループに進む ・for文でディクショナリのキーと値を同時に取得するには itemsメソッドを使う
Result case orga cnt 0.0
・for文とenumerate関数を組み合わせると反復可能体(繰り返し可能なもの)からインデックスと要素を同時に取得できる 反復可能体:リスト、タプル、ディクショナリ、文字列などのデータ型
Result 0 A 1 B
Result 0 A1 1 A2 2 A3
・for文とzip関数を使うと複数の反復可能体から並列で要素を取得できる
Result 1 1 1 2 2 22 3 3 333
Result [[1, 4, 8], [3, 9, 27], [5, 25, 125]]
・sorted関数とreversed関数 ・sorted関数を使うと昇順にソートしたリストを取得できる ・reversed関数を使うとリストや文字列などから逆順にしたオブジェクトを取得できる
Result ['A', 'E', 'T'] <list_reverseiterator object at 0x0000029A484DB970> ['T', 'E', 'A']
》補足 ・イテレータとは リストなどの複数の要素をもったデータ型に対して、順番にデータを取り出す機能 for文ではリストを引数に使用した際に内部的に実行される
・イテラブル(反復可能体)とは for文などで繰り返し可能なオブジェクト。リストやタプルなど
・for-else構文 ・forループが正常に完了するとelseブロックが実行される ・forループが一度も実行されなかった場合でもelseブロックは実行される ・break文でループが途中で終了した場合、elseブロックは実行されない
Result 2 is a prime number 3 is a prime number 4 equals 2 * 2 |
第5章 関数 |
・関数の定義 ・関数に定義する引数を「仮引数(parameter)」と呼ぶ ・def 関数名(仮引数1, 仮引数2, …)
・関数の呼び出し ・関数を呼び出す際に指定する引数を「実引数(argument)」と呼ぶ ・関数名(実引数1, 実引数2, …) ・関数呼び出しで()は省略できない ・関数そのものを変数に代入して呼び出す方法もある
Result Hello
・関数の変数 ・ローカル変数は、その関数内で定義する必要がある ・同名の変数が関数の内側と外側で定義されていても、それぞれ別の変数として扱われる ・関数内で定義されている変数は関数の外側では参照できない
・global・nonlocal ・グローバル変数はモジュールのトップレベルで定義される変数のこと。この変数はモジュール内の任意の位置から参照できる。 関数内でグローバル変数に値を代入するにはglobal文で示す必要がある
Result 200
・関数の中で別の関数を定義し、その内部から外部の関数の変数を変更するにはnonlocal 文で示す必要がある
・関数の引数 ・キーワード引数 ・「キーワード=値」をキーワード引数という ・値だけの引数を位置引数という ・キーワード引数の後に位置引数は与えられない ・存在しないキーワード引数は与えられない ・位置引数で指定済みの引数に対して、キーワード引数を指定できない ・関数定義が位置引数に対して、関数呼び出し側をキーワード引数で設定すれば引数を記述する順番は任意
・引数のデフォルト値 ・def 関数名(引数=デフォルト値): ・引数にはデフォルト値を設定できる ・関数の実行時に値を与えられなくてもデフォルト値が関数の中で使われる ・仮引数にデフォルト値を指定したら、それ以降の仮引数にもデフォルト値を指定する必要がある ・引数のデフォルト値は関数が定義された時点で評価され、関数の実行時に再評価はされない
Result Hello word
・引数のデフォルト値をリストにすると、その引数に値が加えられるたびにデフォルト値も変更される
Result [1] [3, 4, 2] [1, 3]
・「*」がついた仮引数 ・* が先頭に付いた仮引数には、指定済みの実引数を除く位置引数のリストおよびタプルが入る ・**が先頭に付いた仮引数には、指定済みの実引数を除くキーワード引数のディクショナリが入る
Result abc ('def', 'ghi') {'kw1': '123', 'kw2': '345'}
・「*」がついた実引数(アンパックと呼ぶ) ・リストおよびタプルは、「*」を先頭に付けることで要素を位置引数に展開して関数に渡せる ・ディクショナリは「**」を先頭に付けることで、キーワード引数として指定できる ・アンパックとはリストやタプルから1つ1つの要素を取り出して変数などに代入することをいう
Result spam&ham&eggs
・lambda(ラムダ)式 ・lambda 引数: 式 ・無名関数と呼ばれる種類の関数 ・単一の式しか持てない ・式の結果が返り値になる
Result 3 2
・sortに関数を渡してリストのソート基準を設定。関数にlambdaを使って各要素のインデックス「1」でソート
Result [(2, 'a'), (3, 'b'), (1, 'c')]
Result [('banana', 2), ('apple', 5), ('cherry', 8)]
・map関数はfor文を使わなくてもリストの全要素にアクセスできる map(lamba 引数: 戻り値, iterable)
Result [0, 1, 8]
》補足 ・ドキュメンテーション文字列(docstring) ・docstringはクラスや関数を説明するためのコメント ・1行目にはクラスや関数の目的などを書く。1行空けて呼び出し方や引数などの詳細を書く ・docstringは__doc__という属性で参照できる
・関数アノテーション ・関数の引数や返り値にアノテーション(注釈)を記述できる ・型は関数アノテーション、詳しい説明文はdocstringと併用して記述する場合が多い ・引数名のあとの : 式がそれぞれの引数に対するアノテーション ・) と末尾の : の間の -> 式が返り値に対するアノテーション ・デフォルト値はアノテーションのあとに記述する ・アノテーションはあくまで注釈で、それをもとに特別な処理が行われることはない ・アノテーションとして型を指定することもできるが、実行時に型チェックが行われたりはしない ・関数アノテーションは__annotations__属性に辞書(dict)として格納されている
Result abcabcabc {'x': 'for_x', 'y': 'for_y', 'return': 'for_return'} for_x
・名前空間
・変数や関数の名前が所属している場所のこと。 変数や関数が所属する場所、つまりモジュールやクラスが名前空間になる。 |
Chapter3 Python言語使用 |
・関数の引数 ・位置引数 ・関数呼び出し時に先頭から順に引数の位置を対応させて渡される ・仮引数と実引数の数を一致させる必要がある ・キーワード引数 ・実引数を「kwarg=value」という形式で仮引数名を指定して渡す ・関数定義の仮引数の順番どおりに実引数を渡す必要がない ・位置引数とキーワード引数の混在 ・関数呼び出し時、位置引数とキーワード引数が混在する場合、位置引数を先に置く必要がある ・デフォルト値付き引数 ・関数呼び出し時、実引数を省略したときに使用されるデフォルト値を仮引数に設定できる ・デフォルト値は変更不可なオブジェクト(文字列、数値、タプル)を指定する ・仮引数にデフォルト値を指定したら、それ以降の仮引数にもデフォルト値を指定する必要がある
・可変長位置引数 ・仮引数に「*」を付けると可変長の位置引数(任意の数の引数)を定義できる ・慣例として仮引数には*argsという名前が使われることが多い ・*argsは複数の引数をタプルとして受け取る ・*argsはほかの位置引数よりも後ろに指定する必要がある ・可変長位置引数の前にデフォルト値付き引数を定義しない ・可変長位置引数に対応した組み込み関数ではリストやタプルに「*」を付けて渡す
Result 1 2 3 ・可変長キーワード引数 ・仮引数に「**」を付けると可変長のキーワード引数を定義できる ・慣例として仮引数には**kwargsという名前が使われることが多い ・**kwargsは複数のキーワード引数を辞書として受け取る ・**kwargsは複数は一番最後に指定する必要がある ・上記4つを混在させる場合の順番 1. 位置引数 2. 可変長位置引数 3. デフォルト値付き引数 4. 可変長キーワード引数 ・キーワード専用引数 ・キーワードを強要したい際などに使う ・「*」のあとに定義された引数は、キーワード引数として指定しなければ呼び出せない
・位置専用引数 ・「/」の前に定義された引数は、位置引数として指定しなければ呼び出せない
・アンパック ・タプルやリスト、辞書などの複数の要素を持つものを展開して、複数の変数に代入できる
・アスタリスクを使ったアンパック ・代入される側の変数名の前に「*(アスタリスク)」を付けると、要素がその変数にまとめて代入される ・「*」付ける変数はどの変数でも問題ないが1つの変数にしか適用できない
Result 1 2 4 5 ・関数の引数のアンパック ・関数の実引数でタプルやリストを渡す際に「*」を付けると、中身を展開して渡すことができる
・辞書を展開して仮引数に渡す場合は実引数に「*」を2つ付ける
・ |
Chapter5 型ヒント |
・型ヒントはアノテーションであるため、プログラムの実行時に型はチェックされない ・型ヒントはコードの書きやすさ、読みやすさ、そしてバグを防止するためにある
・変数への型付け
・関数の引数、戻り値の型付け
・コンテナーの型付け
・コンテナー内の要素の型付け
・タプル要素への型付けする際の注意 ・タプル要素のすべてに対して型を指定する必要がある ・同じ型の場合は、「...」で繰り返しを省略できる tuple[str, ...]
・ユーザー定義クラスを型として利用する ・自分で定義したクラスを型として利用できる
・typingモジュール ・型ヒントをサポートする標準ライブラリ。さまざまな型を付けることができる ・関数やその戻り値の想定外の利用によるバグを防ぐことができ、生産性が向上する ・IDEやエディターでの入力補完があり、実装のスピードが加速する
・Union 複数の型を指定できる
・Optional 指定した型とNoneを指定できる
・Python 3.10からは複数の型を許可する「型名 | 型名」と書くことができる。typingモジュールのインポートは不要 Python 3.7から3.9でも「from __future__ import annotations」で「|」が利用できる
・Literal 特定の値のみを許可する定義
・Any 任意の型を許可する ・Anyで定義しておくことであらゆる型を受け付けることができる
・TypedDict 辞書のキーと値の型を指定する ・TypedDictとdataclassの使い分けとして、辞書として利用したい場合はTypedDictを、クラスとして利用したい場合にはdataclassを使うとよい
・静的型チェックツール ☆ 試験対象外 ☆ ・Pythonは動的型付け言語(変数の型を実行時に決定する方式で、プログラマーが明示的に変数の型を宣言する必要がない) ・型ヒントの利用に不整合があっても、プログラム実行時に型ヒントを使ったチェックはされずエラーにならない ・不整合があるコードに対して、静的型チェックツール(mypy)を利用することで不整合を検出できる
・mypy ・mypyのインストール pip install mypy ・mypyは、型ヒントが正しく利用されているかチェックし、エラーを出力する ・エラーメッセージは左から順に「ファイル名:行番号: エラー種別: エラー内容」が出力
・mypyのオプション ・mypyのオプションは、設定ファイルやコマンドラインで利用できる コマンドライン:--disallow-any-generics 設定ファイル : disallow_any_generics ・厳しくするオプションとゆるくするオプションがある ・各オプションをTrueに設定すると有効になる
|
第6章 その他のコレクションの操作 |
・collections.deque ・キューのように扱えるデータ構造 ・append() でキューの末尾に要素を追加 ・pop() でキューの末尾の要素を取り出す ・appendleft() でキューの先頭に要素を追加 ・popleft() でキューの先頭の要素を取り出す
Result deque([2, 3])
・タプル ・タプルの定義は、カンマ区切りの要素を括弧「()」で囲む tup = ("spam", "ham") ・() を省略しても定義可能 tup = "spam", "ham" ・要素が1つの場合は末尾にカンマを書く(要素が1でカンマがないと文字列になる) tup = "spam", ・tuple関数を使う場合、その引数はリストなどの反復可能体である必要がある tup = tuple(["spam", "ham"])
・リストとタプル ・リストとタプルには数値や文字列など異なるデータ型の要素を格納できる ・リストは既に存在する要素の値を変更可能だが、タプルは変更不可 ・リストとタプルはlen関数で要素数を取得できる
・set ・setとは集合を扱うデータ型のこと ・要素を重複しないように保持する ・2つのset同士で和集合や差集合といった集合演算を行える ・set関数によって定義する ・addメソッドで要素を追加できるが、追加した順序を保持しない ・removeメソッドで要素を削除できる ・集合(メソッドも使用可能) s1 - s2 差集合(s1からs2の要素を除いた集合) differenceメソッド s1 ^ s2 対称差集合(どちらか一方にだけ含まれる要素の集合) symmetric_differenceメソッド s1 | s2 和集合 unionメソッド s1 & s2 積集合 intersectionメソッド
・ディクショナリ ・変数 = {キー1: 値1, キー2: 値2, …} ・リストはインデックスを使って参照・更新するのに対して、ディクショナリではキーを使用する ・キーには文字列、タプル、数値も指定可能。可変体であるリストはキーに指定できない ・ディクショナリは変更可能(mutable)であるが、キーの型は変更不能(immutable)であり、その値は一意でなければならない ・要素の追加 ディクショナリ[キー] = 値 値の変更も同様 ・要素の削除 del ディクショナリ[キー] ・in演算子を使ったキーの存在確認 ・ディクショナリに対してin演算子を使う ・ディクショナリのkeysメソッドでkeyの一覧を取得。これに対してin演算子を使う ・list関数にディクショナリを指定するとキーを要素とするリストが生成される。これに対してin演算子を使う
・ディクショナリの内包表記 ・{キーの式: 値の式 for 変数 in 反復可能体}
Result {1: 1, 3: 27, 6: 216} <class 'dict'>
》補足 ・初期化
Result <class 'list'> <class 'tuple'> <class 'dict'> <class 'set'> |
第7章 モジュール |
・インポート ・インタープリターや別のファイルを利用できる仕組みをインポートという ・インポートされるファイルをモジュールという ・モジュールをインポート ・import モジュール名 ・インポートしたモジュールの関数を実行 ・モジュール名.関数名() ・関数のみをインポート ・from モジュール名 import 関数名 ・名前をすべてインポート ・from モジュール import * ・すべての名前(関数や変数)が使える ・アンダースコアー「_」で始まる名前はインポートされない ・モジュールの名前はインポートされない ・モジュールに__all__という変数のリストが存在した場合は、そのリスト内の名前だけインポートされる ・as を使ったインポート ・as でモジュールや関数を別名でインポートできる ・モジュールの別名でインポート ・import モジュール名 as モジュールの別名 ・関数の別名でインポート。モジュール名はインポートされない ・from モジュール名 import 関数名 as 関数の別名 ・関数の別名はモジュール名と同じ名前でも大丈夫
・メインモジュールか否かの判定 ・メインモジュールとはスクリプトとして実行された.pyファイルのこと ・__name__はモジュールの属性であり、モジュール名が自動で代入される ・メインモジュールで実行された場合、"__main__"が代入される ・インポートされたモジュールはメインモジュールではない
・__init__.py ・ディレクトリに__init__.pyというファイルを配置すると、ディレクトリ名のモジュールとしてインポートされる ・このような構成をパッケージという ・パッケージにすることで別の.pyファイルをまとめて扱える。この別のファイルをパッケージのサブモジュールという ・__init__.pyではサブモジュールをインポートできない ・__init__.pyからサブモジュールをインポートするには、通常、相対インポートで記述する ・相対インポート ・同じ階層から別サブモジュールをインポート from . import 別サブモジュール ・同じ階層から別サブモジュールの名前をインポート from .別サブモジュール import 名前 ・1つ上の階層から別サブモジュールをインポート from .. import 別サブモジュール ・1つ上の階層の別サブモジュールの名前をインポート from ..別サブモジュール import 名前
》補足 ・dir関数 ・dir() はそのオブジェクトの属性(変数や関数、オブジェクトなど)をリストで返してくれる
Result ['__doc__', '__loader__', '__name__', ... , 'tau', 'trunc', 'ulp']
|
第8章 ファイル入出力 |
・open関数のモード ・open("ファイル名", mode="モード") ・r: 読み込み専用(デフォルト) r+:読み書き両用 w:新規書き込み a:追加書き込み b:バイナリモード ・wb:バイナリモードで新規書き込み ab:バイナリモードで追加書き込み rb:バイナリモードで読み込み
・ファイルを閉じる処理 ・open関数の返り値であるファイルオブジェクトは、ファイルの処理後に閉じる必要がある ・閉じるにはcloseメソッドを使用する ・with文を使うことでこの閉じる処理が自動で行われる。この処理は例外が発生した時にも行われる ・with open("ファイル名") as ファイルオブジェクト変数: ・1つのファイルオブジェクトでwithを使っても、別のファイルオブジェクトが閉じられることはない ・プログラムが終了する際に全てのファイルオブジェクトが閉じられる。このためすぐ終了する場合は閉じる処理を省略できる
・ファイルを読み込み ・ファイルを1行ずつ読み込む for s in fp: ・ファイルオブジェクトはリストと同様な反復可能体の1つなのでfor文で繰り返すことができる ・以下も1行ずつ処理できるが、ファイル内容をすべて読み込んでから行ごとに分けるため上記にくらべメモリを消費するので避けるべき ・for s in readlines(): または for s in list(fp): ・fp.read() が処理するのは「ファイル全体の文字列」になる。そのため for s in fp.read(): と記述すると1行ずつではなく 「1文字ずつ」の処理になる
・ファイルの書き込み ・ファイルにデータを書き込む fp.write(文字列)
・JSON形式の書き込み ・オブジェクトをJSON形式で書き込む json.dump(data, fp) ・キーワード引数を使用することも可能 json.dump(fp=fp, obj=data) ・json.dumps() はオブジェクトからJSON形式の文字列を返す関数。ファイルオブジェクトを引数指定できない ・json.dumps() で書き込むには fp.write(json.dumps(data)) と記述する
・JSON形式を読み込む ・JSON形式のデータを読み込む json.load(fp) または json.loads(fp.read())
》補足 ・シリアライズとは Pythonのオブジェクトや文字列をJSON形式に変換すること
・デシリアライスとは JSON形式のデータをPythonのオブジェクトや文字列に変換すること |
第9章 例外 |
・構文エラー ・pythonの文法として正しくないコードを実行すると構文エラー(SyntaxError)になる
・例外 ・コードが文法として正しい場合でも実行時にエラーが発生することがある。これを例外(exception)という ・例外が起きたことを検知して例外発生時の動作を実装するには try - except文 を使う ・try節の中には通常の処理を書き、except節ではtry節で発生しうる例外に対する処理を書く ・except節で複数の例外を処理するには、()の中に処理したい例外をすべて列挙する ・except節の処理が不要なときは下記のように記述する
・raise文を使うことで任意の例外を発生させられる
Result ValueErrorです
・クリーンアップ動作 ・try文にfinally節を追加することでクリーンアップ動作を定義できる ・例外発生の有無に関わらず実行する処理
Result 引数の型が不正です --finally節の処理-- 結果:None
》補足 ・except 例外名 as 変数名 ・変数に例外オブジェクトを格納して使用できる ・例外オブジェクトはエラーメッセージなどが格納されており、エラーの内容を確認できる
Result invalid literal for int() with base 10: 'word'
・raiseを除いた全パターン
Result 25 D G
・エラーメッセージ ・AttributeError :存在しないデータの名前を参照したとき 例 リスト名.add(3) リストにaddメソッドは存在しない ・TypeError :意図しないデータ型が与えられたとき 例 リスト名 += 3 リスト以外を代入しようとした。100 / "10" ・ValueError :int型に変換できない 例 int("word") ・NameError :存在しない関数などを参照したとき 例 count(リスト名) countは組み込み関数に存在しない ・IndexError :要素が存在しないインデックスを指定したとき ・SyntaxError :構文に問題がある場合に発生するエラー ・ModuleNotFoundError:指定されたモジュールがない ・KeyError :ディクショナリに存在しないキーを参照しようとしたとき ・KeyboardInterrupt :「Ctrl + C」を押したとき
》補足 ・パーサ(構文解釈器)は違反のある行を表示し、最初にエラーが検知された点に小さな矢印が付けられる。エラーは矢印より前のトークンが原因である |
Chapter3 Python言語使用 |
・例外処理 ・基底クラスで補足 ・BaseExceptionを親としたExceptionクラスがあり、Exceptionを継承した形で、子・孫クラスの例外が存在している ・exceptに捕捉したい例外の基底クラスを指定しても、その子・孫クラスの例外を捕捉できる ・基底クラスで補足しても渡される例外オブジェクトは変わらない ・独自の例外を定義 ・Exceptionクラスから派生したクラスであればraiseキーワードを使用して例外を発生できる
・複数の例外を送出するようなモジュールを作成する際は、そのモジュールで定義されている例外の基底クラスを作成するのが一般的 ・一般的にtry文で囲む範囲は狭いほがいい ・except節で例外の種類を指定しないとエラー原因が特定できない、プログラムを停止できなくなるなどの弊害がしょうじるので非推奨 |
第10章 クラスとオブジェクトの操作 |
・クラス定義 ・クラスを構成する要素には、クラス変数、インスタンス変数、メソッドがある ・クラス変数(①) ・クラスで保持する変数。そのクラスのすべてのインスタンスで共有される ・クラス変数はクラスの直下に定義 ・通常の変数のように「変数名 = 値」の書式で記述 ・インスタンス変数(②、③) ・インスタンス毎に固有の変数 ・インスタンスを初期化するための特殊メソッドである__init__メソッドの中で定義する ・__init__メソッドには、selfという引数を与える ・インスタンス変数は「self.変数名 = 値」の書式で定義 ・メソッド(④) ・クラスに定義された関数 ・メソッドの定義の仕方は関数と同じだが、第1引数にselfを与える ・メソッド内でクラス変数を参照する場合は、self. を付ける必要がある
》補足 ・self ・そのクラスのインスタンスを表す ・selfはメソッドの呼び出し元で引数に渡す必要はなく、pythonが自動的に呼び出されたメソッドの第1引数としてインスタンスを渡してくれる
・インスタンス化 ・変数名 = クラス() の書式で行う duck = Duck() ・__init__メソッドを定義することで、インスタンス化時の処理を記述できる ・このメソッドの第1引数であるselfは、そのクラスのインスタンスを表す特殊な引数 ・第2引数以降は、呼び出し元から渡された引数をそのまま受け取れる ・メソッド内にインスタンス変数と同名のローカル変数がある場合、それらは別の変数として扱われる ・メソッド内でインスタンス変数を参照・更新する場合、変数名の先頭に self. を付ける
・メソッド ・同一クラスに定義された他のメソッドを呼び出す際は、メソッド名の先頭に self. を付ける
Result quack ga-ga-
・派生クラス ・class 派生クラス(基底クラス): ・pythonでは定義済みのクラスを基にして、別のクラスを作成できる。これをクラスの継承と呼ぶ ・継承元となるクラスを基底クラス、継承先になるクラスを派生クラスと呼ぶ ・派生クラスは基底クラスの、クラス変数、インスタンス変数、、メソッドを受け継ぐ ・あるクラスを継承するときに、基底クラスと同名のクラス変数、インスタンス変数、メソッドを定義する場合、それらは上書きされる ・super().メソッド() で継承した基底クラスのメソッドを呼び出せる。その際引数にselfは不要
Result 私の名前は山田です。年齢は20歳です。 こんにちは
・オブジェクトの判定 ・type関数は、引数に指定したオブジェクトの型を返す ・isinstance関数は、第1引数に判定したいオブジェクトを指定、第2引数に型や基底クラスを指定する ・issubclass関数は、クラスBがクラスAから派生しているかを判定する issubclass(クラスB, クラスA)
Result True |
Chapter4 Pythonのクラス |
||||||||||||||
・メソッドには以下の3種類が存在する ・インスタンスメソッド ・一般にメソッドというとインスタンスメソッドのことをいう ・クラス内で動作するように、第1引数にselfが渡され、インスタンス化されたクラスの属性やメソッドを使うことができる ・クラスメソッド ・クラスオブジェクトを暗黙的に第1引数にとる、特別なメソッド。 ・@classmethodデコレーターをメソッドに使うことで定義 ・外部情報に依存したインスタンスを生成する場合などの特殊なインスタンス化に使用 ・静的メソッド ・インスタンス化せずに使うことを前提にしたメソッドを定義 ・@staticmethodデコレーターをメソッドに使うことで定義
・サンプル
・特殊メソッド ・特殊メソッドは、メソッド名の前後にアンダースコア(_)を2個付けたもの ・コンストラクターメソッド __init__() も、特殊メソッドの1つ ・特殊メソッドでは、関数が実行されたときの挙動や演算子の挙動を決めることができる
・関数による挙動 ・__repr__() :オブジェクトをprint()関数で出力したときの文字列表現を変更できる
・__len__() :組み込み関数len()は引数に与えたオブジェクトの__len__()メソッドを呼び出す
・演算子による挙動 ・__add__() :足し算で使う演算子(+)の挙動には、__add__()という特殊メソッドが呼び出される ・__eq__() :==では__eq__()メソッドが呼び出される
・主な特殊メソッド
・プロパティ化 ・インスタンスメソッドをプロパティ化するとカッコを付けずに呼び出せる
・クラスメソッドの具体的な使い方 ・datetimeにはクラスメソッドで宣言されているnow()メソッドが存在する ・インスタンスのメソッドを呼び出すのとは違い、datetime.now() とクラスオブジェクトに対し直接メソッド実行できる
・多重継承
・多重継承は、継承関係の把握が難しくなり、複雑で混乱を招く場合がありる
・このCustomクラスの属性の参照やメソッドの呼び出しをしたとき、Base1の属性やメソッドを最初に調べ、Base1の親クラスの ・Pythonにおいては、多重継承の継承順位をMRO(Method Resolution Order)という仕組みで、C3アルゴリズムを用いて探索する
・dataclass ・クラスデコレーターを用いてクラスを宣言し、クラス属性を宣言する ・宣言の際に型ヒント(型アノテーション)を用いる ・例として、サンプル:class_sample.pyのUserクラスをdataclassとして宣言
・detaclass宣言で、コンストラクターメソッドである__init__()や、特殊メソッドである__repr__()などが自動的に定義される ・detaclassを使うことで以下の定義を省略でき、データを管理するクラスをシンプルにすることが出来る
・dataclassデコレーターに引数を与えて挙動を変えることができる。frozen=Trueで属性の変更ができなくなる ここではfrozen引数を設定し、データ変更ができないdataclassを宣言
・コンストラクターの任意引数 ・デフォルト値を設定する場合は、デフォルト値を持たない属性よりも下に宣言する必要がある
・データ変換 ・dataclassで宣言したクラスは、辞書やタプルに変換する仕組みが提供されている
・オブジェクト関連関数 ・id(object) オブジェクトの識別値であるidを整数で返す ・type(object) オブジェクトの種類を返す ・help(object) オブジェクトのヘルプを表示する。docstringがあるとhelp()関数で確認できる |
第11章 標準ライブラリ |
・OSモジュール ・os.getcwd() でカレントディレクトリを取得 ・os.chdir("..") でカレントディレクトリから上の階層へ移動
・globモジュール ・glob.glob("*.ipynb") でカレントディレクトリ下のパターンにマッチするファイルの一覧を取得する
・sysモジュール ・sys.argv でコマンドライン情報を取得。 python check.py 1 2 をコマンドライン実行すると、sys.argvは[’check.py', '1', '2']が返ってくる
・argparseモジュール ・argparseモジュールのArgumentParse() を使ってもコマンドライン引数を取得できる ・parserという名前でパーサ(構文解釈l器)のオブジェクトを作成(①) ・add_argument() で引数の情報を追加。ここでは2種類(--head と body)(②) コマンド実行時、"--head"は「--head=値」、"body", nargs="+"は1個以上の「任意形式」の引数の指定 ハイフン付は任意引数。引数名が1文字の場合はハイフンは1つでよい(-a)。ハイフンがないものは必須引数 ・parser.parse_args() で引数の情報を取得できる(③) ・Resultのように2種類の引数の値を確認できる(④)
Result python> python parse.py --head=1 2 3 Namespace(head='1', body=['2', '3'])
・mathモジュール ・数学に関する定数や関数が定義されている ・log() は対数を求める関数。log(値, 底) は返り値をnとした場合、底のn乗が値になる。log(16, 2)は、2の4乗が16なので返り値は「4.0」を返す ・pi は円周率を参照する定数(3.141592653589793) ・tau(タウ) は「円周と半径の比」(2π = 6.283185307179586)
・randomモジュール ・乱数を生成するための関数を定義 ・random.choice(range(10)) は0から9のうち1つをランダムに選ぶ関数。連続して実行した場合、出力が重複する可能性がある ・random.random() ・random.random() 0以上1未満のランダムな値(少数)を返す ・random.random() - 1 -1以上0未満のランダムな値(少数)を返す ・random.random() * 2 0以上2未満のランダムな値(少数)を返す ・random.random() * 2 -1 -1以上1未満のランダムな値(少数)を返す ・random.sample(l, n) 第1引数のリストからランダムに第2引数の取得数を選択してリストで返す。出力が重複する可能性がある ・random.randrange(1, 6, 2) はrange(1, 6, 2) の要素からランダムに選ばれた要素を返す
・statisticsモジュール ・数理統計に用いる関数が含まれている ・statistics.mean() データの平均値 ・statistics.median() データの中央値 ・statistics.variance() データの不偏分散 ・不偏分散の計算式 平均との差の2乗の和を「データ数 - 1」で割った値 ・[ -1, -1, -1, -1, 4 ] の場合 ・平均値: 0 ・中央値:-1 ・不平分散:( 1**2+1**2+1**2+1**2+4**2 ) / (5 - 1) = 5
・urllib.requestモジュール ・urlopen() は引数で指定したURLのWebサイトからさまざまな情報を取得できる ・urlopen() は対象のデータをバイナリモードで取得するのでdecode() でバイナリデータを文字列に変換が必要
・datetimeモジュール ・日付と時刻を扱うさまざまな関数が定義されている ・datetime() で指定した日付のdatetimeオブジェクトを作成 ・strftime() で指定された表示形式で出力される
Result <class 'datetime.datetime'> 2000-12-31 00:00:00 2000-12-31
・timedeltaオブジェクトは2つの日付や時間の間の差を表せる機能を定義。daysメソッドで日数部分を取得できる ・日付の引き算はdatetimeオブジェクト同士、あるいはdateオブジェクト同士で可能
Result <class 'datetime.date'> <class 'datetime.timedelta'> 397 days, 0:00:00 397
・unittestモジュール ・単体テストを実行するのに使用する ・一般的に、unittestによる単体テストではテスト対象のモジュールとは別に、テスト実行側の.pyファイルを用意する必要がる ・コマンドラインから「python -m unittest」のように実行すると、対象の関数やメソッドのテスト結果を確認できる
・リストやディレクトリなどを整形 ・pprintモジュール ・pprint() は1行が80文字を超えると要素ごとに改行する ・widthで改行を適宜変更可能
Result ['sample test string 0000', 'sample test string 0001', 'sample test string 0002']
・textwrapモジュール ・widthで指定した幅に収まるよう整形する ・pprintのように角括弧を付けず出力される
Result 1 sheep jumped fence., 2 sheep jumped fence., 3 sheep jumped fence.
・reモジュール 参考 Pythonの正規表現モジュールreの使い方 、Pythonにおける正規表現の使い方 ・正規表現を扱う関数 ・sub() はマッチした部分を他の文字列に置換する ・compile() は正規表現パターン文字列をコンパイルして正規表現パターンオブジェクトを作成する ・search() は文字列すべてが検索対象で、先頭にない文字列にもマッチする ・match() は文字列の先頭位置からだけマッチするどうか調べる
・正規表現パターン ・[a-z]+ は小文字のアルファベットが1文字以上繰り返される文字列にマッチ ・[efg] はe,f,g のいづれかの1文字とマッチ ・a.{3}e はa...eと同じ。{n]は直前のパターンをn回繰り返し ・メタ文字(特別な意味を持つ文字)は\でエスケープが必要 ・\1, \2, … は'\\1'のようにエスケープが必要だが、raw文字列を使うとr'\'ですむ
・メタ文字 ・「.」 改行以外の任意の1文字 ・「*」 直前のパターンを0回以上繰り返し ・「+」 直前のパターンを1回以上繰り返し ・「?」 直前のパターンを0回または1回繰り返し
・フラグ設定 ・re.IGNORECASE を指定すると大文字小文字を区別せずマッチする
・loggingモジュール ・loggerにはsetLevelがあり、logger毎に扱うログのレベルを設定可能
・レベルの高い順:CRITICAL、ERROR、WARNING、INFO、 ・loggerのsetLevel:WARNING ・各loggerにはhandlerがありhandlerごとにログの出力先の設定や、handler自体にもsetLevelを設定可能
Result error message
・collectionsモジュール ・リスト要素の集計をする
Result Counter({1: 3, 2: 3, 3: 1, 4: 1, 5: 1})
・Processing(プロセッシング)モジュール ・簡単に画面に絵を出したりマウスの操作で絵を動かしたりできる
・smtplibモジュール ・任意のインターネット上のホストにメールを送ることができる |
Chapter5 型ヒント |
・operatorモジュール ・attrgetter クラスやdataclassのソート ・itemgetter リストや辞書などのソート
Result attrgetter: [User(name='maho', gold=100), User(name='sorho', gold=200), User(name='yusha', gold=300)] itemgetter: [(3, 10, 100), (1, 40, 200), (2, 20, 300), (1, 30, 300)] |
第12章 Python仮想環境とサードパーティパッケージの利用 |
・仮想環境 ・複数のPythonの実行環境を目的に応じて使い分けられる ・使用するPythonのバージョンは仮想環境ごとに指定できる ・使用する外部パッケージの種類とバージョンも選択可能 ・1つの仮想環境でパッケージのバージョンを変更しても、別の仮想環境のバージョンは変更されない ・仮想環境を作成するディレクトリは、コマンドで指定する。このディレクトリの中には、Pythonのインタープリタ本体やパッケージ、 仮想環境を有効化するスクリプトなどが含まれる ・仮想環境に使うバージョンのPythonは、あらかじめインストールしておく必要がある
・仮想環境の導入方法 ・仮想環境の作成には、venv(ブイエンブ)モジュールを使う ・仮想環境用のディレクトリの作成 python3 -m venv ディレクトリ名 windowsではpython3の代わりのpythonを使う ・UnixやmacOSにおいて、複数のバージョンのPythonがインストール済の場合にバージョンを指定できる python3.10 -m venv ディレクトリ名 ・仮想環境に切り替える方法 ・UnixやmacOSの場合 source ディレクトリ名/bin/activate ・Windowsの場合 ディレクトリ名/Scripts/activate.bat
・外部パッケージのインストール ・外部パッケージはpip(ピップ)モジュールを使ってインストールする ・外部パッケージのインストール python -m pip install パッケージ名 あるいは pip install パッケージ名 ・特定のバージョンのインストール(インストール済みでも変更可能) pip install パッケージ名==バージョン ・==3.1 3.1および3.1.* ・~=3.1 3.1以上かつ3.* ・>=3.1 3.1以上 ・インストール済みのパッケージをアップグレード pip install -U パッケージ名 あるいは pip install --upgrade パッケージ名 ・インストール済みのパッケージをアンインストール pip uninstall パッケージ名 ・インストール、アンインストールは複数パッケージの同時指定可能 例 pip install パッケージ1 パッケージ2 パッケージ3 ・インストール済みのパッケージを一覧出力 pip list ・インストール済みのパッケージをrequirements形式で一覧出力 pip freeze |
Chapter1 Pythonの環境 |
・pip ・pipがインストールされていない環境での導入方法 python -m ensurepip ・Debian、Ubuntuでのpipの導入方法 sudo apt install -y python3-pip
・PyPI(パイピーアイ) ・PyPIとはPython用のソフトウェア・リポジトリのこと ・pip install パッケージ名に対してPyPIに公開されていれば、そのパッケージがインストールされる インストール時に依存パッケージも同時にインストールされる
・ある範囲のバージョンのなかで最新のものをインストールしたい場合は、>、<、=を使ってバージョンの範囲を指定する この場合はダブルクオートでパッケージ名とバージョンを囲む必要がある pip install "sampleproject>=1.2.0,<2.0.0" 1.2.0以上2.0.0未満のなかで最新のバージョンをインストール ・バージョン指定と組み合わせることでダウングレードも可能
・インストール済みの最新バージョンではないパッケージ一覧 pip list -o または pip list --outdated ・個別パッケージの詳細情報の確認(依存関係にある他パッケージも出力される) pip show パッケージ名 ・依存関係にあるパッケージも含めて完全アンインストールする場会は個別にpip uninstallする必要がある ・requirements.txtを参照してパッケージをインストールする pip install -r requirements.txt ・複数のアプリケーションを開発していて、そのすべてのアプリケーションで特定パッケージのバージョンを統一したい pip install -r requirements.txt -c constraints.txt requirements.txt の統一したいパッケージにはバージョンを記載しない constraints.txtには統一したパッケージのみをバージョンを付けて記載する。requirements.txtにそのパッケージがないと何もしない ・複数バージョンのPythonをインストールした環境でバージョンを指定してインストールする pip3.9 install パッケージ名 または python3.9 -m pip install パッケージ名
・仮想環境 ・venvの仮想環境はDockerやVirtualBoxなどの仮想環境とは異なる ・仮想環境専用のpipコマンドを最新版に更新 python -m venv --upgrade-deps ・仮想環境を有効化するとシェルプロンプトに仮想環境のディレクトリ名が表示される 例 (ディレクトリ名) ・仮想環境を有効化したら最初にpipを最新版にアップグレードしておく pip install --upgrade pip ・仮想環境の利用が終わったら無効化する deactivate ・不要になった仮想環境を削除 rm -rf ディレクトリー名 ・パッケージのアンインストールを行っても依存関係にあるパッケージはアンインストールされないので 一旦削除して仮想環境を作り直した方が手間が少ない。同じバージョンで再構築したい場合は予めrequirements.txtを作成しておく |
Chapter3 Python言語使用 |
・with文 ・コンテキストマネージャー ・with文に渡すオブジェクトをコンテキストマネージャー(context manager)と呼ぶ ・コンテキストマネージャーとは、__enter__()、__exit__()の特殊メソッドを実装したクラスのインスタンス ・open関数の例ではファイルオブジェクトがコンテキストマネージャーオブジェクト ・__enter__()が実行され、次にwithブロック内、最後に__exit__()が実行される ・withブロック内での例外発生時は__exit__()の引数で例外情報が受け取れる ・@contextlib.contextmanager ・@contextlib.contextmanagerというデコレーターを使用してジェネレーター関数を記述するとコンテキストマネージャーを定義できる それにより、__enter__()と__exit__()メソッドを別々に定義したクラスを書く必要がない ・デコレーターとは、既存関数に別の処理を追加する仕組み ・ジェネレーター関数とは、リターン時の状態を保持し、再呼び出し時は保持された状態から処理されるもの ・よくある使い方 ・try-finallyの再利用 ・ファイルのopen/close ・組み込み関数の書き換え ・ある処理の実行時間を計測したいというケースで、コンテキストマネージャーを使用した例
・ジェネレーター ・通常の関数とおおよそ同じだが、return文の代わりにyield(ヤイルド)文を使用する ・関数内でyield文が使用されるとpythonはこの関数をジェネレーターと判断する ・yieldからはジェネレーターオブジェクト(イテラブル)が返される ・yield文は実行された時点の値を返し、その位置で一時停止の状態になり次の呼び出しを待つ ・ジェネレーターはデータ量が大量になってもメモリリースを消費することなく処理を行うことができる ・ジェネレータで使用できる関数の1つのnext関数は、イテレーターから次の値を取り出す組み込み関数で、 ジェネレーターオブジェクトの__next__()メソッドを呼び出している ・無限の数列を扱うことができるのもジェネレーターの特徴
・大きいファイルの処理にジェネレーターは効率的 ・ファイル読み込みのループ処理中に対象のデータを1つずつ取り出しながら処理を行うことができるため1行分のメモリ程度ですむ ・対象データを処理するコードはジェネレーターとは別に記述できるため、コードが読みやすくなる
・デコレーター ・関数やメソッド、クラスをデコレート(装飾)する機能。中身を変えずに共通のロジックを適用できる ・適用したい対象の上に「@デコレーター名」と1行追加する ・デコレーターはシンタックスシュガー(複雑でわかりにくい書き方をよりシンプルでわかりやすい別の記法で書くこと) ・デコレーターの構文と代入文は等価
・デコレーターの利点は、デコレーター対象の関数に何も変更を加えなくてもデコレーター対象の関数の前後で処理を追加できること
Result raise ValueError raise ValueError 5です
・クラスデコレーター ・クラスや、クラスメソッドにもデコレーターを適用できる ・使い方は関数デコレーターと同様にクラスやメソッド定義の前に「@デコレーター名」で1行追加するだけ
・複数デコレーター ・1つの関数やメソッド、クラスに複数のデコレーターを適用できる。1行ごとに1つのデコレーターを指定する ・デコレーターは内側から外側に向かって順に適用される
・関数デコレーターを自作 ・Pythonの関数の仕様
Result john さん
Result john さん 今日はいいお天気ですね
・上記(例1)(例2)をふまえ、以下にシンプルなデコレーターを代入文で作成 以下はデコレーターの実装まとめ 1) デコレーター関数を定義する 2) デコレーター関数はデコレート対象の関数を引数として受け取るようにする 3) デコレーター関数のなかにデコレート対象の関数の代わりに呼び出されるラッパー関数を定義 4) ラッパー関数のなかでデコレーター関数の引数で受け取った関数を呼び出す 5) 関数呼び出しの前後に追加、変更の処理を加える 6) デコレーター関数の戻り値としてラッパー関数を返す 7) wrap_functionは呼び出し可能オブジェクトなので、()を使用してコールできる。このオブジェクトを呼び出すと、 my_decorator()内のwrap_function()が呼び出されて処理が実行される
Result こんにちは greeting
・上記を「@デコレーター名」構文を使用して置き換える
|
Chapter3 Python言語使用 |
・hoge
|