Python



Python の共通リンク

  • Python公式

    Pythonの利点

    簡潔で学びやすい構文

    Python の構文はシンプルで自然言語に近いです。初心者プログラマーでもすぐに始めることができ、学習の敷居が低くなります。

    豊富な標準ライブラリとサードパーティのリソース

    Python は、ネットワーキング、データ処理、グラフィカル インターフェイスなどの多くの側面をカバーする幅広い標準関数ライブラリを提供します。さらに、NumPy、Pandas、TensorFlow などの強力なサードパーティ エコシステムにより、Python は多用途の開発ツールになります。

    クロスプラットフォーム機能

    Python はクロスプラットフォーム言語です。 WindowsでもmacOSでもLinuxでも同じPythonプログラムを実行できるため、開発の自由度が大幅に向上します。

    多くの分野で広く使用されています

    Python はデータ サイエンス、人工知能、Web 開発、自動スクリプティング、ゲーム開発などの複数の分野で重要な役割を果たしており、開発者が 1 つの言語で複数のニーズに対応できるようになります。

    積極的なコミュニティサポート

    Python には大規模なグローバル コミュニティがあり、初心者も経験豊富な開発者も、教育リソース、ディスカッション グループ、技術サポートを簡単に見つけることができます。

    効率的な開発スピード

    Python は直感的な構文と強力なツールを提供するため、開発者はプログラミングをより迅速に実装し、製品開発サイクルを短縮できます。



    Python開発環境

    Anaconda

    アナコンダとは何ですか?

    Anaconda は、データ サイエンス、機械学習、人工知能、ビッグ データ分析などのアプリケーションを含む科学コンピューティング向けに設計されたオープンソースの Python および R プログラミング プラットフォームです。

    主な機能

    オブジェクトに適しています

    Anaconda は、次の分野のユーザーに適しています。

    アナコンダをインストールするにはどうすればよいですか?

    1. アクセスアナコンダ公式サイト
    2. 適切なオペレーティング システムのバージョンを選択し、対応するインストール ファイルをダウンロードします。
    3. インストール ウィザードに従ってインストールを完了し、環境変数を構成します (オプション)。

    よくある質問

    ユーザーがよく遭遇する問題は次のとおりです。



    アナコンダ環境

    アナコンダ環境とは何ですか

    Anaconda は、同じコンピュータ上に複数の独立した Python 実行環境を作成できる仮想環境 (Environment) 機能を提供します。異なるプロジェクト間の依存関係の競合を避けるために、各環境に異なる Python バージョンとパッケージを含めることができます。

    環境を整える

    # myenv という名前の環境を作成し、Python のバージョンを指定します
    conda create -n myenv python=3.10

    環境の起動と切り替え

    # 環境を開始する
    conda は myenv をアクティブ化します
    
    #環境を終了する
    conda を非アクティブ化する

    環境を見る

    # すべての環境をリストする
    conda 環境リスト
    # または
    conda 情報 --envs

    環境のエクスポートと復元

    # 環境設定を YAML ファイルにエクスポート
    conda 環境エクスポート > 環境.yml
    
    # YAMLファイルから環境を作成
    conda env create -f 環境.yml

    環境の削除

    # 指定した環境を削除する
    conda 削除 -n myenv --all


    Jupyter

    ジュピターとは何ですか?

    Jupyter は、複数のプログラミング言語をサポートするオープンソースのインタラクティブ コンピューティング環境で、主にデータ サイエンス、機械学習、学術研究に使用されます。

  • Jupyter

    コア機能

    主要コンポーネント

    適用範囲

    Jupyter は次の分野で広く使用されています。

    ジュピターの使い方は?

    1. Anaconda をインストールするか、Jupyter スタンドアロンをインストールします。
    2. ターミナルに入力してくださいjupyter notebookJupyter Notebook を起動します。
    3. ブラウザーから編集インターフェイスに入り、ノートブックを作成して実行します。

    利点と課題



    VS Code Python 開発環境

    Visual Studio コードをインストールする

    に行くVisual Studio Code 公式ウェブサイト、オペレーティング システムに適したバージョンをダウンロードしてインストールします。

    Python 拡張機能をインストールする

    Visual Studio Code で、次の手順に従って Python 拡張機能をインストールします。

    1. 左側の拡張機能アイコンをクリックします。
    2. 「Python」で検索してください。
    3. Microsoft が提供する Python 拡張機能を選択し、「インストール」をクリックします。

    Pythonをインストールする

    Python がシステムにインストールされていることを確認してください。から入手できますパイソン公式サイトダウンロードしてインストールします。

    インストールが完了したら、コマンド ラインに次のコマンドを入力して、インストールが成功したことを確認します。

    Python --バージョン
    # または
    python3 --バージョン

    Python インタープリターのセットアップ

    Python プロジェクトまたはファイルを開き、Visual Studio Code の右下隅にある「Python」ステータス バーをクリックして、適切な Python インタープリターを選択します。

    Pythonプログラムを実行する

    エディターで Python ファイルを開き、次の方法を使用してプログラムを実行します。

    1. ファイルの内容を右クリックし、「ターミナルで Python ファイルを実行」を選択します。
    2. またはショートカットキーを使用するCtrl + Shift + P, 「Python ファイルの実行」を検索して実行します。

    必要なパッケージをインストールする

    サードパーティのパッケージをインストールする必要がある場合は、内蔵ターミナルを使用して次のように入力できます。

    pip インストールパッケージ名

    オートコンプリートとデバッグを有効にする

    Python 拡張機能によって提供される機能を通じて、オートコンプリートと強力なデバッグ ツールをお楽しみください。

    1. 左側のデバッグアイコンをクリックします。
    2. 「launch.json ファイルの作成」を選択し、Python を選択します。
    3. 設定が完了したら、F5 キーを押してデバッグ モードを有効にします。

    よく使うショートカットキー

    よく使用されるショートカット キーをいくつか示します。



    VS Code

  • vscode/Vidual Studio Code

    VS Code は Python 実行パラメータを設定します

    launch.jsonを変更する

    Python プログラムの実行時にパラメータを渡す必要がある場合は、次のように設定できます。launch.json仕上げる:

    1. 左側の「実行とデバッグ」アイコンをクリックします。
    2. 「launch.json ファイルの作成」または「構成の追加」をクリックします。
    3. 環境として「Python」を選択します。
    4. 生成されたlaunch.jsonファイル内の関連する設定を変更します。

    プログラムと引数のパラメータを設定する

    以下は、プログラム パスと実行パラメータを含む設定例です。

    {
        "バージョン": "0.2.0",
        「構成」: [
            {
                "name": "Python: 引数を指定して実行",
                "タイプ": "Python",
                "リクエスト": "起動",
                "program": "${workspaceFolder}/main.py", // プログラムのパス
                "console": "integrated Terminal", // 端末の種類
                "args": ["arg1", "arg2", "--option", "value"] // パラメータを渡す
            }
        ]
    }

    引数の目的

    存在するargsコマンドラインパラメータは次のように渡すことができます。

    プログラム内のパラメータを読み込む

    使用sys.argvコマンドラインから渡されたパラメータを読み取るには:

    インポートシステム
    
    print("すべてのパラメータ:", sys.argv)
    len(sys.argv) > 1の場合:
        print("最初のパラメータ:", sys.argv[1])
        print("第二パラメータ:", sys.argv[2])

    実行例

    次のようなプログラムがあるとします。

    python main.py arg1 arg2 --option value

    実行結果:

    すべてのパラメータ: ['main.py'、'arg1'、'arg2'、'--option'、'value']
    最初のパラメータ: arg1
    2 番目のパラメータ: arg2


    VS コード Python デバッグ モード

    デバッグモードを有効にする

    1. インストールPython Extension拡大。

    2. VS Code で Python プロジェクトを開始します。

    3. を押しますF5または、左側のアクティビティバーをクリックしますDebugアイコン。

    launch.jsonの設定

    1. デバッグパネルで「構成の追加」をクリックします。

    2. 選択しますPython、システムは自動的にlaunch.json

    {
        "version": "0.2.0",
        "configurations": [
            {
                "name": "Python: Current File",
                "type": "python",
                "request": "launch",
                "program": "${file}",
                "console": "integratedTerminal"
            }
        ]
    }
    

    ブレークポイントを設定する

    1. コード行番号の横をクリックしてブレークポイントを追加します。

    2. 条件付きブレーク ポイントを使用できます。ブレーク ポイントを右クリックし、[条件の編集] を選択します。

    デバッグ機能

    変数をチェックする

    1. [デバッグ] パネルの [変数] 領域で現在の変数のステータスを表示します。

    2. [モニター] エリアに特定の式を手動で追加できます。

    デバッグコンソールの使用

    1. デバッグ コンソールに Python コマンドを入力して、プログラムのステータスをリアルタイムで確認します。

    2. 変数クエリや関数呼び出しなどの操作を実行できます。



    VS CodeはPythonパスを設定します

    ステップ 1: Python と VS Code をインストールする

    Python がインストールされ、システム環境変数に追加されていることを確認してから、Visual Studio Code をダウンロードしてインストールします。

    ステップ 2: Python 拡張機能をインストールする

    Visual Studio Code を開き、左側の [拡張機能] アイコンをクリックして検索します。Pythonをクリックし、Microsoft が提供する Python 拡張機能をインストールします。

    ステップ 3: Python のインストール パスを確認する

    ターミナルに次のコマンドを入力して、Python のインストール パスを確認します。

    which python

    または (Windows システム):

    where python

    ステップ 4: Python パスを設定する

    Visual Studio Code で、次を押します。Ctrl + Shift + Pを入力して選択しますPython: Select Interpreter

    マニフェストで正しい Python パスを選択します。表示されない場合は、フルパスを手動で入力してください。

    ステップ 5: 設定を確認する

    ターミナルを開いて実行しますpython --versionPython インタープリターの正しいバージョンが選択されていることを確認します。

    追加情報

    特定のプロジェクトの Python パスが必要な場合は、プロジェクトのルート ディレクトリに追加できます。.vscode/settings.jsonファイルを作成し、次の内容を追加します。

    {
      "python.pythonPath": "Python へのフルパス"
    }

    交換するPython のフルパスは実際のパスです。



    VS Code Python 環境の切り替え

    VS Code で開発する場合、主に基盤となるインタープリター (Interpreter) の設定を通じて、Anaconda またはその他の環境を使用することにします。これにより、パッケージの依存関係がプログラム実行環境から完全に分離されます。


    1. Python 環境を選択する手順


    2. Anaconda を使用するか他の環境を使用するかを決定する方法

    環境タイプ 該当する状況 主な利点
    Anaconda データサイエンス、機械学習、ディープラーニング 多数の科学計算ライブラリがプリインストールされており、基礎となるバイナリ ファイル (DLL など) を強力に管理します。
    Venv 一般的な Web 開発、自動化スクリプト 軽量で起動が速く、実行に必要なパッケージのみが含まれています。

    3. Conda で環境を管理および切り替える

    グラフィカル インターフェイスに加えて、VS Code の組み込みターミナルのコマンドを使用して環境を管理することもできます。


    4. よくある質問と解決策



    Chromebook で Python を実行する

    方法 1: Linux (クロスティーニ) を使用する

    1. Chromebookの設定で「Linux(ベータ)」または「開発者→Linux開発環境」をオンにします。
    2. Linux ターミナルを起動し、次のように入力します。
      
      sudo apt update
      sudo apt install python3 python3-pip -y
          
    3. 入力python3Python インタラクティブ環境に入ります。
    4. 追加のモジュールをインストールするには、利用可能なpip3 インストールモジュール名

    方法 2: オンライン コンパイラーを使用する

    方法 3: Android アプリをインストールする

    方法 4: VS コードを使用する

    1. Linux (Crostini) 環境に VS Code をインストールします。
      
      sudo apt install wget gpg -y
      wget -qO- https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > packages.microsoft.gpg
      sudo install -o root -g root -m 644 packages.microsoft.gpg /usr/share/keyrings/
      sudo sh -c 'echo "deb [arch=amd64 signed-by=/usr/share/keyrings/packages.microsoft.gpg] \
      https://packages.microsoft.com/repos/code stable main" > /etc/apt/sources.list.d/vscode.list'
      sudo apt update
      sudo apt install code -y
          
    2. プログラムを開発するには、VS Code に Python プラグインをインストールします。

    結論は



    pip の使用ガイド

    1.ピップとは何ですか?

    2. pipの基本操作

    3. 先進的な機能

    4. よくある質問と解決策

    5. pip のベストプラクティス



    pip/cache/http-v2 フォルダー

    1. pip/cache/http-v2 フォルダーとは何ですか?

    2. http-v2 フォルダーの目的

    3. http-v2フォルダの管理

    4. 注意事項



    Pythonの基本的なデータ構造

    変数の型を確認する

    type() を使用する

    type()この関数はオブジェクトのタイプを返すことができます。

    
    x = 10
    print(type(x))   # <class 'int'>
    
    y = "hello"
    print(type(y))   # <class 'str'>
    

    isinstance() を使用する

    isinstance()変数が特定の型に属しているかどうかを確認するために使用され、複数の型のチェックをサポートします。

    
    x = 10
    
    print(isinstance(x, int))         # True
    print(isinstance(x, str))         # False
    print(isinstance(x, (int, float))) # True
    

    違い



    Python ブールデータ型

    Python のブール値は、True または False の 2 つの論理状態を表すプログラミングの基本的なデータ型です。これは、すべての条件判断とプロセス制御の基礎となります。

    1. ブール値と型

    a = 真
    b = 偽
    print(type(a)) # 出力: <class 'bool'>

    2. ボリンジャーと数字の関係

    Python の内部では、boolは整数ですintのサブカテゴリなので、数値演算に参加できます。

    print(True + 1) # 出力: 2 (1 + 1)
    print(False * 5) # 出力: 0 (0 * 5)

    3. 主な用途: 比較演算子

    比較演算子は 2 つの値を比較し、ブール値の結果を返します。

    オペレーター 説明する 結果
    == 等しい 10 == 10 True
    != 等しくない 5 != 10 True
    > より大きい 10 > 5 True
    <= 以下 5 <= 5 True

    4. 論理演算子

    論理演算子は、ブール値またはブール式を結合または変更するために使用されます。

    print(True と False) # 出力: False
    print(True または False) # 出力: True
    print(not True) # 出力: False

    5. 真理値テスト

    Python では、すべてのオブジェクトが真理値を持ちます。オブジェクトが条件判定に使用される場合、Python はそれを次のように変換します。TrueまたはFalse

    if []: # 空のリストは False として扱われます
        print("これは実行されません")
    それ以外の場合:
        print("リストは空です")
    
    if "hello": # 空でない文字列は True とみなされます
        print("文字列が空ではありません")


    Python 配列

    配列とは何ですか?

    Python では、配列は同じ型の複数の要素を格納するために使用されるデータ構造です。 Python 自体には組み込みの配列型はありませんが、次のように使用できます。listまたはarray同様の機能を実現するモジュール。

    リストを配列として使用する

    listこれは、さまざまなタイプのデータを保存できる Python の組み込みデータ構造ですが、配列のシミュレーションにも使用できます。

    my_list = [1、2、3、4、5]
    print(my_list[0]) # 出力: 1

    アレイモジュールの使用

    真の配列が必要な場合 (すべての要素が同じ型である必要があります)、次のように使用できます。arrayモッド。

    配列をインポートする
    
    my_array = array.array('i', [1, 2, 3, 4, 5])
    print(my_array[0]) # 出力: 1

    ここ、'i'配列内の要素が整数であることを示します。

    配列モジュールの基本操作

    基本的な操作をいくつか示します。

    配列とNumPy

    数値演算が必要な場合には、numpyより強力な配列サポートを提供します。

    numpyをnpとしてインポート
    
    my_numpy_array = np.array([1, 2, 3, 4, 5])
    print(my_numpy_array[0]) # 出力: 1

    NumPy 配列は多次元データとベクトル化された演算をサポートしているため、大量のデータの処理に最適です。

    結論は

    Python には配列関数を実装するためのさまざまな方法が用意されています。list一般的な状況に当てはまりますが、arrayモジュールは、同じタイプの要素が必要な状況に適していますが、numpyこれは科学計算に最適なツールです。



    リストが空かどうかを判断する

    変数の場合ret_value = [], Python 言語には、空のリストかどうかを判断する簡単で効率的な方法がいくつかあります。空のリストは次のように扱われるため、False, 以下に一般的に使用されるいくつかの判断方法を示します。

    1. ブール評価を使用します (Python で最も推奨される方法)

    これは最も一般的な方法で、リストのブール値を直接チェックします。リストが空の場合、not演算子はその条件を true に評価します (True)。

    ret_value = []
    
    ret_value でない場合:
        #リストが空の場合はここで実行
        print("ret_value は空のリストです")
    それ以外の場合:
        #リストが空でない場合はここで実行
        print("ret_value は空のリストではありません")

    2. 使用するlen()関数

    リストの長さが 0 に等しいかどうかを確認します。

    ret_value = []
    
    len(ret_value) == 0の場合:
        print("ret_value は空のリストです")
    それ以外の場合:
        print("ret_value は空のリストではありません")

    3. 同等の比較を使用する== []

    変数を空のリスト リテラルに直接代入する[]比較してみましょう。

    ret_value = []
    
    ret_value == []の場合:
        print("ret_value は空のリストです")
    それ以外の場合:
        print("ret_value は空のリストではありません")


    配列の動的な増減

    リストを使用した動的操作

    Pythonでは、listこれは、要素を簡単に追加および削除できる動的なデータ構造です。

    新しい要素を追加する

    新しい要素は、次の方法を使用して追加できます。

    # 新しい要素の例
    my_list = [1, 2, 3]
    my_list.append(4) # [1, 2, 3, 4]
    my_list.insert(1, 10) # [1, 10, 2, 3, 4]
    my_list.extend([5, 6]) # [1, 10, 2, 3, 4, 5, 6]

    要素の削除

    要素は以下を使用して削除できます。

    # 要素の削除例
    my_list = [1、2、3、4、5]
    my_list.pop() # [1, 2, 3, 4]
    my_list.remove(2) # [1, 3, 4]
    my_list.clear() # []

    配列モジュールを使用した動的操作

    同じタイプの要素が必要な場合は、次のように使用できます。arrayモッド。

    新しい要素を追加する

    append()そしてextend()メソッドの適用先arrayモッド。

    import array
    my_array = array.array('i', [1, 2, 3])
    my_array.append(4)  # [1, 2, 3, 4]
    my_array.extend([5, 6])  # [1, 2, 3, 4, 5, 6]
    

    要素の削除

    remove()そしてpop()使用できるメソッドarrayモッド。

    # 要素の削除例
    my_array = array.array('i', [1, 2, 3, 4])
    my_array.remove(2) # [1, 3, 4]
    my_array.pop() # [1, 3]

    結論は

    Python には、配列を動的に増減するさまざまなメソッドが用意されています。listそしてarrayモジュールはさまざまなニーズに適しています。より多くの機能要件が必要な場合は、次の使用を検討することもできます。numpy



    Python の配列カウント

    Pythonでは、list.count()統計に特化したツールです特定の要素の出現数方法。リストの長さを取得するのと同じですlen()それとは異なり、パラメータを比較オブジェクトとして渡す必要があります。


    1. list.count()の基本構文

    構文は次のとおりですlist.count(value)、リスト内に値が出現する回数を整数で返します。値が存在しない場合は 0 が返されます。

    果物 = ['リンゴ'、'バナナ'、'リンゴ'、'オレンジ'、'リンゴ']
    
    # 「apple」の出現数を数える
    apple_count = フルーツ.カウント('リンゴ')
    print(apple_count) # 出力: 3
    
    # 存在しない要素をカウントする
    グレープ_カウント = フルーツ.カウント('グレープ')
    print(grape_count) # 出力: 0

    2. 一般的な計数要件とツールの比較

    ニーズ (単一の要素、複数の要素、またはすべての統計を探しているかどうか) に応じて、さまざまなベスト プラクティスがあります。

    必要 推奨される方法 サンプルコード
    単一の特定の要素を数える list.count() arr.count(10)
    リストの全長を取得します len() len(arr)
    すべての要素の頻度を数えます collections.Counter Counter(arr)
    条件数 (5 を超える場合) ジェネレータ式 sum(1 for x in arr if x > 5)

    3. 高度なツール: collections.Counter

    リスト内に「すべての要素」が一度に何回出現するかを知る必要がある場合は、次を使用します。Counter何度も走りますcount()はるかに効率的です (O(n) と O(n^2) の比較)。

    コレクション輸入カウンターから
    
    データ = [1、2、2、3、3、3、4]
    カウント = カウンタ(データ)
    
    print(counts) # 出力: Counter({3: 3, 2: 2, 1: 1, 4: 1})
    print(counts[3]) # 回数を取得 3:3
    print(counts.most_common(1)) # 最も多く出現する要素を取得します

    4. 混乱しやすい使用上のリマインダー


    5. 実践的なスキル: 条件付きカウント

    特定のロジック (たとえば、長さが 3 を超える文字列) に準拠する要素の数を数えたい場合は、以下を組み合わせることができます。sum()

    単語 = ['こんにちは'、'こんにちは'、'Python'、'a'、'コード']
    
    # 長さ > 3 の単語の数を数える
    big_word_count = sum(len(w) > 3 の場合、単語内の w に対して 1)
    print(big_word_count) # 出力: 3


    2D リストを結合する

    要件の説明

    サンプルプログラム

    リスト1 = [
        ["a", 1],
        [「b」、2]、
        ["c"、3]
    ]
    
    リスト2 = [
        [「c」、30]、
        [「a」、10]、
        [「d」、40]
    ]
    
    #list1 を dict に変換します
    dict1 = {k: k の v、list1 の v}
    dict2 = {k: k の v、list2 の v}
    
    # すべてのキーを検索する
    all_keys =sorted(set(dict1.keys()) | set(dict2.keys()))
    
    # 結果をマージする
    結合 = []
    all_keys の k の場合:
        v1 = dict1.get(k)
        v2 = dict2.get(k)
        merged.append([k, v1, v2])
    
    マージされた行の場合:
        印刷(行)

    出力結果

    
    ['a', 1, 10]
    ['b', 2, None]
    ['c', 3, 30]
    ['d', None, 40]
    

    結論は



    2 つのリストを同時にループする

    Python では、2 つのリストがある場合 (例:selected_fields_listそしてaSqlValuesStr_list) を同時に反復処理する必要がある場合、最も一般的で Python 的な方法は、組み込みのzip()関数。

    1. zip()関数を使用する

    zip()この関数は、複数の反復可能オブジェクト (Iterable) を一連のタプルにパックします。ループの各反復により、各リストから対応する位置にある要素が削除されます。

    輸入再
    
    # これらが re.split() の後に取得される 2 つのリストであると仮定します。
    selected_fields = "名前、年齢、都市"
    aSqlValuesStr = "アリス、25 歳、台北"
    
    selected_fields_list = re.split(r',', selected_fields)
    aSqlValuesStr_list = re.split(r',', aSqlValuesStr)
    
    # forループを実行する
    フィールドの場合、zip 内の値 (selected_fields_list, aSqlValuesStr_list):
        print(f"フィールド: {フィールド}, 値: {値}")

    2. サンプル出力

    フィールド: 名前、値: アリス
    フィールド: 年齢、値: 25
    フィールド: 都市、値: 台北

    3. zip() に関する重要な注意事項

    使用するときはzip()関数を使用する場合は、次の点に注意する必要があります。

    #例: リストの長さが矛盾しています
    リスト1 = [1, 2, 3]
    リスト2 = ['a', 'b']
    
    zip(list1, list2)のitem1、item2の場合:
        print(項目1, 項目2)
    #出力は次のようになります:
    #1a
    #2b


    2D配列の表示を揃える

    フォーマットを使用してフィールドを整列する

    データ = [
        [1、23、456]、
        [7890、12、3]、
        [45、678、9]
    】
    
    # 各列の最大幅を計算します
    Col_widths = [max(len(str(row[i])) for row in data) for i in range(len(data[0]))]
    
    # 出力のフォーマット
    データ内の行の場合:
        print(" ".join(str(val).rjust(col_widths[i]) for i, val in enumerate(row)))

    出力結果

    
       1   23  456
    7890   12    3
      45  678    9
    

    表作成モジュールの使用

    サードパーティのパッケージtabulate整列されたテーブルを直接出力できます。

    
    from tabulate import tabulate
    
    data = [
        [1, 23, 456],
        [7890, 12, 3],
        [45, 678, 9]
    ]
    
    print(tabulate(data, tablefmt="grid"))
    

    出力結果

    
    +------+-----+-----+
    |    1 |  23 | 456 |
    | 7890 |  12 |   3 |
    |   45 | 678 |   9 |
    +------+-----+-----+
    

    結論は



    2次元配列浮動小数点数の整列出力

    説明する

    次の例は、2 次元リストを印刷する方法を示しています。要素がfloat小数点以下 2 桁の表示が修正され、フィールドの配置を維持したまま他の要素がそのまま出力されます。

    プログラム例

    データ = [
        [1、23.456、456]、
        [7890.1、12、3.5]、
        [45、678.9、9]
    ]
    
    # 各要素の文字列をフォーマットする
    フォーマットされたデータ = []
    データ内の行の場合:
        新しい行 = []
        行の val の場合:
            if isinstance(val, float):
                s = f"{val:.2f}" # float -> 小数点以下 2 桁
            それ以外の場合:
                s = str(val)
            new_row.append(s)
        formatted_data.append(new_row)
    
    # 各列の最大幅を計算します
    Col_widths = [max(len(row[i]) for row in formatted_data) for i in range(len(formatted_data[0]))]
    
    # 出力のフォーマット
    formatted_data の行の場合:
        print(" ".join(val.rjust(col_widths[i]) for i, val in enumerate(row)))

    出力結果

    
        1  23.46  456
    7890.10     12  3.50
       45  678.90     9
    

    集中



    辞書リストからすべての値を抽出します

    提供するデータ構造は複数の辞書を含むリストであり、各辞書は時系列レコード (K ライン データなど) を表します。

    data = [
        {'time': 1759028400000, 'open': '109398.3', 'close': '109364.8', 'high': '109489.2', 'low': '109364.8', 'volume': '518.7594'},
        {'time': 1759024800000, 'open': '109305.6', 'close': '109398.3', 'high': '109496.4', 'low': '109296.0', 'volume': '757.0290'},
        # ...
    ]

    すべてのレコードのすべての値を取得したい場合(1759028400000, '109398.3', '109364.8'など)それらをリストに収集すると、Nested List Comprehension を使用できます。

    1. すべての値を 1 つのリストに抽出します (平坦化)

    2 レベルのリスト内包表記を使用して、リスト内の各辞書を反復処理してから、.values()メソッドは値を取得し、最後にすべての値をフラット リストに収集します。

    データ = [
        {'時間': 1759028400000, '開値': '109398.3', '終値': '109364.8', '高値': '109489.2', '安値': '109364.8', '音量': '518.7594'},
        {'時間': 1759024800000、'開値': '109305.6'、'終値': '109398.3'、'高値': '109496.4'、'安値': '109296.0'、'音量': '757.0290'}
    ]
    
    すべての値 = [
        値
        for record in data # 外部リスト内の各辞書レコードを走査します
        for value in record.values() # 辞書レコード内のすべての値を走査します
    ]
    
    print(all_values)

    2. 結果の出力

    これにより、すべての値を含む単一のリストが作成されます。

    [1759028400000, '109398.3', '109364.8', '109489.2', '109364.8', '518.7594', 1759024800000, '109305.6', '109398.3', '109496.4', '109296.0', '757.0290']

    3. 特定のフィールドの値を抽出する

    特定のフィールドのみを抽出する必要がある場合 (例: すべてのフィールドのみ)open価格)、単一レベルのリスト内包表記を使用できます。

    data = [
        {'time': 1759028400000, 'open': '109398.3', ...},
        {'time': 1759024800000, 'open': '109305.6', ...}
    ]
    
    open_prices = [record['open'] for record in data]
    
    print(open_prices)

    出力結果:

    ['109398.3', '109305.6']


    辞書リストから特定のキーの値を抽出します。

    1. リスト内包表記を使用する (推奨) ✅

    リスト内包表記は、既存のリストから新しいリストを作成するための簡潔な 1 行の構文です。

    Pythonの実装例

    日時インポート日時から
    
    データリスト = [
        {'videoid': 'b5HxsaM_E2Y', 'publishedat': datetime(2025, 12, 7, 3, 0, 53), 'rankno': 7, 'viewcount': 913053, 'query': 'baseball'},
        {'videoid': 'FEbMCBxsoWI', 'publishedat': datetime(2025, 11, 25, 5, 28, 6), 'rankno': 13, 'viewcount': 754598, 'query': 'baseball'},
        {'videoid': 'nOJUI0PGB68', 'publishedat': datetime(2025, 12, 7, 3, 7, 46), 'rankno': 14, 'viewcount': 748349, 'query': 'baseball'},
        {'videoid': 'uMHXIudw_w0', 'publishedat': datetime(2025, 12, 2, 10, 1, 38), 'rankno': 8, 'viewcount': 687949, 'query': 'baseball'}
    ]
    
    target_key = 'ビデオID'
    
    # リスト内包表記を使用します: data_list の各辞書項目に対して、 item[target_key] を取り出します。
    video_ids = [data_list 内のアイテムの item[target_key]]
    
    print(f"抽出されたキー: {target_key}")
    print("すべてのビデオID値:")
    print(video_ids)

    出力結果

    ['b5HxsaM_E2Y', 'FEbMCBxsoWI', 'nOJUI0PGB68', 'uMHXIudw_w0']

    2. キーが存在しない可能性がある状況に対処する (安全なアクセス)

    リスト内の一部の辞書にターゲット キーがない可能性がある場合 (たとえば、一部の辞書に `videoid` キーがない場合)、`item[target_key]` を直接使用すると、`KeyError` エラーがスローされます。辞書の `.get()` メソッドまたは条件を使用して、辞書を安全に処理できます。

    Python実装例(セキュアアクセス)

    data_with_missing_key = [
        {'videoid': 'A1', 'query': 'フットボール'},
        {'query': 'basketball'}, # 'videoid' キーがありません
        {'videoid': 'C3', 'query': 'バレーボール'}
    】
    
    target_key = 'ビデオID'
    
    # オプション A: .get() を使用して、デフォルト値を None (または他の値) に設定します。
    safe_video_ids_A = [data_with_missing_key 内のアイテムの item.get(target_key)]
    # 出力: ['A1'、なし、'C3']
    
    # オプション B: そのキーを持つ値のみを抽出します
    safe_video_ids_B = [data_with_missing_key のアイテムの item[target_key]、アイテムの target_key の場合]
    # 出力: ['A1', 'C3']
    
    print(f"\n安全な抽出結果 (プラン B): {safe_video_ids_B}")


    辞書値をリストに変換する

    あなたからonesymbollist.values()取得された結果は Python 辞書ビュー オブジェクトですdict_values。これはリストのように見えますが、これは動的ビューであり、インデックスを付けたり変更したりできる標準のリストではありません。

    dict_values([1763510400000, '0.00015218', '0.00015336', '0.00015415', '0.00015067', '1634523'])

    表示しないdict_values()タグの内容を取得するには、組み込みのメソッドを使用するのが最も簡単で一般的な方法です。list()関数はそれをリストにキャストします。

    1.リスト(リスト)に変換する

    意思dict_valuesに渡されましたlist()ビューオブジェクト内のすべての要素を新しい標準リストにただちにコピーする関数。

    # これが取得した dict_values ビュー オブジェクトであると仮定します。
    dict_values_object = your_dictionary.values() # onesymbollist が辞書であると仮定します
    
    # ステップ: list() 関数を使用して変換します
    result_list = リスト(dict_values_object)
    
    print(結果リスト)

    出力結果

    [1763510400000, '0.00015218', '0.00015336', '0.00015415', '0.00015067', '1634523']

    2.タプルに変換する

    不変のシーケンスを作成することが目的の場合は、次のように使用できます。tuple()関数はそれをタプルに変換します。

    result_tuple = tuple(dict_values_object)
    
    print(result_tuple)

    出力結果

    (1763510400000, '0.00015218', '0.00015336', '0.00015415', '0.00015067', '1634523')

    3. 直接反復 (変換は必要ありません)

    ループ内で値を 1 つずつ処理するだけの場合は、明示的にリストに変換する必要はないことに注意してください。dict_valuesそれ自体は反復可能なオブジェクト (Iterable) です。

    # これが取得した dict_values ビュー オブジェクトであると仮定します。
    dict_values_object = your_dictionary.values()
    
    print("要素を1つずつ出力:")
    dict_values_object の値の場合:
        print(値)

    要約すると、使用しますlist(your_dict.values())これは、クリーンで実用的な値のリストを取得する最も一般的な方法です。



    辞書の値をカンマ区切りの文字列に変換します

    から始めるdict_valuesビュー オブジェクトからすべての値を抽出し、それらをカンマとスペースのみで区切られた単一の文字列に結合します (例:1763510400000, '0.00015218', ...)、次の手順を組み合わせる必要があります。

    1. 辞書から得るdict_valuesビューオブジェクト。
    2. このビューオブジェクト内のすべての要素を文字列型に変換します。
    3. Pythonの使用", ".join()これらの文字列を連結するメソッド。

    1.Pythonの実装

    元の辞書が次の名前であると仮定します。onesymbol_dict、文字列以外の値 (タイムスタンプなど) を文字列に変換して使用する必要があります。.join()接続を確立します。

    onesymbol_dict = {
        「時間」: 1763510400000、
        'オープン': '0.00015218',
        '閉じる': '0.00015336',
        '高': '0.00015415',
        '低': '0.00015067',
        'ボリューム': '1634523'
    }
    
    # ステップ 1 と2: 値を取得し、すべての値を文字列に変換します
    # リスト内包表記を使用して、すべての要素が文字列であることを確認します
    value_as_strings = [onesymbol_dict.values() の v に対する str(v)]
    
    # ステップ 3: ', '.join() を使用してこれらの文字列を結合します
    value_string = ", ".join(values_as_strings)
    
    print(値の文字列)

    2. 結果の出力

    これにより、外側の大括弧や角括弧のない、値のみが内容となる単一の文字列が生成されます。dict_valuesラベル:

    1763510400000, 0.00015218, 0.00015336, 0.00015415, 0.00015067, 1634523

    3. 文字列引用符に関する注意事項

    予想される出力例では、タイムスタンプ以外の値が一重引用符で囲まれていることに注意してください。1763510400000, '0.00015218', ...

    最終出力で文字列値が一重引用符を保持することが目標の場合、連結中に手動で引用符を追加する必要があります。これは通常、SQL ステートメントまたは特定の形式の文字列を準備するときに必要です。

    # 追加のステップ: 非整数値には引用符が必要であると想定して、引用符を手動で処理します
    引用値 = []
    onesymbol_dict.values() の v の場合:
        if isinstance(v, (str, float)) または (isinstance(v, int) および v< 1000000000000): # 假設小數字串需要引號
            quoted_values.append(f"'{v}'")
        else:
            quoted_values.append(str(v))
    
    final_quoted_string = ", ".join(quoted_values)
    
    print(final_quoted_string)

    これにより、期待どおりの形式が得られます(次のように仮定します)time引用符は必要ありません。他の数値文字列は必要です):

    1763510400000, '0.00015218', '0.00015336', '0.00015415', '0.00015067', '1634523'


    文字列が数値かどうかを判断する

    str.isdigit() を使用する

    isdigit()メソッドを使用して、文字列に数字のみが含まれているかどうかを確認できます。

    # 例
    文字列 = "12345"
    string.isdigit() の場合:
        print("は数値です")
    それ以外の場合:
        print("数値ではありません")

    知らせ:isdigit()小数点や負号は扱えません。

    小数を処理するには str.replace() を使用します

    小数点を含む文字列をチェックする必要がある場合は、使用する前に小数点を削除できます。isdigit()

    # 例
    文字列 = "123.45"
    if string.replace(".", "").isdigit():
        print("は数値です")
    それ以外の場合:
        print("数値ではありません")

    この方法は負の数では機能しません。

    try-excel を使用して数値に変換する

    最も一般的なアプローチは、文字列を浮動小数点または整数に変換し、変換が失敗した場合に例外をキャッチすることです。

    # 例
    文字列 = "-123.45"
    試してみてください:
        float(string) # 代わりに int(string) を使用して整数をチェックできます
        print("は数値です")
    ValueError を除く:
        print("数値ではありません")

    正規表現を使用する

    正規表現は、整数、小数、負の数を含む数値と正確に一致します。

    # 例
    輸入再
    
    文字列 = "-123.45"
    パターン = r"^-?\d+(\.\d+)?$"
    if re.match(パターン, 文字列):
        print("は数値です")
    それ以外の場合:
        print("数値ではありません")

    結論は

    単純な場合には、次を使用します。isdigit()。より複雑な場合(小数や負の数の処理など)には、次の使用をお勧めします。try-exceptまたは正規表現。



    Python f-string

    f-string (フォーマットされた文字列リテラル) は、Python 3.6 で導入された強力で効率的な文字列フォーマット方法です。変数や式の値を文字列に埋め込むための、簡潔で読みやすい方法を提供します。

    f-string の中心的な機能は、文字列の先頭にプレフィックスを使用することです。fまたはF、中括弧を使用する{}計算して表示する内容を含めます。

    1. 基本的な使い方:変数を埋め込む

    中括弧内に変数名を直接入れることができます。

    名前=「アリス」
    年齢=30歳
    message = f「こんにちは、私の名前は {name}、年齢は {age} です。」
    # 出力: こんにちは、私の名前はアリス、30 歳です。

    2. 埋め込み式

    f-string の利点は、有効な Python 式を中括弧内に置くことができ、それが実行時に評価されることです。

    価格 = 19.99
    税率 = 0.05
    合計 = 価格 * (1 + 税率)
    
    # f-string 内で計算を実行する
    result = f"税込みの合計価格は: {price * (1 + Tax_rate):.2f} 元です。"
    # 出力: 税込みの合計価格: 20.99 元。
    
    # 関数の呼び出し
    def get_status():
        「OK」を返します
    
    status_msg = f"システムステータス: {get_status()}"
    # 出力: システムステータス: OK

    3. 文字列のフォーマットと配置

    f 文字列のサポートと.format()コロンを使用した書式指定子ミニ言語と同じ方法:式と書式指定子を区切ります。

    フォーマットコード 使用 出力
    :.2f 小数点以下 2 桁の浮動小数点数 f"{3.14159:.2f}" 3.14
    : <10 左揃え、幅10 f"{'Name':<10}" Name
    : >10 右揃え、幅10 f"{'Value':>10}" Value
    :^10 中央揃え、幅10 f"{'Hi':^10}" Hi
    :, 数字の千の区切り文字 f"{1000000:,}" 1,000,000

    4. F ストリングのデバッグ

    Python 3.8 以降、f-string には、変数の後に等号を追加できる便利なデバッグ機能が導入されています。=、変数名とその値が自動的に表示されます。

    ユーザーID = 42
    is_active = True
    
    debug_output = f"ユーザー ID は {user_id=}、ステータス: {is_active=}"
    # 出力: ユーザー ID は user_id=42、ステータス: is_active=True

    5. 注意事項



    f-string は浮動小数点小数点を表示しません

    1. 解決策 1: f 文字列内の整数変換 (推奨)

    F 文字列の中括弧{}内部的には直接使用できますint()この関数は変数を整数型に変換し直します。これは最も明確で直接的な方法です。

    Pythonの実装例

    inta = 12 # 生の整数を仮定します
    float_a = inta * 2.0 # 結果は 24.0 (浮動小数点数)
    
    # f-string で浮動小数点数を直接整数に変換します
    result_str = f"abc def {int(float_a)}"
    
    print(f"元の値(float_a): {float_a}")
    print(f"フォーマットされた結果: {result_str}")

    2. オプション 2: f-string 形式指定子を使用する (形式指定子)

    書式設定ミニ言語の整数形式コードを使用できます。dまたは.0f出力形式を制御します。

    A. 整数形式のコードを使用する:d

    使用:dPython は、表示時に値を整数として扱うように求められます。変数の場合aは浮動小数点数であるため、Python は表示する前に自動的に最も近い整数に丸めます (計算結果が $24.0$ の場合は、$24$ が表示されます)。

    float_a = 24.0
    result_d = f"abc def {float_a:d}"
    # 出力: abc def 24

    B. 浮動小数点形式のコードを使用する:.0f

    使用:.0f値を浮動小数点数としてフォーマットしますが、小数点以下の桁は 0 桁である必要があることを意味します。これにより、表示前に結果が丸められます。

    float_a = 24.0
    result_0f = f"abc def {float_a:.0f}"
    # 出力: abc def 24

    要約と提案

    結果が小数点のない絶対整数であることを確認することが目的の場合は、オプション 1 を使用することをお勧めします。

    str = f"abc def {int(a)}"


    Pythonのre.split関数

    Pythonでは、re.split()機能はre(正規表現) モジュールの強力なツール。正規表現で定義された区切り文字 (パターン) に従って文字列を分割し、結果をリスト (リスト) として返すために使用されます。

    1. 関数の構文

    re.split(pattern, string, maxsplit=0, flags=0)

    2. 基本的な使い方

    正規表現を使用して、複数または複雑な区切り文字を定義します。

    輸入再
    
    text = "リンゴ、バナナ、オレンジ、ブドウ"
    # 区切り文字としてカンマ、セミコロン、またはハイフンを使用します
    result = re.split(r'[;,-]', text)
    
    印刷(結果)
    # 出力: ['リンゴ'、'バナナ'、'オレンジ'、'グレープ']

    3. 複数のスペースの処理 (一般的な用途)

    標準的な文字列を使用した場合split()違う、re.split()複数の連続する区切り文字 (複数のスペースなど) は簡単に処理して無視できます。

    テキスト = "単語 1 単語 2 単語 3"
    # \s+ を使用して 1 つ以上の空白文字を区切り文字として一致させます
    result = re.split(r'\s+', text)
    
    印刷(結果)
    # 出力: ['Word1', 'Word2', 'Word3']

    4. maxsplit を使用してカット数を制限する

    設定されている場合maxsplitの場合、切り取り操作は指定された回数だけ実行され、残りの部分は最後の要素としてリストに保持されます。

    テキスト = "1:2:3:4"
    # カットは一度だけ
    結果 = re.split(r':', テキスト, maxsplit=1)
    
    印刷(結果)
    # 出力: ['1', '2:3:4']

    5. 区切り文字を保持する

    括弧内に区切り文字パターンを配置すると、()の場合、区切り文字自体も結果リストの要素の間に含まれます。

    テキスト = "2025-01-15"
    # 保持されるようにハイフンを括弧内に入れます
    result = re.split(r'(-)', text)
    
    印刷(結果)
    # 出力: ['2025', '-', '01', '-', '15']


    文字列の先頭を判定する

    使用

    startswith()は Python 文字列 (str) オブジェクト メソッド。文字列が指定された部分文字列で始まるかどうかを判断するために使用されます。 一致した場合は返すTrue;それ以外の場合は戻るFalse

    文法

    
    str.startswith(prefix[, start[, end]])
    

    パラメータの説明

    戻り値

    ブール値: 文字列が指定されたプレフィックスで始まる場合、戻り値True、さもないとFalse

    text = "Python プログラミング"
    
    #基本的な使い方
    print(text.startswith("Py")) # True
    print(text.startswith("Java")) # False
    
    #範囲指定
    print(text.startswith("thon", 2)) # True (インデックス 2 から始まるのは "thon")
    
    # 複数のアライメント
    print(text.startswith(("Py", "Java", "C"))) # True、一致するものがあるため
    
    # 大文字と小文字は区別されません(最初に小文字に変換できます)
    print(text. lower().startswith("py")) # True

    一般的なアプリケーション

    伸ばす

    文字列が特定のテキストで「終わる」かどうかを判断するには、次を使用できます。endswith()メソッド、構文、startswith()同じ。

    ファイル名 = "レポート.pdf"
    if filename.endswith(".pdf"):
        print("これはPDFファイルです")


    文字列の最後の文字を削除します

    説明する

    Python では、文字列は不変オブジェクトです。 最後の文字を削除するには、通常、文字列のスライスを使用して新しい文字列を作成します。

    テキスト = "こんにちは!"
    
    #方法 1: スライスを使用する
    new_text = テキスト[:-1]
    print(new_text) #出力: こんにちは
    
    #方法 2: rstrip() を使用して特定の終了文字を削除する
    text2 = "こんにちは!!!"
    new_text2 = text2.rstrip("!")
    print(new_text2) #出力: こんにちは
    
    #方法 3: 空でないことを確認してから最後の文字を削除する
    テキストの場合:
        テキスト = テキスト[:-1]
    印刷(テキスト)

    出力結果

    
    Hello
    Hello
    Hello
    

    説明する

    伸ばす

    先頭の文字を削除するには、次を使用します。

    
    text = text[1:]
    

    要約する



    文字列内の部分文字列の前のコンテンツを検索します

    問題文

    文字列を与えるstr1で見つかることを願っていますstrAまたはstrBその前にある部分。例えば:

    str1 = "Hello World, this is a test. Stop here or continue."
    strA = "Stop"
    strB = "continue"
    

    目標は取得することです"Hello World, this is a test. "

    re.split() を使用する

    re.split()複数のキーワードに基づいて文字列を分割し、最初の部分を取得できます。

    import re
    
    def get_substring_before(text, strA, strB):
        result = re.split(f"{re.escape(strA)}|{re.escape(strB)}", text, maxsplit=1)[0]
        return result
    
    str1 = "Hello World, this is a test. Stop here or continue."
    strA = "Stop"
    strB = "continue"
    
    print(get_substring_before(str1, strA, strB))  # "Hello World, this is a test. "
    

    re.search() を使用する

    re.search()一致するために使用できますstrAまたはstrB、一致する前にコンテンツを取得します。

    import re
    
    def get_substring_before(text, strA, strB):
        match = re.search(f"{re.escape(strA)}|{re.escape(strB)}", text)
        return text[:match.start()] if match else text
    
    str1 = "Hello World, this is a test. Stop here or continue."
    print(get_substring_before(str1, "Stop", "continue"))  # "Hello World, this is a test. "
    

    find()メソッドを使用する

    find()最も古いものを手動で検索できますstrAまたはstrBをクリックして、対応する部分を取得します。

    def get_substring_before(text, strA, strB):
        indexA = text.find(strA)
        indexB = text.find(strB)
        
        indices = [i for i in [indexA, indexB] if i != -1]
        first_index = min(indices, default=len(text))
        
        return text[:first_index]
    
    str1 = "Hello World, this is a test. Stop here or continue."
    print(get_substring_before(str1, "Stop", "continue"))  # "Hello World, this is a test. "
    

    結論は



    複数の値を文字列に連結します

    結合を使用します (最初にすべてを文字列に変換する必要があります)

    値 = ["str1", "str2", 123, "str3", 456]
    
    s = ", ".join(値の v に対する str(v))
    print(s) # 出力: str1、str2、123、str3、456

    文字列と整数の混合を自動的に処理する

    def join_values(*args, sep=", "):
        return sep.join(str(v) for v in args)
    
    print(join_values("str1", "str2", 88, "str3"))
    # 出力: str1、str2、88、str3

    ソースが辞書の場合、キーでソートしてから連結します

    データ = {
        "str1": "こんにちは",
        "str2": "ワールド",
        "int1": 123、
        "str3": "わかりました"
    }
    
    # キーでソートしてから結合する
    s = ", ".join(str(data[k]) for k insorted(data.keys()))
    print(s) # hello、world、123、ok

    キーと値を結合するには

    s = ", ".join(f"{k}={v}" for k, v in data.items())
    印刷する
    # 出力: str1=hello、str2=world、int1=123、str3=ok

    ソースは辞書のリストであり、各辞書は 1 つの列に結合されます。

    rows = [
        {"str1": "A", "int1": 10},
        {"str1": "B", "int1": 20},
    ]
    
    for row in rows:
        print(", ".join(str(v) for v in row.values()))
    # A, 10
    # B, 20
    

    ユニバーサル機能: 「引用符あり」モードと「引用符なし」モードの切り替え

    def join_values(values, sep=", ", quote=False):
        引用された場合:
            # 完全な一重引用符「 」を使用します
            return sep.join(f"‘{v}’" for v in value)
        それ以外の場合:
            return sep.join(str(v) for v in value)
    
    値 = ["str1", "str2", 88, "str3"]
    
    print(join_values(values, quote=False))
    # 出力: str1、str2、88、str3
    
    print(join_values(values, quote=True))
    # 出力: 'str1'、'str2'、'88'、'str3'

    *args 入力バージョンをサポートできます

    def join_args(*args, sep=", ", quoted=False):
        if quoted:
            return sep.join(f"‘{v}’" for v in args)
        return sep.join(str(v) for v in args)
    
    print(join_args("str1", "str2", 88, "str3", quoted=True))
    # ‘str1’, ‘str2’, ‘88’, ‘str3’
    

    dict をサポート (出力値のみ)

    data = {"str1": "hello", "str2": "world", "int1": 123}
    
    print(join_values(data.values(), quoted=True))
    # ‘hello’, ‘world’, ‘123’
    

    key=value形式をサポート

    def join_key_value(d, sep=", ", quoted=False):
        if quoted:
            return sep.join(f"{k}=‘{v}’" for k, v in d.items())
        return sep.join(f"{k}={v}" for k, v in d.items())
    
    print(join_key_value(data, quoted=True))
    # str1=‘hello’, str2=‘world’, int1=‘123’
    


    re.match()

    re.match()

    パイソンre.match正規表現モジュール内の関数で、文字列の先頭から一致させるために使用されます。 一致が成功した場合は、Match物体;それ以外の場合は戻るNone

    文法

    re.match(pattern, string, flags=0)

    パラメータの説明:

    共通のプロパティとメソッド

    使用例

    輸入再
    
    #文字列を定義する
    text = "123 Hello World!"
    
    # re.match を使用して番号を先頭から照合します
    match = re.match(r"(\d+)\s+(.*)", text)
    
    一致する場合:
        print(f"一致結果全体: {match.group(0)}") # 123 Hello World!
        print(f"数値部分: {match.group(1)}") # 123
        print(f"テキスト部分: {match.group(2)}") # Hello World!
    それ以外の場合:
        print("一致に失敗しました")

    出力結果

    整个適合結果: 123 Hello World!
    数字部分:123
    テキスト部分: Hello World!

    注意事項

    正規表現

    正規表現 (略して Regex) は、文字列一致ルールを記述するために使用される構文です。文字列の検索、置換、検証によく使用されます。 Pythonでreモジュールでは、patternこれがこれらのルールを定義する中心部分です。

    基本的な構文要素

    高度な使用法

    輸入再
    
    # 例 1: 数字で始まるコンテンツの一致
    パターン = r"^\d+"
    テキスト = "123abc"
    match = re.match(パターン, テキスト)
    一致する場合:
        print(f"マッチング結果: {match.group()}") # 出力: 123
    
    #例 2: 数字の後のテキストと一致する
    パターン = r"(\d+)\s+(.*)"
    text = "123 ハローワールド"
    match = re.match(パターン, テキスト)
    一致する場合:
        print(f"数値部分: {match.group(1)}") # 出力: 123
        print(f"テキスト部分: {match.group(2)}") # 出力: Hello World

    正規表現の応用シナリオ



    re.search()の応用

    基本的な使い方

    re.search()文字列内の正規表現に最初に一致するものを検索し、それを返すために使用されます。Matchオブジェクト、一致しない場合に返されるNone

    輸入再
    
    text = "こんにちは 2024 年!"
    match = re.search(r"\d+", text)
    
    一致する場合:
        print("見つかった番号:", match.group()) # 2024

    Match オブジェクトを返す

    いつre.search()一致するものが見つかった場合は返されますMatchオブジェクトは次の方法で情報にアクセスできます。

    輸入再
    
    text = "Python 3.10 は素晴らしいです!"
    match = re.search(r"\d+\.\d+", text)
    
    一致する場合:
        print("一致する内容:", match.group()) # 3.10
        print("開始インデックス:", match.start()) # 7
        print("終了インデックス:", match.end()) # 11
        print("範囲:", match.span()) # (7, 11)

    グループマッチングを使用する

    括弧を通して()グループを作成して使用するにはgroup(n)対応する一致するコンテンツを抽出します。

    輸入再
    
    text = "ジョン・ドゥ、年齢: 25"
    match = re.search(r"(\w+) (\w+), 年齢: (\d+)", text)
    
    一致する場合:
        print("姓:", match.group(1)) # ジョン
        print("name:", match.group(2)) # Doe
        print("年齢:", match.group(3)) # 25

    re.findall() との比較

    re.search()最初に一致した結果のみが返されますが、re.findall()一致するすべての結果が返されます。

    import re
    
    text = "Price: $10, Discount: $2, Tax: $1"
    
    match = re.search(r"\$\d+", text)
    print("re.search:", match.group())  # $10
    
    matches = re.findall(r"\$\d+", text)
    print("re.findall:", matches)  # ['$10', '$2', '$1']
    

    結論は

    re.search()最初に一致する結果を見つけるのに適しており、次の用途に使用できます。Match詳細情報を取得するオブジェクト。複数の一致結果を得るには、次を使用します。re.findall()



    正規表現の非キャプチャ グループ

    マッチングパフォーマンスの向上

    正規表現では、(...)一致するコンテンツがキャプチャされ、保存されます。group(n)、ただしキャプチャグループではありません(?:...)これは組織構造にのみ使用され、グループ番号には影響しないため、マッチングが高速になります。

    グループインデックスへの影響を避ける

    正規表現で使用する場合()に影響を与えるマッチング条件を整理するためgroup(n)番号。使用(?:...)これにより、グループ インデックスが変更されないことが保証されます。

    import re
    
    text = "2024-03-12"
    pattern = r"(\d{4})-(?:\d{2})-(\d{2})"
    
    match = re.search(pattern, text)
    print(match.group(1))  # 2024
    print(match.group(2))  # 12
    

    OR 演算子と組み合わせる

    使用(?:...|...)させられる|演算子は、一致するコンテンツには影響しますが、グループ アクセスには影響しません。

    import re
    
    text = "bar123"
    pattern = r"(?:foo|bar|baz)\d+"
    
    match = re.search(pattern, text)
    print(match.group())  # bar123
    

    --user-data-dir 解析に適用されます

    Chrome パラメータを解析するときは、次を使用します。(?:...)これにより、一致する形式がグループ番号に影響を与えなくなります。

    import re
    
    cmdline = '--user-data-dir="C:\\Users\\moirg\\AppData\\Local\\Google\\Chrome\\User Data"'
    
    match = re.search(r'--user-data-dir=(?:"([^"]+)"|(\S+))', cmdline)
    user_data_dir = match.group(1) or match.group(2)
    
    print(user_data_dir)  # C:\Users\moirg\AppData\Local\Google\Chrome\User Data
    

    結論は

    (?:...)正規表現のパフォーマンスを向上させ、グループ インデックスへの影響を回避でき、次の用途に適しています。|操作と特定の条件のマッチングにより、コードがより効率的かつ明確になります。



    Python の日時

    インポートモジュール

    import datetime

    現在時刻を取得する

    now = datetime.datetime.now()
    print(now)

    指定した時間を作成する

    dt = datetime.datetime(2025, 7, 2, 14, 30, 0)
    print(dt)

    時刻文字列のフォーマット

    now = datetime.datetime.now()
    formatted = now.strftime("%Y-%m-%d %H:%M:%S")
    print(formatted)

    時間文字列を解析する

    dt_str = "2025-07-02 14:30:00"
    parsed = datetime.datetime.strptime(dt_str, "%Y-%m-%d %H:%M:%S")
    print(parsed)

    時間の足し算と引き算

    now = datetime.datetime.now()
    delta = datetime.timedelta(days=7)
    next_week = now + delta
    print(next_week)

    今日の日付を取得する

    today = datetime.date.today()
    print(today)

    日付を比較する

    dt1 = datetime.datetime(2025, 7, 1)
    dt2 = datetime.datetime(2025, 7, 2)
    print(dt1 < dt2)

    時差を取得する

    dt1 = datetime.datetime(2025, 7, 1, 12, 0, 0)
    dt2 = datetime.datetime(2025, 7, 2, 14, 30, 0)
    diff = dt2 - dt1
    print(diff)
    print(diff.total_seconds())

    曜日を取得する

    今日 = datetime.date.today()
    print(today.weekday()) # 0 = 月曜日、6 = 日曜日


    日時のタイムゾーンの問題

    オフセット ナイーブおよびオフセット対応の日時減算エラー

    一方の datetime オブジェクトにはタイム ゾーンがなく (ナイーブ)、もう一方にはタイム ゾーンがある (認識) 場合に減算すると、次のようになります。

    TypeError: can't subtract offset-naive and offset-aware datetimes
    

    datetime がナイーブであるか認識しているかを確認する

    from datetime import datetime
    
    def is_aware(dt):
        return dt.tzinfo is not None and dt.tzinfo.utcoffset(dt) is not None
    
    def is_naive(dt):
        return not is_aware(dt)
    
    dt1 = datetime.now()                 # naive
    dt2 = datetime.now().astimezone()    # aware
    
    print(is_naive(dt1), is_aware(dt1))
    print(is_naive(dt2), is_aware(dt2))
    

    解決策 A: 認識型に変換する (推奨)

    タイムゾーンを越える状況や、正確な時間計算が必要な場合に適しています。

    from datetime import datetime、timezone
    
    sql_dt = sql_dt.replace(tzinfo=timezone.utc) # SQL データ転送を認識
    now_dt = datetime.now(timezone.utc) # 現在の時刻を認識するように使用します
    
    diff = now_dt - sql_dt
    print(diff.total_秒())

    解決策 B: ナイーブに変換する (推奨されません。タイムゾーンの違いは無視されます)

    sql_dt = sql_dt.replace(tzinfo=None)
    now_dt = datetime.now()
    
    diff = now_dt - sql_dt
    

    要約する



    系列の標準偏差を計算する

    説明する

    Python では、組み込みモジュールを使用できますstatisticsstdev()またはpstdev()標本標準偏差または母集団標準偏差を計算します。

    統計をインポートする
    
    比率 = [2.3, 2.8, 3.1, 2.5, 3.0]
    
    # 平均
    平均 = 合計(比率) / len(比率)
    
    #サンプル標準偏差 (n-1)
    std_sample = 統計.stdev(比率)
    
    #行列標準偏差 (n)
    std_population = 統計.pstdev(比率)
    
    print(f"平均: {平均:.2f}")
    print(f"サンプル標準偏差: {std_sample:.3f}")
    print(f"母集団標準偏差: {std_population:.3f}")

    出力結果

    平均: 2.74
    サンプル標準偏差: 0.303
    母集団標準偏差: 0.271

    計算式の方法(MODを使わない)

    頼りたくないならstatisticsモジュールでは、数式を使用して自分で計算できます。

    比率 = [2.3, 2.8, 3.1, 2.5, 3.0]
    平均 = 合計(比率) / len(比率)
    
    #標準偏差 (母集団)
    分散 = sum((x - 平均) ** 比率の x には 2) / len(比率)
    std_dev = 分散 ** 0.5
    
    print(f"標準偏差: {std_dev:.3f}")

    出力結果

    標準偏差: 0.271

    相違点の説明

    要約する



    Python は ANSI カラー文字列を表示します

    基本的な例

    # ANSI カラーコードの例
    print("\033[31m 赤文字\033[0m")
    print("\033[32m 緑色のテキスト\033[0m")
    print("\033[33m黄色のテキスト\033[0m")
    print("\033[34m 青文字\033[0m")
    print("\033[35m 紫色のテキスト\033[0m")
    print("\033[36m シアンのテキスト\033[0m")
    print("\033[37m 白文字\033[0m")

    太字と背景色

    print("\033[1;31m 太字の赤文字\033[0m")
    print("\033[42m 緑色の背景テキスト\033[0m")

    カスタム色の組み合わせ

    # 格式: \033[样式;前景色;背景色m
    # スタイル: 0=デフォルト、1=太字、4=下線
    # 前景色: 30~37
    # 背景色: 40~47
    
    print("\033[1;33;44m 太字の黄色のテキスト + 青色の背景\033[0m")

    関数にカプセル化できる

    def color_text(text, color_code):
        f"\033[{color_code}m{text}\033[0m"を返す]
    
    print(color_text("警告!", "1;31")) # 太字の赤
    print(color_text("成功!", "1;32")) # 太字の緑色


    現在の端末が ANSI カラーをサポートしているかどうかを確認する

    方法 1: sys.stdout.isatty() を確認する

    インポートシステム
    
    sys.stdout.isatty() の場合:
        print("端末は ANSI カラーをサポートしている可能性があります")
    それ以外の場合:
        print("カラーに対応していないファイルまたは出力環境の可能性があります")

    方法 2: colorama を使用する (クロスプラットフォーム ソリューション)

    輸入コロラマ
    colorama.init()
    
    print("\033[32mこのテキストは緑色でなければなりません\033[0m")

    方法 3: 実際のテスト出力

    def support_ansi():
        試してみてください:
            print("\033[31m テストレッド\033[0m")
            Trueを返す
        以下を除く:
            Falseを返す
    
    print("ANSI はサポートされています" ifsupports_ansi() else "ANSI はサポートされていません")

    補充する



    Python 入力はオートコンプリートをサポートします

    説明する

    Pythonでは、input()機能自体は対応していないTab自動的に完了します。 この機能を実現するには、以下を組み合わせることができますreadlineユーザーが使用できるようにするモジュールTabオートコンプリートを実行します (Bash または IPython と同様)。

    基本的な例

    リードラインをインポートする
    
    # 補完できる文字列のリストを定義します
    WORDS = ['リンゴ'、'バナナ'、'チェリー'、'ブドウ'、'オレンジ'、'スイカ']
    
    def コンプリーター(テキスト、状態):
        """オートコンプリート機能: 入力された接頭辞に基づいて利用可能な文字列を比較します"""
        options = [w for w in WORDS if w.startswith(text)]
        if 状態 <;長さ(オプション):
            戻り値のオプション[状態]
        それ以外の場合:
            なしを返す
    
    # 補完機能を有効にする
    readline.set_completer(コンプリーター)
    readline.parse_and_bind('タブ: 完了')
    
    # ユーザー入力 (タブをサポート)
    user_input = input("果物の名前を入力してください (Tab キーを押して入力できます): ")
    print(f"入力した内容は: {user_input}")

    取扱説明書

    詳細: 動的補完

    現在のコンテキストまたは動的コンテンツに基づいて補完リストを更新することもできます。

    リードラインをインポートする
    
    defdynamic_completer(テキスト、状態):
        current_words = ['猫'、'車'、'犬'、'アヒル'、'鹿']
        options = [w for w in current_words if w.startswith(text)]
        if 状態 <;長さ(オプション):
            戻り値のオプション[状態]
        なしを返す
    
    readline.set_completer(dynamic_completer)
    readline.parse_and_bind('タブ: 完了')
    
    command = input("動物の名前を入力してください: ")
    print("次を入力します:", コマンド)

    注意事項

    要約する



    Pythonプロセス

    Python ループ

    range() 付きの場合

    最も一般的なループは、固定回数またはシーケンスを実行するために使用されます。

    #0から4まで
    range(5) の i の場合:
        print(i) #0,1,2,3,4
    
    #開始点、終了点、ステップサイズを指定します
    range(2, 10, 2) の i の場合:
        print(i) #2,4,6,8

    反復可能なオブジェクトの場合

    リスト、文字列、辞書などを直接反復します。

    果物 = [「リンゴ」、「バナナ」、「チェリー」]
    
    果物の中の果物の場合:
        プリント(フルーツ)
    
    「こんにちは」の ch の場合:
        印刷(ch)
    
    #辞書を反復処理する
    person = {"名前": "トム", "年齢": 25}
    person.items() のキーと値の場合:
        print(キー, 値)

    while ループ

    条件が True の場合は常に実行されます。

    
    count = 0
    while count < 5:
        print(count)
        count += 1
    

    中断して継続する

    ループ処理を制御します。

    range(10) 内の i の場合:
        i == 3の場合:
            続行 # 今回はスキップします
        i == 7の場合:
            休憩 # 早めに終了
        印刷(i)

    ネストされたループ

    サークルに戻ってサークルに戻します。

    
    for i in range(3):
        for j in range(2):
            print(f"i={i}, j={j}")
    

    else のループマッチング

    for または while を追加できますelseの場合は「正常終了(ブレークなし)」のみ実行されます。

    range(5) の i の場合:
        印刷(i)
    それ以外の場合:
        print("ループが正常に終了")

    リストの内包理解

    簡潔な記述方法では、1 行でループを完了し、リストを生成できます。

    
    squares = [x**2 for x in range(5)]
    print(squares)  # [0,1,4,9,16]
    

    結論は



    Pythonの例外処理

    基本的な文法構造

    Python は、try...Except ステートメントを使用して、プログラムの実行中に発生するエラーをインターセプトして処理し、プログラムのクラッシュを防ぎます。

    試してみてください:
        # 例外を引き起こす可能性のあるコード
        結果=10/0
    ZeroDivisionError を除く:
        # 特定の例外が発生したときに実行されるコード
        print("除数をゼロにすることはできません")
    e としての例外を除く:
        #他のすべてのタイプの例外をキャッチする
        print(f"エラーが発生しました: {e}")
    それ以外の場合:
        # tryブロックで例外が発生しなければ実行
        print("正常に動作しています")
    最後に:
        # 例外発生の有無に関わらず実行される
        print("リソースをクリーンアップするか、ファイルを閉じる")

    ブロック機能の説明

    複数の例外をキャッチする

    例外でタプルを使用すると、複数のエラー タイプを同時に処理できます。

    試してみてください:
        # 操作を実行する
        パスする
    (ValueError、TypeError) を除く:
        print("入力されたデータ型または値が正しくありません")

    積極的に例外をスローする

    raise キーワードを使用して、論理要件に基づいて例外を手動でトリガーします。

    age = -1
    if age < 0:
        raise ValueError("年齡數值不可為負數")

    ベストプラクティス



    Pythonのカテゴリ

    1. カテゴリの基本概念

    Python クラスは、データと動作をカプセル化するために使用される構造です。カテゴリは、カテゴリのインスタンスであるオブジェクトを作成するために使用されます。例えば:
    クラスMyClass:
        def __init__(self, value):
            self.value = 値
    
        デフォルト表示(自分自身):
            print(f"値: {self.value}")
    
    obj = MyClass(10)
    obj.display() # 出力: 値: 10

    2. 静的方法

    静的メソッドは `@staticmethod` デコレータを使用して定義され、カテゴリやオブジェクトとは何の関係もありません。カテゴリ プロパティやオブジェクト プロパティにはアクセスできません。一部の楽器機能に適用されます。

    クラスMyClass:
        @静的メソッド
        def add(a, b):
            a + bを返す
    
    結果 = MyClass.add(5, 3)
    print(結果) # 出力: 8

    3. クラスメソッド

    クラスメソッドは `@classmethod` デコレータを使用して定義され、最初のパラメータはクラス自体 (通常は `cls` という名前) であり、クラス属性にアクセスできます。

    クラスMyClass:
        カウント = 0
    
        @クラスメソッド
        デフォルトの増分カウント(cls):
            cls.カウント += 1
    
    MyClass.increment_count()
    print(MyClass.count) # 出力: 1

    4. 継承とポリタイプ

    Python はクラスの継承をサポートしています。サブクラスは親クラスのプロパティとメソッドを継承し、親クラスのメソッドをオーバーライドできます。

    クラスの親:
        デフォルトの挨拶(自分自身):
            print("親からこんにちは!")
    
    クラス子(親):
        デフォルトの挨拶(自分自身):
            print("子供からこんにちは!")
    
    obj = 子()
    obj.greet() # 出力: Child からこんにちは!

    5. カテゴリ属性とオブジェクト属性

    カテゴリ属性はカテゴリ全体に属し、すべてのオブジェクトで共有されます。オブジェクト属性は各オブジェクトに属します。

    クラスMyClass:
        class_attr = "私はクラス属性です"
    
        def __init__(self, value):
            self.instance_attr = 値
    
    obj1 = MyClass(10)
    obj2 = MyClass(20)
    
    print(MyClass.class_attr) # 出力: 私はクラス属性です
    print(obj1.instance_attr) # 出力: 10
    print(obj2.instance_attr) # 出力: 20

    6. オブジェクトを基本クラスとして使用する

    Python のすべてのクラスはデフォルトで `object` を継承します。これは、`__str__` や `__eq__` などのいくつかの基本メソッドを提供する組み込み基本クラスです。

    クラスMyClass(オブジェクト):
        def __init__(self, value):
            self.value = 値
    
        def __str__(自分自身):
            return f"値が {self.value} の MyClass"
    
    obj = MyClass(5)
    print(obj) # 出力: 値 5 の MyClass

    7. まとめ

    - **静的メソッド**: カテゴリに依存せず、主にツール機能に使用されます。 - **クラス メソッド**: カテゴリ レベルでデータを操作します。 - **オブジェクト メソッド (インスタンス メソッド)**: オブジェクト レベルのデータを操作します。 - **継承とポリタイプ**: コードの再利用と柔軟な設計をサポートします。 - **オブジェクト基本クラス**: すべてのカテゴリが一貫した動作を持つようにするための基本的なメソッドを提供します。

    クラスの継承

    1. 基本的な継承の概念

    Python では、クラスの継承により、サブクラス (派生クラス) が親クラス (基本クラス) のプロパティとメソッドを継承して、コードの再利用が可能になります。例えば:

    クラスの親:
        デフォルトの挨拶(自分自身):
            print("保護者からこんにちは!")
    
    クラス子(親):
        パスする
    
    c = 子()
    c.greet() # 出力: 親からこんにちは!

    2. サブクラスが親クラスのメソッドをオーバーライドする

    サブクラスは、親クラスのメソッドをオーバーライド (Override) し、その関数を書き換えることができます。

    クラスの親:
        デフォルトの挨拶(自分自身):
            print("保護者からこんにちは!")
    
    クラス子(親):
        デフォルトの挨拶(自分自身):
            print("子供からこんにちは!")
    
    c = 子()
    c.greet() # 出力: Child からこんにちは!

    3. super() を使用して親クラスのメソッドを呼び出します。

    サブクラスでは、`super()` を通じて親クラスのメソッドを呼び出し、親クラスの動作を拡張できます。

    クラスの親:
        デフォルトの挨拶(自分自身):
            print("親からこんにちは!")
    
    クラス子(親):
        デフォルトの挨拶(自分自身):
            super().greet()
            print("子供からこんにちは!")
    
    c = 子()
    c.greet()
    # 出力:
    #保護者の方からこんにちは!
    #チャイルドからこんにちは!

    4. 多重継承

    Python は多重継承をサポートしており、サブクラスは同時に複数の親クラスを継承できます。

    クラス親1:
        デフォルトの挨拶(自分自身):
            print("親 1 からこんにちは!")
    
    クラス親2:
        デフォルトの挨拶(自分自身):
            print("Parent2 からこんにちは!")
    
    クラス子(親1, 親2):
        パスする
    
    c = 子()
    c.greet() # 出力: Parent1 からこんにちは! (相続順位による)

    5. メソッド解決順序 (MRO)

    多重継承では、MRO (メソッド解決順序) を使用してメソッドの解決順序を決定します。これは、`__mro__` 属性を使用して確認できます。

    print(Child.__mro__)
    # 出力: (, , , )
    

    6. 抽象基本クラス

    `abc` モジュールを使用して抽象基本クラスを定義し、サブクラスに特定のメソッドの実装を強制します。

    from abc import ABC、abstractmethod
    
    クラス AbstractParent(ABC):
        @abstractmethod
        デフォルトの挨拶(自分自身):
            パスする
    
    クラス子(抽象親):
        デフォルトの挨拶(自分自身):
            print("子供からこんにちは!")
    
    c = 子()
    c.greet() # 出力: Child からこんにちは!

    7. まとめ

    - 継承により、クラス コードがより再利用可能になり、拡張可能になります。 - サブクラスは親クラスのメソッドをオーバーライドし、`super()` を使用して親クラスのメソッドを呼び出すことができます。 - 多重継承をサポートしますが、メソッド解決順序 (MRO) に注意する必要があります。 - 抽象基本クラスを使用すると、サブクラスに特定のメソッドを強制的に実装させることができ、これはインターフェイス設計に適しています。

    ClassBを継承する一時クラスを作成する

    サンプルコード

    クラスクラスB:
        デフォルトの挨拶(自分自身):
            print("クラスBからこんにちは!")
    
    # ClassB から継承した一時クラスを動的に作成
    TempClass = type('TempClass', (ClassB,), {
        'greet': lambda self: (print("Hello from TempClass!"), super(TempClass, self).greet())[0]
    })
    
    #インスタンスを作成してテストする
    temp = TempClass()
    temp.greet()

    説明する

    1. type() 関数:
      type('TempClass', (ClassB,), {...})
      - 'TempClass': 新しいカテゴリ名。
      - (ClassB,): 基本カテゴリのタプル。ここには ClassB のみがあります。
      - {...}: 新しい属性またはメソッド。
    2. Lambda 関数はメソッドをオーバーライドするために使用されます。
      - カスタマイズgreetこのメソッドは、最初に新しいメッセージを出力してから、super()親カテゴリを呼び出すgreet

    出力結果

    Hello from TempClass!
    Hello from ClassB!


    同じインターフェイスで異なるカテゴリの使用を切り替える

    説明する

    2つのカテゴリがあるとしますAClassそしてBClass、同じ名前とパラメータを持つ関数があります。 メイン プログラム ロジックを変更せずに、使用するカテゴリを簡単に切り替えられるようにしたいと考えています。

    サンプルプログラム

    クラスAクラス:
        def プロセス (自分自身、データ):
            print(f"AClass 処理: {data}")
    
        デフォルトの結果(自分自身):
            「AClassからの結果」を返す
    
    
    クラスBクラス:
        def プロセス (自分自身、データ):
            print(f"BClass 処理: {data}")
    
        デフォルトの結果(自分自身):
            「BClass からの結果」を返す
    
    
    # 設定を通じてどのカテゴリを使用するかを制御できます
    USE_A = True
    
    #カテゴリーの動的な選択
    SelectedClass = USE_A の場合は AClass、それ以外の場合は BClass
    
    # インスタンスを作成して使用する
    obj = SelectedClass()
    obj.process("テストデータ")
    print(obj.result())

    出力結果(USE_A=True)

    Aクラス処理: テストデータ
    Aクラスの結果

    出力結果(USE_A=False)

    BClass 処理: テストデータ
    Bクラスの結果

    より高度な記述方法: ファクトリ関数を使用する

    def get_class(名前):
        マッピング = {
            「A」: Aクラス、
            「B」:Bクラス
        }
        returnmapping.get(name, AClass) # デフォルトは AClass
    
    # 動的選択
    cls = get_class("B")
    obj = cls()
    obj.process("テストデータ")

    結論は



    Python は抽象カテゴリを使用します

    短い答え

    Pythonでは、必ずしも必要ではないC++ または Java のように記述されるabstract class。 Pythonでは「ダックタイピング」が採用されています。オブジェクトのメソッド名と動作が同じである限り、それらは互換性があると見なされます。

    アヒルタイピングの例

    クラスAクラス:
        def プロセス (自分自身、データ):
            print(f"AClass 処理: {data}")
    
    クラスBクラス:
        def プロセス (自分自身、データ):
            print(f"BClass 処理: {data}")
    
    デフォルト実行(obj):
        obj.process("data") # このメソッドがあれば型の指定は不要
    
    run(AClass())
    run(BClass())

    出力結果

    Aクラスの処理: データ
    Bクラス処理: データ

    抽象カテゴリ(ABC)を使用する状況

    Python は型を強制しませんが、チーム開発または大規模プロジェクトでインターフェイスを明確に定義したい場合は、次のように使用できます。abcモッド。

    from abc import ABC、abstractmethod
    
    クラスBaseClass(ABC):
        @abstractmethod
        def プロセス (自分自身、データ):
            パスする
    
    クラス AClass(BaseClass):
        def プロセス (自分自身、データ):
            print(f"AClass 処理: {data}")
    
    クラス BClass(BaseClass):
        def プロセス (自分自身、データ):
            print(f"BClass 処理: {data}")
    
    # 抽象メソッドが実装されていないため、BaseClass() はエラーを報告します

    結論は



    Pythonモジュール

    意味

    Pythonでは、モジュールプログラムコードを含むファイルで、通常はファイル拡張子が.py終わり。モジュールでは関数、カテゴリ、変数を定義でき、再利用とプログラムの構造化を容易にする実行可能コードを含めることもできます。

    使用

    使用法

    Python経由importモジュールを紹介するキーワード。例:

    数学をインポートする
    
    print(math.sqrt(16)) # 出力 4.0

    カスタムモジュール

    開発者は独自の MOD を作成できます。たとえば、mymodule.py

    
    # mymodule.py
    def greet(name):
        return f"Hello, {name}!"
    

    別のプログラム ファイルで使用します。

    
    import mymodule
    
    print(mymodule.greet("Alice"))
    

    共通の組み込みグループ



    Python スイート

    意味

    Pythonでは、パッケージモジュールを整理する方法です。パッケージは複数のモジュールを含むディレクトリであり、階層構造を通じてプログラムの管理と保守が容易になります。

    特徴

    基本的な例

    というファイルを作成しますmypackageキット内容:

    
    mypackage/
    │── __init__.py
    │── module1.py
    └── module2.py
    

    module1.py例:

    
    def add(a, b):
        return a + b
    

    module2.py例:

    
    def multiply(a, b):
        return a * b
    

    キットを使用する

    mypackage.module1 をインポートします
    mypackage.module2 をインポートします
    
    print(mypackage.module1.add(2, 3)) # 出力 5
    print(mypackage.module2.multiply(2, 3)) # 出力 6

    パッケージから特定のプロジェクトをインポートする

    mypackage.module1 からインポート追加
    mypackage.module2 からインポート乗算
    
    print(add(10, 5)) # 出力 15
    print(multiply(10, 5)) # 出力 50

    一般的な用途



    現在のパッケージ名を取得する

    説明する

    Python で現在のモジュールを取得するにはパッケージ名、特殊変数を使用できます__package__。これと__module__現在のモジュール名を取得する概念も同様です。

    例: モジュールとキットの構造

    
    mypackage/
    │── __init__.py
    └── submodule.py
    

    submodule.pyコンテンツ:

    
    print("__name__:", __name__)
    print("__package__:", __package__)
    print("__module__:", __module__)
    

    実行結果

    他のプログラムで次のように使用する場合import mypackage.submoduleインポートすると、出力はおおよそ次のようになります。

    
    __name__: mypackage.submodule
    __package__: mypackage
    __module__: __main__
    

    説明する

    アプリケーションシナリオ



    Python パッケージのバージョン

    Python パッケージのバージョンを確認するには、主に 2 つの方法があります。ターミナル (コマンド ライン) を使用する方法と、Python コードで実行する方法です。これは、環境がプロジェクトの要件を満たしているかどうかを確認するのに役立ちます。


    1. ターミナル(コマンドライン)で確認する

    これは最も速い方法であり、Python 対話型環境に入る必要はありません。


    2. Python コードをチェックインする

    プログラムの実行時にバージョンを確認する必要がある場合は、次の 2 つの方法を使用できます。


    3. 検査方法比較表

    方法 指示/コード 該当する状況
    ピップコマンド pip show インストール パス、作成者、依存関係などの詳細情報を表示します。
    ピップリスト pip list 現在の環境にあるすべてのパッケージとバージョンの概要を簡単に把握できます。
    内部プロパティ .__version__ スクリプトの実行中に論理的な判断を行います。
    Metadata version() スイート全体をロードせずにチェックする標準化された方法。

    4. Python 自体のバージョンを確認する

    問題はスイートではなく、Python インタープリター自体にある場合があります。


    5. よくある質問と注意事項



    カテゴリとモジュールオブジェクトからパッケージ名を取得

    クラスオブジェクト

    Python では、クラス オブジェクトには次の方法でアクセスできます。cls.__module__カテゴリを定義するモジュールの名前を見つけて、次を使用します。sys.modulesモジュールオブジェクトを取得し、最後にそれを読み取ります__package__パッケージ名を取得するプロパティ。

    インポートシステム
    
    # カテゴリが mypackage.submodule で定義されていると仮定します
    クラスMyClass:
        パスする
    
    # カテゴリが属するモジュールの名前を取得します
    module_name = MyClass.__module__
    print("モジュール名:", module_name)
    
    # モジュールオブジェクトを取得
    mod = sys.modules[モジュール名]
    
    # モジュールオブジェクトからパッケージ名を取得する
    print("パッケージ名:", mod.__package__)

    モジュールオブジェクト

    モジュール自体はオブジェクトであり、直接アクセスできます。__package__財産。

    数学をインポート
    mypackage.submodule をサブとしてインポートします
    
    # math は標準関数ライブラリ モジュールであり、パッケージがないため、__package__ は空の文字列です
    print("math.__package__:", math.__package__)
    
    # カスタムキット用のモジュール
    print("sub.__package__:", sub.__package__)

    実行結果の例

    モジュール名: mypackage.submodule
    パッケージ名: mypackage
    math.__package__:
    sub.__package__: 私のパッケージ

    結論は



    inspect.getfile

    Python ファイルを直接実行する場合、そのモジュール名は次のようになります。__main__。これにより、使用するのはcls.__module__元のファイル名とパスを取得できません。

    プロジェクト構造が次のようになっていると仮定します。

    /プロジェクト
      |-- test_runner.py <-- 直接実行するファイル (__main__ として扱われます)
      |-- テスト/
            |-- db_test.py <-- DbCmdAgent を定義するファイル

    `test_runner.py` で次のコードを実行すると:

    test.db_test から DbCmdAgent をインポート
    Agent_obj = DbCmdAgent(...) # インスタンス化
    
    # この時点では cls.__module__ はまだ 'test.db_test' (正しいモジュール名)

    ただし、`test_runner.py` でカテゴリを定義すると、次のようになります。

    # test_runner.py の内容
    クラスDbCmdAgent:
        パスする
    
    エージェント_obj = DbCmdAgent()
    #この時点では cls.__module__ == '__main__' (モジュール名が間違っています)

    これは、情報を取得しているクラスが `__main__` として実行されるファイル内で定義されていることを示します。

    使用inspectモジュールはファイルパスを直接取得できます

    カテゴリが __main__ で定義されているかどうかに関係なく、 __module__ 属性をバイパスして使用できます。inspectモジュールを使用して、このカテゴリに対応するソース コード ファイルのパスを取得します。これはより信頼性が高く、一般的な方法です。

    Python の実装を修正しました

    輸入検査
    OSをインポートする
    
    # --- シミュレーション状況: __main__ で定義されたカテゴリ (現在実行中のスクリプト) ---
    
    クラスDbCmdAgent:
        """このカテゴリは現在実行中のメイン スクリプトで定義されています"""
        def __init__(self, data):
            self.data = データ
    
    Agent_obj = DbCmdAgent("some_data")
    
    def get_class_location_robust(obj):
        「」
        __module__ == '__main__' 問題を回避するには、inspect.getfile を使用します。
        「」
        cls = タイプ(obj)
        
        # 1. Inspection.getfile() を使用して、カテゴリを定義するファイル パスを取得します
        試してみてください:
            file_path = Inspection.getfile(cls)
            
            # 2. ファイル名とディレクトリを取得する
            ファイル名 = os.path.basename(ファイルパス)
            ディレクトリ = os.path.dirname(ファイルパス)
            py_name = os.path.splitext(ファイル名)[0]
            
            # 3. __module__ が __main__ の場合、より多くのコンテキストを提供するためにアーカイブ名に置き換えます。
            module_name = cls.__module__
            if module_name == '__main__':
                module_name = py_name # db_test または test_runner をコンテキストとして使用します
                
        例外タイプエラー:
            # 組み込み型を処理する
            file_path = "N/A (組み込みまたは C 拡張子)"
            ファイル名 = "該当なし"
            ディレクトリ = "該当なし"
            py_name = "該当なし"
            module_name = cls.__module__
            
        戻り値 {
            "モジュール名またはメイン": モジュール名,
            "py_name_no_ext": py_name,
            「ディレクトリ」: ディレクトリ、
            "ファイルパス": ファイルパス、
        }
    
    # 実行して結果を表示する
    location_info = get_class_location_robust(agent_obj)
    
    print("--- カテゴリ定義ファイル情報 ---")
    print(f"ファイル名(.py名): {location_info['py_name_no_ext']}")
    print(f"ディレクトリパス(パッケージ): {location_info['ディレクトリ']}")
    print(f"完全なファイルパス: {location_info['file_path']}")

    4. 要点のまとめ



    動的インポートモジュール

    機能説明

    この方法では、importlib.import_module指定されたモジュールをインポートしてみます。遭遇したらModuleNotFoundErrorは、現在ロードされているパッケージからサブモジュールをインポートしようとします。

    プログラム例

    インポートインポート
    インポートシステム
    
    defsafe_import(モジュール名):
        試してみてください:
            # 直接インポートしてみる
            return importlib.import_module(モジュール名)
        ModuleNotFoundError を除く:
            # 失敗した場合は、既知のパッケージからサブモジュールのインポートを試みます
            list(sys.modules.keys()) の pkg の場合:
                pkg ではなく pkg.startswith("_") の場合:
                    試してみてください:
                        return importlib.import_module(f"{pkg}.{module_name}")
                    ModuleNotFoundError を除く:
                        続ける
            raise # それでも見つからない場合は例外をスローします

    使用例

    numpyをインポートする
    
    mod1 = safety_import("random") # 標準ライブラリなので直接成功可能
    mod2 = safety_import("linalg") # numpy.linalg を試します
    print(mod2.__name__) # numpy.linalg を出力します

    説明する



    Python モジュールの検索パス: sys.path の構成

    Pythonでは、sys.pathモジュールをインポートしようとするときに Python インタープリターが順番に検索するすべてのディレクトリ パスを含むリストです。実行するとimport some_module, Pythonは順番にチェックしていきます。sys.pathという名前のディレクトリが見つかるまで、リスト内の各ディレクトリを検索します。some_moduleファイル (例:some_module.pysome_module/__init__.py待って)。

    sys.path の 3 つの主要コンポーネント

    sys.path通常、リストは次の 3 つの部分で構成され、次の順序で検索されます。

    1. プログラムコードのエントリディレクトリ(エントリポイント)

    2. PYTHONPATH 環境変数

    3. 標準関数ライブラリとインストールディレクトリ

    ---

    sys.path に関連するシステム変数

    上記に加えてPYTHONPATHさらに、Python 実行環境に関連する環境変数がいくつかあります。これらはインタープリタとパス検索の動作に影響しますが、sys.pathを構成する主な変数は、PYTHONPATH

    システム変数 機能説明 sys.path との関係
    PYTHONPATH MOD 検索パスに追加する追加のディレクトリを定義します。 直接的な影響sys.path構成。
    PYTHONHOME 特に組み込みシステムの場合、Python インストール ディレクトリへの代替パスを設定するために使用されます。 間接的に標準ライブラリに影響を及ぼし、site-packages位置。
    PATH オペレーティング システムが実行可能ファイルを検索するために使用します (例:python.exe) パス。 直接影響しないsys.path、ただし、どの Python インタープリターが実行されるかに影響します。
    VIRTUAL_ENV 仮想環境にいる場合、この変数は仮想環境のルート ディレクトリを指します。 間接的な影響sys.path、それが保証するのでsite-packagesこれはシステム全体ではなく、仮想環境から発生します。

    sys.pathを変更する方法

    なぜならsys.pathは、プログラムの実行中に動的に変更できる通常の Python リストですが、そのような変更は現在のインタープリター セッション内でのみ有効になります。

    インポートシステム
    OSをインポートする
    
    # 親ディレクトリを検索パスに追加します (テストまたは内部プロジェクト参照によく使用されます)
    sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))


    モッドシャドウ

    モジュール シャドウイング (または名前シャドウイング) は、Python における一般的なエラーまたはプログラミングの問題です。この問題は、インポートまたは使用しようとしている組み込みモジュールまたはサードパーティ ライブラリの名前と競合するコード ファイルまたは変数名を誤って作成した場合に発生します。

    1. 定義と発生原因

    この結果、ローカル ファイルがロードされるべき標準モジュールを「カバー」または「オーバーライド」し、コードが標準モジュールの機能 (たとえば、socket.AF_UNSPEC) ロードしたローカル ファイルにはこれらのプロパティがないため、失敗します。

    2. よくある例

    標準モジュール名 シャドウの原因となったローカルファイル名 の結果として
    socket socket.py 標準では使用できませんsocketモジュールのネットワーク定数 (例:AF_INET, AI_PASSIVE)。
    json json.py 標準では使用できませんjsonモジュラーloadsまたはdumps関数。
    test(プロジェクト名) test.py 単体テスト環境では、テスト フレームワークの内部ロジックと競合する可能性があります。

    3. 解決策

    1. アーカイブの名前を変更します。これは最も簡単で効果的な解決策です。標準のモジュール名またはライブラリ名と競合するローカル ファイルまたはディレクトリの名前を変更するだけです。たとえば、次のように変更します。socket.py名前が変更されましたnetwork_handler.py
    2. sys.path を確認してください: コード内でこれを実行してくださいimport sys; print(sys.path)Python の検索パスをチェックして、標準ライブラリ ディレクトリよりも優先してローカル ファイルが読み込まれるかどうかを確認します。
    3. 仮想環境を使用する: 仮想環境自体はローカル アーカイブ シャドウイングを防止しませんが、インストールするサードパーティ パッケージが他の環境と競合しないようにすることができます。


    現在のエントリの .py 名を取得します

    説明する

    Python プログラムの現在の実行を取得するには__main__所属する .py ファイルの名前 (使用可能)__main__.__file__またはsys.argv[0]。ただし、インタラクティブ モードでは、Jupyter、または-c実行時には存在しない可能性があるため、安全な取り扱いが必要です。

    現在のメインの .py ファイル名を取得します (安全なバージョン)

    OSをインポートする
    インポートシステム
    __メイン__をインポートする
    
    def get_main_py_path():
        """main が属する .py の絶対パスを返します。見つからない場合は None を返します"""
    
        # ケース 1: 通常の実行 .py
        main_file = getattr(__main__, "__file__", None)
        main_file の場合:
            os.path.abspath(main_file)を返す
    
        # ケース2:sys.argv[0]からの判定
        len(sys.argv) > 0の場合:
            argv0 = sys.argv[0]
            argv0 が (""、"-c"、" にない場合)"):
                候補 = os.path.abspath(argv0)
                os.path.exists(候補)の場合:
                    復帰候補者
    
        # ケース 3: インタラクティブ モード、Jupyter、埋め込みなど
        なしを返す
    
    # 例
    パス = get_main_py_path()
    パスの場合:
        print("メインパス:", パス)
        print("メインファイル名:", os.path.basename(パス))
    それ以外の場合:
        print("main.py が見つかりません (対話型環境にあるか、アーカイブから実行されていない可能性があります)")

    ファイル名(ベース名)のみ

    path = get_main_py_path()
    filename = os.path.basename(path) if path else None
    print(filename)

    要約する



    現在の関数のパラメータ名と値を取得します

    To get the parameter names and their corresponding values of a function in Python, you can use the `inspect` module, which provides introspection utilities. Specifically, `inspect.signature()` can help you retrieve the names of the parameters, and you can pass the current frame's local variables to get their values.
    
    Here is an example that demonstrates how to get the function name, parameter names, and their values:
    
    ```python
    import inspect
    
    # Sample function
    def my_function(a, b, c=5):
        # Get the current frame
        frame = inspect.currentframe()
        
        # Get the function name
        func_name = frame.f_code.co_name
        print(f"Function name: {func_name}")
        
        # Get the parameter names and their values
        args, _, _, values = inspect.getargvalues(frame)
        
        # Print parameter names and values
        for arg in args:
            print(f"Parameter name: {arg}, Value: {values[arg]}")
    
    # Call the function
    my_function(1, 2)
    ```
    
    ### Output:
    ```
    Function name: my_function
    Parameter name: a, Value: 1
    Parameter name: b, Value: 2
    Parameter name: c, Value: 5
    ```
    
    ### Explanation:
    1. **`inspect.currentframe()`**: Retrieves the current execution frame.
    2. **`frame.f_code.co_name`**: Extracts the name of the current function.
    3. **`inspect.getargvalues(frame)`**: Gets the argument names and their corresponding values from the frame. This function returns a tuple containing:
       - `args`: List of argument names.
       - `_`: Placeholder for unused information.
       - `values`: Dictionary containing argument names as keys and their values.
    
    This allows you to print both the names of the function's parameters and their values at runtime.
    


    関数パラメータの型を取得する

    検査モジュールの使用

    Python では、次のように使用できますinspect.signature()関数のパラメータ情報を取得し、 そしてさらにそこからParameter.annotationプロパティは、各パラメーターの型アノテーション (型ヒント) を取得します。

    輸入検査
    
    def my_function(a: int, b: str, c: float = 3.14) -> bool:
        戻り値 str(a) == b
    
    sig = Inspection.signature(my_function)
    
    sig.parameters.items() の名前、パラメータ:
        print(f"パラメータ名: {name}")
        print(f"デフォルト値: {param.default}")
        print(f"型アノテーション: {param.annotation}")
        プリント()

    出力結果

    パラメータ名: a
      デフォルト: <クラス 'inspect._empty'>
      型アノテーション: <class 'int'>
    
    パラメータ名:b
      デフォルト: <クラス 'inspect._empty'>
      型アノテーション: <class 'str'>
    
    パラメータ名:c
      デフォルト: 3.14
      型アノテーション: <class 'float'>

    説明する

    get_type_hints を使用する

    このメソッドは、前方参照 (文字列としてマークされた型) を自動的に解決します。

    
    from typing import get_type_hints
    
    hints = get_type_hints(my_function)
    print(hints)
    

    出力結果

    
    {'a': <class 'int'>, 'b': <class 'str'>, 'c': <class 'float'>, 'return': <class 'bool'>}
    

    要約する



    オブジェクトのクラス名を取得します

    説明する

    Python では、オブジェクトの__class__属性またはtype()機能、 所属するカテゴリ(クラス)を取得し、カテゴリ名を取得します。

    クラス動物:
        パスする
    
    クラス犬(動物):
        パスする
    
    obj = 犬()
    
    #方法 1: __class__.__name__ を使用する
    print(obj.__class__.__name__) # 出力: Dog
    
    #方法 2: type() を使用する
    print(type(obj).__name__) # 出力: Dog
    
    #方法 3: 完全なモジュール名とカテゴリ名を取得する
    print(obj.__class__) # 出力: <class '__main__.Dog'>
    print(obj.__class__.__module__) # 出力: __main__

    出力結果

    
    Dog
    Dog
    <class '__main__.Dog'>
    __main__
    

    説明する

    高度なアプリケーション

    完全な「モジュール + カテゴリ名」を同時に取得するには、次のように記述できます。

    
    cls = type(obj)
    full_name = f"{cls.__module__}.{cls.__name__}"
    print(full_name)
    

    出力結果

    
    __main__.Dog
    

    要約する



    属性が属するカテゴリを検出します

    以下は、Python を使用してプロパティがどの継承クラスに属するかを決定するサンプル コードです。

    サンプルコード

    輸入検査
    
    クラスBaseClass:
        Base_attr = "私はBaseClassの属性です"
    
    クラスのサブクラス(BaseClass):
        sub_attr = "私はサブクラスの属性です"
    
    # 属性が属するカテゴリを検索する関数を定義する
    def find_attribute_owner(cls, attr_name):
        inspect.getmro(cls) のベースの場合: # MRO (メソッド解決順序) を取得します
            attr_name が Base.__dict__ の場合:
                リターンベース
        なしを返す
    
    # テスト
    sub_obj = サブクラス()
    attributes = sub_obj.__class__.__dict__.items() # カテゴリ レベルですべての属性を取得します
    名前、属性の値:
        owner = find_attribute_owner(sub_obj.__class__, 名前)
        print(f"属性 '{name}' はカテゴリに属します: {owner.__name__}")

    プログラムの説明

    実行結果

    例のカテゴリの実行結果は次のようになります。

    属性「__module__」はクラスに属します: SubClass
    属性「sub_attr」はクラスに属します: SubClass
    属性 '__doc__' はクラス: SubClass に属します
    属性「base_attr」はクラスに属します: BaseClass


    関数のアノテーションを取得 (Docstring)

    __doc__ を使用する

    class MyClass:
        def fun1(self):
            '''
            Fun1 comment
            '''
            pass
    
    obj = MyClass()
    print(obj.fun1.__doc__)
    

    検査モジュールの使用

    import inspect
    
    class MyClass:
        def fun1(self):
            '''
            Fun1 comment
            '''
            pass
    
    print(inspect.getdoc(MyClass.fun1))
    


    非推奨としてマークされた関数

    警告モジュールの使用

    Python では、組み込みのwarnings関数が非推奨になったことを (コンパイル時ではなく) 実行時にユーザーに警告し、新しい代替案を提案するモジュール。

    インポート警告
    
    def old_function(x, y):
        警告.warn(
            "関数 old_function() は非推奨です。代わりに new_function(x, y) を使用してください。",
            category=非推奨警告、
            スタックレベル=2
        )
        x + yを返す
    
    def new_function(x, y):
        x + yを返す

    実行例

    
    result = old_function(3, 4)
    print(result)
    

    出力結果

    非推奨警告: 関数 old_function() は非推奨です。代わりに new_function(x, y) を使用してください。
      結果 = old_function(3, 4)
    7

    追加情報

    上級: 非推奨の関数を自動的にマークするデコレータを作成する

    デコレータを使用すると、複数の古い関数が同じ非推奨プロンプト ロジックを共有できるようになります。

    インポート警告
    functools インポートラップから
    
    def 非推奨(new_func_name):
        def デコレータ(関数):
            @ラップ(関数)
            def ラッパー(*args, **kwargs):
                警告.warn(
                    f"関数 {func.__name__}() は非推奨です。代わりに {new_func_name}() を使用してください。",
                    category=非推奨警告、
                    スタックレベル=2
                )
                return func(*args, **kwargs)
            リターンラッパー
        デコレータを返す
    
    @deprecated("new_function")
    def old_function(x, y):
        x + yを返す


    @staticmethod と @classmethod の違い

    Pythonでは、@staticmethodそして@classmethodどちらのデコレータも、クラスをインスタンス化せずに呼び出すことができるメソッドを定義できますが、その目的と動作は異なります。

    @staticmethod

    @staticメソッドの例:

    クラスMyClass:
        @静的メソッド
        def static_method(x, y):
            x + yを返す
    
    # インスタンスを作成せずに静的メソッドを呼び出すことができます
    result = MyClass.static_method(5, 10) # 結果: 15

    集中@staticmethodカテゴリにアクセスできません (cls) またはインスタンス (self)。

    @classmethod

    @クラスメソッドの例:

    クラスMyClass:
        クラス変数 = 0
    
        def __init__(self, value):
            self.value = 値
            MyClass.class_variable += 1
    
        @クラスメソッド
        def get_class_variable(cls):
            cls.class_variable を返す
    
    #インスタンスの作成
    obj1 = MyClass(10)
    obj2 = MyClass(20)
    
    # カテゴリメソッドを呼び出す
    print(MyClass.get_class_variable()) # 結果: 2

    集中@classmethodカテゴリレベルのステータスにアクセスできます (cls)。

    要約する

    特徴 @staticmethod @classmethod
    最初のパラメータ 暗黙的な最初の引数はありません cls(カテゴリ自体)
    インスタンスにアクセスする なし なし
    アクセスカテゴリー なし 持っている
    使用法 カテゴリに関連しているが、インスタンスやカテゴリを必要としないユーティリティ関数 カテゴリレベルのデータを操作するか、代替コンストラクターを提供する必要がある


    静的クラスが初期化を実行します

    Python 自体には、「デフォルトの静的メソッド」や「デフォルトのクラスメソッド」、つまり、初めて静的メソッドやクラスメソッドが呼び出されたときにメソッドを自動的に実行する機能は提供されていません。ただし、遅延読み込み手法を使用すると、同様の動作を実現できます。

    解決策: 静的変数と遅延読み込みを使用する

    クラス内に静的変数を定義して初期化状態を追跡し、静的メソッドまたはクラス メソッドが初めて呼び出されたときに初期化ロジックを実行できます。

    例:

    クラスMyClass:
        Initialized = False # 静的変数、初期化されたかどうかを追跡する
    
        @静的メソッド
        def init_once():
            MyClass.initialized でない場合:
                print("初期化ロジックの実行...")
                MyClass.initialized = True
    
        @クラスメソッド
        def クラスメソッド(cls):
            cls.init_once()
            print("クラスメソッドの呼び出し")
    
        @静的メソッド
        def static_method():
            MyClass.init_once()
            print("静的メソッドの呼び出し")
    
    # カテゴリメソッドを初めて呼び出して初期化をトリガーします
    MyClass.class_method() # 出力: 初期化ロジックの実行...クラスメソッドの呼び出し
    
    # category メソッドを 2 回目に呼び出し、初期化を実行しません
    MyClass.class_method() # 出力: クラスメソッドの呼び出し
    
    # 静的メソッドが初めて呼び出されるときは、すでに初期化されているため、初期化は実行されません。
    MyClass.static_method() # 出力: 静的メソッドの呼び出し

    仕組み:

    要約する

    Python には組み込みの「デフォルトの静的メソッド」または「デフォルトのクラス メソッド」がありませんが、静的変数と遅延読み込み手法を使用することで、静的メソッドまたはクラス メソッドが初めて呼び出されたときに初期化ロジックを自動的に実行し、このロジックが 1 回だけ実行されるようにすることができます。



    Python スレッド

    Python では、スレッドは同時実行性を実装するために使用されるメカニズムです。これにより、プログラムは単一のプロセス (プロセス) 内で複数のタスクを同時に実行できます。これは、I/O 集中型の操作 (ネットワーク通信、ファイルの読み取りと書き込みなど) を実行する場合に非常に便利で、外部操作の完了を待ってプログラムがブロック (ブロック) されるのを防ぐことができます。

    1. なぜスレッドを使用するのでしょうか?

    2. Python スレッドの制限: GIL (グローバル インタプリタ ロック)

    標準の CPython インタープリターには、「グローバル インタープリター ロック」(Global Interpreter Lock、GIL) があります。 GIL は、常に 1 つのスレッドだけが Python ビットコードを実行できるようにします。これはつまり:

    3. 実行スレッドモジュール:threading

    Pythonは標準関数ライブラリを使用しますthreading実行スレッドを処理するモジュール。スレッドの作成には主に 2 つの方法があります。

    方法 1: 関数をターゲットとして渡す (ターゲット関数)

    これは最も単純で最も一般的な使用法です。

    インポートスレッド
    インポート時間
    
    def タスク (名前、遅延):
        """スレッドによって実行されるタスク関数"""
        print(f"スレッド {name}: 開始中...")
        time.sleep(lay) # 時間のかかる I/O 操作をシミュレートします
        print(f"スレッド {name}: タスクが完了しました。")
    
    #実行スレッドの作成
    thread1 = threading.Thread(target=タスク, args=("T1", 2))
    thread2 = threading.Thread(target=タスク, args=("T2", 4))
    
    # スレッドを開始します
    thread1.start()
    thread2.start()
    
    # すべてのスレッドが完了するまで待ちます (完了するまでメインスレッドをブロックします)
    thread1.join()
    thread2.join()
    
    print("すべての実行スレッドが完了しました。メインプログラムが終了します。")

    方法 2: 継承threading.Threadカテゴリ

    実行スレッドのロジックをカテゴリにカプセル化する、より複雑なシナリオに適しています。

    インポートスレッド
    インポート時間
    
    クラスMyThread(threading.Thread):
        def __init__(自分自身、名前、遅延):
            super().__init__()
            self.name = 名前
            self.delay = 遅延
    
        デフォルト実行(自分自身):
            「」
            スレッドが開始されると、run() メソッドが自動的に呼び出されます。
            ここでは、スレッドによって実行されるタスクを定義します。
            「」
            print(f"スレッド {self.name}: 開始中...")
            time.sleep(自己.遅延)
            print(f"スレッド {self.name}: タスクが完了しました。")
    
    #スレッドを作成して開始する
    thread3 = MyThread("T3", 3)
    thread3.start()
    thread3.join()
    
    print("カスタム実行スレッドが完了しました。")

    4. スレッドの同期とデータ共有

    複数のスレッドが共有データにアクセスして変更すると、競合状態が発生する可能性があります。データを保護するには、同期メカニズムを使用する必要があります。

    ロックの使用例

    インポートスレッド
    
    # 共有リソース
    カウンタ = 0
    # ロックを作成する
    ロック = threading.Lock()
    
    デフォルトのincrement_counter():
        グローバルカウンター
        # ロックを取得して、このブロックを同時に 1 つのスレッドだけが実行できるようにします。
        lock.acquire()
        試してみてください:
            # コンペティション部門
            現在の値 = カウンタ
            time.sleep(0.001) # 切り替えをシミュレートします
            カウンタ = 現在の値 + 1
        最後に:
            # ロックを解除する
            ロック.リリース()
    
    スレッド = []
    範囲 (100) 内の i の場合:
        t = threading.Thread(target=increment_counter)
        スレッド.append(t)
        t.start()
    
    スレッド内の t の場合:
        t.join()
    
    print(f"最終カウンタ値: {counter}") # ロックがない場合、この値は 100 にならない可能性があります


    Python スレッドの開始、同期、停止

    パイソンthreadingこのモジュールは実行スレッドを作成および管理する機能を提供しますが、オペレーティング システムの制限と設計思想のため、Python には外部実行スレッドを停止 (強制終了) するための安全かつ直接的かつ強制的な方法がありません。強制停止するとリソース漏洩やデータ破損が発生する可能性があります。

    したがって、実行スレッドの停止は **協調メカニズム**** を通じて実現する必要があります。つまり、実行スレッドが独自に停止フラグをチェックし、正常に終了できるようにする必要があります。

    1. スレッド停止機構:フラグを利用した(Flag)

    これは、スレッドを停止する最も安全で最も推奨される方法です。スレッドはタスク実行のループ内で外部変数 (フラグ) を定期的にチェックする必要があります。

    Pythonの実装例

    インポートスレッド
    インポート時間
    
    # 共有停止フラグ
    stop_flag = threading.Event()
    
    def 監視タスク(名前、遅延):
        「」
        停止フラグを定期的にチェックするタスク関数
        「」
        print(f"スレッド {name}: 開始中...")
        i = 0
        stop_flag.is_set() 以外の場合: # フラグが設定されているかどうかを確認します
            私 += 1
            print(f"スレッド {name}: 実行ステップ {i}")
            
            # 時間のかかる操作をシミュレーションし、定期的にチェックする
            時間.睡眠(遅延)
            
            # ここで、無限ループが発生しないように実行回数の制限を設定できます。
            私が 5 以上の場合:
                休憩
                
        print(f"実行スレッド {name}: 停止シグナルを受信したか、タスクが終了し、正常に終了しました。")
    
    # --- メインプログラム制御ブロック ---
    
    #実行スレッドの作成
    worker_thread = threading.Thread(target=monitored_task, args=("Worker-1", 1))
    
    # スレッドを開始します
    ワーカースレッド.start()
    
    print("\nメイン プログラム: 実行スレッドが開始されました。3 秒お待ちください...\n")
    time.sleep(3) # スレッドをしばらく実行させます
    
    # 停止信号を送信
    print("\nメインプログラム: 停止フラグを設定します...\n")
    stop_flag.set() # イベントを設定し、is_set() が True を返すようにします
    
    # スレッドが正常に終了して終了するまで待機します (通常はすぐに終了します)
    ワーカースレッド.join()
    
    print("\nメイン プログラム: スレッドは安全に停止され、参加しました。プログラムは終了しました。")

    2. 主要コンポーネントの説明

    3. その他の停止機構(強制停止は推奨しません)

    `_thread.stop()` の使用や例外のスローなど、強制的に停止するための実験的または安全でない方法がいくつかありますが、これらの方法では次のような問題が発生する可能性があります。

    したがって、Python では、スレッドを停止するために常に調整されたフラグ設定メカニズムを使用することに固執する必要があります。



    マルチスレッド共有オブジェクトの競合の解決策

    1. 最も一般的に使用されるソリューション: スレッドローカルストレージ

    これは、マルチスレッド環境で最も推奨されるアプローチです。すべてのスレッドが同じオブジェクトを取得するのではなく、各スレッドがオブジェクトの独立したコピーを持ちます。 Python では、次のように使用できますthreading.local()達成するために。

    インポートスレッド
    
    # オブジェクトを格納するスレッド領域を作成する
    thread_data = threading.local()
    
    def get_service():
        # 現在のスレッドに独自のサービスがない場合は、サービスを作成します
        hasattr(thread_data, 'service') がない場合:
            print(f"スレッド {threading.current_thread().name} の新しい接続を作成します")
            thread_data.service = create_new_connection()
        thread_data.service を返す
    
    デフォルトタスク():
        サービス = get_service()
        # 操作を実行します...

    2. 2 番目によく使用される方法: ロック機構 (Locking)

    オブジェクトが同じである必要がある場合 (同じファイルへの書き込みや同じグローバル カウンターでの操作など)、次を使用する必要があります。Lock。これにより、同時に 1 つのスレッドだけがオブジェクトにアクセスできるようになり、競合状態が回避されます。

    ロック = threading.Lock()
    
    デフォルトのsafe_task():
        ロック付き:
            # このブロック内では、他のスレッドは待機する必要があります
            共有オブジェクト.do_something()
    ---

    マルチスレッドの代替手段: 非同期およびマルチ処理

    複数のスレッドに伴うロック競合やクラッシュのリスクを回避したい場合は、主に次の 2 つの代替案を考慮する必要があります。

    1. 非同期コルーチン (Asyncio) - I/O 集中型のタスクに適しています

    これは現在、Python で最も一般的なアプローチです (FastAPI の中心原則など)。シングルスレッド内で動作し、タスクを切り替えながらI/O(APIリクエストやデータベースクエリなど)を待ちます。

    非同期をインポートする
    
    非同期デフォルト fetch_api(url):
        # aiohttp などの非同期ライブラリを使用する
        応答 = call_api(url) を待ちます
        応答を返す
    
    非同期def main():
        # 複数のタスクを同時に実行しますが、単一スレッド内で切り替えます
        results = await asyncio.gather(fetch_api("url1"), fetch_api("url2"))

    2. マルチプロセッシング - 計算負荷の高いタスクに適しています

    Python の実行スレッドは GIL (グローバル インタープリター ロック) によって制限されており、操作を真に並列化することはできません。multiprocessing複数の独立した Python インタープリター インスタンスが開きます。

    マルチプロセスインポートプロセスから
    
    デフォルトタスク(名前):
        print(f"プロセス {name} が実行中です")
    
    __name__ == "__main__"の場合:
        p = プロセス(ターゲット=タスク、引数=('A',))
        p.start()
        p.join()

    3. タスクキュー - 分散処理に適しています

    タスクを完全に分離したい場合は、Celery または Redis Queue を使用できます。タスクをキューにスローし、バックエンド ワーカー (複数のプロセスまたは複数のマシンの場合があります) にタスクを取得して実行させます。

    ---

    要約提案

    プラン 解決 該当する状況
    Thread-Local 各スレッドはコピーを取得します APIサービス、データベース接続
    Asyncio シングルスレッド切り替え(非同期) 同時ネットワークリクエストが多い (推奨)
    Multiprocessing 独立したメモリ空間 CPU コンピューティング、共有競合を完全に回避


    スレッド領域のストレージと情報共有のバランス

    コアコンセプト

    スレッドローカル ストレージ (TLS) を使用する場合、その目的は、「非スレッドセーフ」オブジェクト (API サービス、データベース接続など) を保護することです。ただし、スレッド間でデータを交換する必要がある場合 (たとえば、スレッド A によってダウンロードされた結果をスレッド B によって処理する必要がある場合)、特別な「通信チャネル」を確立する必要があります。

    1. スレッドセーフなキュー (キュー) を使用する - 最も推奨される

    パイソンqueue.Queueスレッドセーフです。これは、スレッド間で情報を転送するための最も標準的で安全な方法です。すべてのロック ロジックが内部ですでに処理されています。

    インポートスレッド
    インポートキュー
    
    # すべての実行スレッドがアクセスできるグローバル キューを作成します
    task_queue = キュー.Queue()
    
    デフォルトプロデューサー():
        # データを生成してキューに入れる
        データ = {"video_id": "abc", "ステータス": "保留中"}
        task_queue.put(データ)
    
    def Consumer():
        # キューからデータを取得する
        データ = task_queue.get()
        # データを処理します...
        task_queue.task_done()

    2. スレッドセキュリティ変数を使用する (共有リストロックなど)

    大規模なリストまたは辞書を共有する必要がある場合は、一般的なグローバル変数を使用できますが、一致するものを使用してアクセスする必要があります。threading.Lock

    共有結果 = []
    results_lock = threading.Lock()
    
    デフォルトタスク():
        result = "一部の操作結果"
        
        #共有リソースにアクセスする前にロックする
        results_lock を使用:
            shared_results.append(結果)
        # withブロックを離れた後に自動的にロックを解除する

    3. Event オブジェクトまたは Condition オブジェクトを使用する (信号同期)

    「データ」ではなく「状態」を共有したい場合があります (例: API が初期化されたことを他のスレッドに通知する)。

    api_ready = threading.Event()
    
    def 初期化子():
        #初期化を行う
        api_ready.set() # シグナルを送信
    
    def ワーカー():
        api_ready.wait() # イニシャライザが set() を呼び出すまでシグナルを待ちます
        print("作業を開始")

    概要: リージョン ストレージと共有情報

    コンテンツタイプ 保管場所 経営スタイル
    ツールオブジェクト(API、DB接続) スレッドローカル (リージョン) クラッシュを避けるためにそれぞれにコピーがあります。
    ミッション情報(ID、パラメータ) キュー (グローバル) スレッドセーフなキュー受け渡しを使用します。
    計算結果(統計) グローバル リスト/辞書 (グローバル) 一致する必要がありますthreading.Lock

    簡単に言うと、 **「プライベートツール(コネクション)は自分で取得し、公開情報(データ)はキュー(Queue/Lock)で取得する。」**



    ネジロック

    基本的な概念

    マルチスレッド環境では、複数のスレッドが同じグローバル変数または共有リソース (ファイル、データベース接続、グローバル リストなど) を同時に変更しようとすると、エラーが発生します。競合状態、データの混乱につながります。threading.Lock一度に 1 つのスレッドだけが保護されたコード ブロックに入ることができるようにする同期プリミティブです。

    1. 標準的な使用方法

    最も安全かつ推奨される方法は、一致させることです。with物語的な文章を使用します。これにより、ブロック内で例外が発生した場合でもロックが正しく解放され、デッドロックが回避されます。

    インポートスレッド
    
    # 1. ロックオブジェクトを作成する
    my_lock = threading.Lock()
    共有カウンター = 0
    
    def increment_task():
        グローバル共有カウンター
        # 2. with を使用して、acquire() と release() を自動的に管理する
        my_lock を使用:
            # このブロック内のコードは一度に 1 つのスレッドでのみ実行できます
            temp = 共有カウンター
            温度 += 1
            共有カウンター = 温度
    
    # 複数のスレッドのテストを開始する
    スレッド = [threading.Thread(target=increment_task) for _ in range(100)]
    スレッド内の t の場合: t.start()
    スレッド内の t の場合: t.join()
    
    print(f"最終カウント: {shared_counter}")

    2. 手動制御方法

    推奨されませんが、より細かい制御が必要な場合があります。手動で呼び出す必要がありますacquire()ロックを取得し、finallyブロック内で呼び出しますrelease()

    ロック = threading.Lock()
    
    defマニュアル_タスク():
        lock.acquire() #ロックを取得します。すでにロックが占有されている場合は、ここでブロック(待機)します。
        試してみてください:
            # タスクを実行する
            パスする
        最後に:
            lock.release() # 解放する必要があります。解放しないと、他のスレッドは実行できなくなります。

    3. ロック特性: 非再入性

    threading.Lockリエントラントではありません。これは、同じスレッドがすでにロックを保持しているときに同じロックを再度要求すると、スレッド自体が「ロック」されます (デッドロック) ことを意味します。

    4. いつロックを使用する必要がありますか?

    パフォーマンスに関する考慮事項

    ロックを過度に使用すると、複数のスレッドが「実行のキュー」に入れられるため、プログラムのパフォーマンスが低下します。可能であれば優先的に使用してくださいqueue.Queueまたは以前に議論したことThread-Local Storage、これらの方法は通常、頻繁にロックするよりも効率的で、エラーが発生しにくくなります。



    Python 非同期プログラミング

    Pythonでは、async defそしてawait実現される非同期プログラミングコア構文。これらにより、I/O タスク (ネットワーク要求、ファイルの読み取りなど) の待機中にプログラムが停止するのを防ぎ、代わりに他のタスクを処理できるようになり、パフォーマンスが大幅に向上します。


    1. async def: コルーチン関数を定義します。

    関数定義の先頭に次の文字を追加すると、async、関数は次のようになります。コルーチン関数。これを呼び出すと、コンテンツはすぐには実行されませんが、「コルーチン オブジェクト」が返されます。

    非同期デフォルト fetch_data():
        print("データの取得を開始します...")
        # 時間のかかるタスクをシミュレートする
        戻り値 {"データ": "成功"}
    
    # 直接呼び出しはコルーチン オブジェクトを取得するだけであり、print は実行されません。
    結果 = fetch_data()
    print(result) # 出力: <coroutine object fetch_data at ...>

    2. await: 一時停止して待機します。

    awaitしかありませんasync def内部使用用。その機能は、「現在のコルーチンを一時的に停止し、後続のタスクが完了するのを待って戻り値を取得する」ことです。待機中に、システムは他の非同期タスクを実行できます。

    非同期をインポートする
    
    非同期def main():
        # await を使用してコルーチンを実行し、結果を取得します
        データ = fetch_data() を待ちます
        print(f"キャプチャ結果: {data}")
    
    # 非同期プログラムのエントリを開始します
    asyncio.run(main())

    3. 主要な比較表

    文法 機能説明 注意事項
    async def 非同期関数を宣言する 返されるのはコルーチン オブジェクトであり、実行結果ではありません。
    await 非同期タスクが完了するまで待ちます 非同期関数内でのみ記述できます。
    asyncio.run() 最も外側の非同期エントリを開始します 通常、プログラムを呼び出す必要があるのは 1 回だけです。

    4. 一般的なエラーと修正


    5. 非同期を使用する理由は何ですか?

    あなたが料理をしているところを想像してみてください。



    コルーチンを完了して結果を返す

    loop.run_until_complete()はいasyncioモジュールの下位レベルのメソッドは、完了するまでコルーチンを実行し、結果を返すために使用されます。 Python 3.7 以降では、公式には使用が推奨されていますが、asyncio.run()ただし、特定の状況 (イベント ループを再利用する必要がある場合や起動ロジックをカスタマイズする必要がある場合など) では、このメソッドを使用する必要があります。

    1.基本的な利用の流れ

    使用run_until_completeまずイベント ループ オブジェクトを取得または作成してから、それにコルーチンを渡す必要があります。

    非同期をインポートする
    
    非同期定義 my_task():
        asyncio.sleep(1) を待ちます
        「タスクが完了しました」を返す
    
    # 1. イベントループの取得
    ループ = asyncio.get_event_loop()
    
    # 2. コルーチンを完了まで実行し、戻り値を直接取得する
    結果 = ループ.run_until_complete(my_task())
    
    print(result) #出力: タスクが完了しました

    2. asyncio.run() との違い

    どちらも戻り値を取得できますが、ライフサイクルの管理方法は異なります。

    特性 asyncio.run() (推奨) loop.run_until_complete()
    自動化の程度 高い。ループを自動的に作成、閉じ、タスクをクリーンアップします。 低い。ループのライフサイクルは手動で管理する必要があります。
    再利用性 低い。呼び出しごとに新しいループが作成されます。 高い。複数のタスクを同じループで実行できます。
    使用制限 すでに実行中のループ内では使用できません。 より柔軟で、従来のコードまたはテスト環境でよく使用されます。

    3. 既存のループで結果を取得する

    すでに実行中のスクリプト内で、コルーチンが実行されて値が取得されていることを確認したい場合は、次のメソッドを使用できます。

    非同期をインポートする
    
    非同期デフォルト追加(a, b):
        a + bを返す
    
    ループ = asyncio.new_event_loop()
    asyncio.set_event_loop(ループ)
    
    試してみてください:
        # 最初のタスクを実行する
        val1 = ループ.run_until_complete(add(10, 20))
        #2番目のタスクを実行する
        val2 = ループ.run_until_complete(add(val1, 5))
        print(f"最終結果: {val2}")
    最後に:
        # 手動で閉じる必要があります
        ループ.クローズ()

    4. 複数のタスクの結果を取得する

    複数のコルーチンを並行して実行し、戻り値を均一に取得したい場合は、一致させる必要があります。asyncio.gather

    非同期定義タスク(id):
        return f"結果{id}"
    
    ループ = asyncio.get_event_loop()
    # Gather は複数のコルーチンを 1 つのタスクにラップし、run_until_complete はすべてが完了するまで待機します。
    results =loop.run_until_complete(asyncio.gather(タスク(1), タスク(2), タスク(3)))
    print(results) #出力: ['結果 1', '結果 2', '結果 3']

    5. 共通注意事項



    asyncio.run()これは、Python 3.7 以降に導入された高レベルの API です。これは、非同期プログラムを開始する最も推奨される方法です。自動的に処理してくれますイベントループを確立し、コルーチンを実行し、完了後にループを閉じます。。最も重要なことは、それがコルーチンに直接戻されることです。return価値。

    1. 基本的な入手方法

    ただ必要なのは、async def渡される関数呼び出しasyncio.run()、通常の同期関数と同様に結果を返します。

    非同期をインポートする
    
    非同期デフォルトの計算スコア(名前):
        print(f"{name} のスコアを計算しています...")
        await asyncio.sleep(1) # 時間のかかるタスクをシミュレートする
        95を返す
    
    # return の結果を直接取得する
    Final_score = asyncio.run(calculate_score("張暁明"))
    
    print(f"最終スコアは: {final_score}") # 出力: 95

    2. 複数のタスクの結果を処理する

    通常は、main()エントリ ポイントとして機能し、内部のすべてのサブタスクの結果を取得し、最後にasyncio.run(main())統一された出力。

    非同期定義 task_a():
        「リンゴ」を返す
    
    非同期定義 task_b():
        「バナナ」を返します
    
    非同期def main():
        # mainでgatherを使って同時実行する
        results = await asyncio.gather(task_a(), task_b())
        return results # リストを返す
    
    # asyncio.run を通じて main の戻り値を取得します
    all_fruits = asyncio.run(main())
    print(all_fruits) # 出力: ['apple', 'banana']

    3. asyncio.run()の実行規則

    ルール項目 説明する
    単一の入り口 実行継続では、通常は 1 回だけ呼び出されますasyncio.run()
    自動クリーニング 残りのタスクはすべて自動的にキャンセルされ、スレッド プールが閉じられるため、非常に安全です。
    ネスト制限 できないすでにasync def関数の内部呼び出しasyncio.run()

    4. 一般的なエラー: RuntimeError

    非同期関数内で別の非同期関数の結果を取得しようとしている場合は、次を使用します。await、 の代わりにasyncio.run()

    # エラーのデモ
    async def sub_task():
        10を返す
    
    非同期def main():
        # ここでエラーが発生します: RuntimeError: asyncio.run() は実行中のイベント ループから呼び出すことはできません
        res = asyncio.run(sub_task())
        
    # 訂正
    非同期def main():
        res = await sub_task() # 非同期環境では await を使用してください

    5. 実践的な提案



    Pythonデータ分析

    Python の科学演算 NumPy

    NumPy(Numerical Python) は、Python の最も重要な科学計算ライブラリです。効率的な多次元配列オブジェクトを提供します。ndarray、およびこれらの配列を操作するための数学関数の大規模なライブラリ。これは、データ サイエンス、機械学習 (Pandas、Scikit-learn、TensorFlow など) およびその他の分野の基礎となる柱です。


    1. ネイティブ List ではなく NumPy を選択する理由は何ですか?


    2. コアオブジェクト: ndarray の基本操作

    numpyをnpとしてインポート
    
    # 1次元配列と2次元配列を作成する
    arr1 = np.array([1, 2, 3])
    arr2 = np.array([[1, 2], [3, 4]])
    
    # 特定の配列をすばやく作成する
    zeros = np.zeros((3, 3)) # すべてがゼロの 3x3 行列
    ones = np.ones((2, 4)) # すべて 1 の 2x4 行列
    eye = np.eye(3) # 3x3 単位行列
    range_arr = np.arange(0, 10, 2) # [0, 2, 4, 6, 8]

    3. よく使用される配列演算と属性

    関数 コード例 説明する
    形状チェック arr.shape 各次元のサイズを返します ((3, 2) など)。
    形を変える arr.reshape(1, 6) データを変更せずにディメンションを変更します。
    行列乗算 np.dot(a, b)またはa @ b 線形代数で行列の乗算を実行します。
    統計関数 np.mean(), np.std() 平均値、標準偏差、最大値、最小値を計算します。

    4. スライスとインデックス作成

    NumPy のスライス構文は Python List に似ていますが、より強力で、多次元の同時スライスをサポートしています。

    arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
    
    # 2 番目の列 (インデックス 1) を取得します
    print(arr[1, :]) # [4, 5, 6]
    
    # 右下隅の 2x2 部分行列を取得します
    print(arr[1:, 1:]) # [[5, 6], [8, 9]]

    5. インストールとバージョンの確認


    6.Numbaと併用する

    前述したように、NumbaNumPy の配列構造を完全に認識し、さらに複雑な NumPy 操作をマシンコードにコンパイルして、ネイティブ C 言語に近い実行限界に達します。



    Python は大量のデータを効率的に処理します Numba

    Numbaこれは、大量のデータを処理する Python コードを高速化するために特別に設計されたオープンソース JIT (ジャストインタイム) コンパイラーです。 C、C++、または Fortran と同等の実行速度で Python 関数をマシンコードに変換でき、特に次の用途に適しています。NumPy配列操作。


    1. 主要な機能と利点


    2. 基本的な使用例

    Numba を使用する最も簡単な方法は、次のように追加することです。@jitまたは@njitデコレーター。

    numbaインポートnjitから
    numpyをnpとしてインポート
    
    # @njit は、Python パーサーに入らないようにする「nopython」モードを表し、最も高速です
    @njit
    def fast_function(n):
        合計=0
        range(n) の i の場合:
            合計 += i
        返品合計
    
    # 最初の呼び出しはコンパイルされ、2 番目の呼び出しはマシンコードを直接実行します
    print(fast_function(10000000))

    3. パターンの比較: nopython と object

    モデル デコレーター 説明する
    noPythonモード @njit 推奨。Python インタプリタから完全に分離され、マシンコードに直接コンパイルされます。プログラムコードにコンパイルできない部分が含まれている場合、エラーが報告されます。
    オブジェクトモード @jit コンパイルできない場合は、Python パーサーにフォールバックして実行されます。通常、パフォーマンスの向上には限界があります。

    4. 一般的に使用される手法: 並列操作

    CPU のマルチコア機能を活用するには、単にオンにします。parallel=Trueそして使用しますprange

    numba import njit、prange から
    
    @njit(平行=True)
    デフォルトのParallel_sum(A):
        s = 0
        # prange はループを別の CPU コアに自動的に割り当てます
        prange(A.shape[0]) の i の場合:
            s += A[i]
        を返します

    5. インストールと依存関係のチェック


    6. 利用制限



    パンダデータ分析ツール

    パンダとは何ですか?

    Pandas は、表形式データや時系列データなどの構造化データを処理するために設計された Python ベースのデータ分析および操作ツールです。

    Pandas のコア データ構造

    パンダの主な特徴

    使用例

    パンダをPDとしてインポートする
    
    # データフレームを作成する
    データ = {'名前': ['アリス', 'ボブ', 'チャーリー'],
            「年齢」: [25、30、35]、
            '都市': ['台北'、'台中'、'高雄']}
    df = pd.DataFrame(データ)
    
    # データを表示する
    印刷(df)
    
    # 28 年より古い情報をフィルタリングします
    filtered_df = df[df['age'] > 28]
    印刷(filtered_df)

    該当するシナリオ

    なぜパンダを選ぶのか?

    Pandas は、特にデータの分析と処理に適した、効率的で柔軟かつ直感的な操作方法を提供します。データ サイエンスと機械学習に欠かせないツールの 1 つです。

    結論は

    Pandas は強力なデータ分析ツールであり、初心者も上級ユーザーもその使いやすいデザインと広範な機能の恩恵を受けることができます。



    Python Googletrans

    Googletransをインストールする

    まずインストールする必要がありますgoogletransキット。コマンドラインに次のコマンドを入力します。

    pip install googletrans==4.0.0-rc1

    注意:インストール時にバージョンをご確認ください。4.0.0-rc1、古いバージョンは動作しなくなる可能性があるためです。

    基本的な使用例

    英語を繁体字中国語に翻訳する例を次に示します。

    googletransインポート翻訳者から
    
    #Translator オブジェクトを初期化する
    翻訳者 = 翻訳者()
    
    # テキストを翻訳する
    text = 「こんにちは、お元気ですか?」
    result = translator.translate(text, src="en", dest="zh-tw")
    
    # 翻訳結果を出力する
    print("元のテキスト:", text)
    print("翻訳:", result.text)

    サポートされている言語コード

    複数の言語を翻訳できます。共通の言語コードは次のとおりです。

    注意事項

    Googletrans は非公式の Google Translate API であり、Google 側の変更により機能しなくなる可能性があります。翻訳機能が動作しない場合は、Google の公式クラウド翻訳など、他の翻訳 API の使用を検討してください。 API。



    Python のその他の翻訳キット

    DeepL Translator

    DeepL は高精度の翻訳サービスを提供しますが、開発者 API を使用するには API キーが必要です。

    Microsoft Translator

    Microsoft が提供する翻訳ツールは多言語翻訳をサポートしていますが、Azure API キー設定を使用する必要があります。

    Amazon Translate

    アマゾン ウェブ サービス (AWS) が提供する翻訳サービスは、多言語テキストの効率的な翻訳を提供します。AWS が提供する API キーを介してアクセスする必要があります。

    LibreTranslate

    LibreTranslate は、独自のサーバーをセットアップでき、API キーを必要としないオープンソースの翻訳ツールです。一部のサードパーティの公開サーバーでは、API キーなしで使用するオプションも提供しています。

    TextBlob

    TextBlob は、Google 翻訳機能が組み込まれた自然言語処理ベースのツールです。ただし、古いバージョンでは API キーが必要ないため、バージョンのサポートに注意を払う必要がある場合があります。

    MyMemory

    MyMemory は記憶ベースの翻訳を提供します。一部の機能はAPIキーを必要としませんが、高度な使用には申請が必要な場合があります。

    結論は

    Googletrans の競合他社の中で、LibreTranslate と TextBlob の一部のバージョンは、API キーを必要としないオプションを提供しています。完全に無料で追加のセットアップが必要ないツールが必要な場合は、これらのオプションを検討してください。



    OpenCC 中国語変換

    OpenCC(Open Chinese Convert) は、簡体字中国語から繁体字中国語への変換に特化したオープンソース プロジェクトです。これは単純な単語から単語への変換だけではなく、さらに重要なことに、語彙レベルさまざまな地域(中国本土、台湾、香港)における単語の使用習慣の変換と違い。


    1. OpenCC の主な利点