Python の関数とモジュール

PythonPythonBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、Python プログラミングにおける 2 つの基本概念である関数とモジュールを学びます。関数を使うことで、コードを再利用可能なブロックに整理することができ、プログラムをよりモジュール化して理解しやすくすることができます。モジュールを使うことで、関連する関数や変数を別々のファイルに整理することができ、コードの再利用性と保守性を向上させることができます。これらの概念をマスターすることで、より効率的で整理された Python コードを書くことができるようになります。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL python(("Python")) -.-> python/BasicConceptsGroup(["Basic Concepts"]) python(("Python")) -.-> python/FunctionsGroup(["Functions"]) python(("Python")) -.-> python/ModulesandPackagesGroup(["Modules and Packages"]) python/BasicConceptsGroup -.-> python/variables_data_types("Variables and Data Types") python/FunctionsGroup -.-> python/function_definition("Function Definition") python/FunctionsGroup -.-> python/arguments_return("Arguments and Return Values") python/FunctionsGroup -.-> python/scope("Scope") python/ModulesandPackagesGroup -.-> python/importing_modules("Importing Modules") python/ModulesandPackagesGroup -.-> python/creating_modules("Creating Modules") python/ModulesandPackagesGroup -.-> python/using_packages("Using Packages") python/ModulesandPackagesGroup -.-> python/standard_libraries("Common Standard Libraries") subgraph Lab Skills python/variables_data_types -.-> lab-393141{{"Python の関数とモジュール"}} python/function_definition -.-> lab-393141{{"Python の関数とモジュール"}} python/arguments_return -.-> lab-393141{{"Python の関数とモジュール"}} python/scope -.-> lab-393141{{"Python の関数とモジュール"}} python/importing_modules -.-> lab-393141{{"Python の関数とモジュール"}} python/creating_modules -.-> lab-393141{{"Python の関数とモジュール"}} python/using_packages -.-> lab-393141{{"Python の関数とモジュール"}} python/standard_libraries -.-> lab-393141{{"Python の関数とモジュール"}} end

関数の定義と使用

このステップでは、Python で関数を定義して使用する方法を学びます。

  1. ターミナルに次のコマンドを入力して Python インタプリタを開きます。

    python

    Python のプロンプト (>>>) が表示されるはずで、これで Python の対話型シェルに入ったことがわかります。

Python Interpreter
  1. まず、人に挨拶する簡単な関数を定義しましょう。Python インタプリタに次のように入力します。

    >>> def greet(name):
    ...     return f"Hello, {name}!"
    ...
    >>> result = greet("Alice")
    >>> print(result)
    Hello, Alice!
    1. 関数は def キーワードに続けて関数名と括弧内のパラメータで定義します。関数本体はインデントされます。
    2. この関数は name パラメータを受け取り、挨拶文字列を返します。そして、引数 "Alice" で関数を呼び出し、結果を表示します。
    3. return 文は関数から値を返すために使用されます。return 文がない場合、関数は None を返します。
    4. 関数は再利用可能なコードをカプセル化し、特定のタスクを実行するために使用できます。これは Python プログラムの主な構成要素です。
  2. 次に、計算を行う関数を作成しましょう。

    >>> def calculate_area(length, width):
    ...     return length * width
    ...
    >>> area = calculate_area(5, 3)
    >>> print(f"The area is: {area}")
    The area is: 15

    この関数は、長さと幅を指定して四角形の面積を計算します。

  3. 関数にはデフォルトのパラメータ値も設定できます。

    >>> def power(base, exponent=2):
    ...     return base ** exponent
    ...
    >>> print(power(3))
    9
    >>> print(power(3, 3))
    27

    ここでは、指数を指定しない場合、関数はデフォルト値として 2 を使用します。

  4. 関数はタプルを使って複数の値を返すことができます。

    >>> def min_max(numbers):
    ...     return min(numbers), max(numbers)
    ...
    >>> minimum, maximum = min_max([1, 5, 3, 9, 2])
    >>> print(f"Minimum: {minimum}, Maximum: {maximum}")
    Minimum: 1, Maximum: 9

    この関数は、数値のリストから最小値と最大値の両方を返します。

Python ではインデントが重要です。関数本体は一貫したインデントにする必要があります。

関数のスコープの理解

このステップでは、関数のスコープと、関数の内外で変数がどのように振る舞うかを学びます。

  1. Python インタプリタで、ローカル変数とグローバル変数を調べましょう。

    >>> x = 10  ## グローバル変数
    
    >>> def print_x():
    ...     print(f"Global x: {x}")
    ...
    >>> print_x()
    Global x: 10
    
    >>> def change_x():
    ...     x = 20  ## ローカル変数
    ...     print(f"Local x: {x}")
    ...
    >>> change_x()
    Local x: 20
    >>> print(f"Global x after change_x(): {x}")
    Global x after change_x(): 10

    change_x() 関数は新しいローカル変数 x を作成し、これがグローバルな x に影響を与えないことに注意してください。

  2. 関数内でグローバル変数を変更するには、global キーワードを使用します。

    >>> def modify_global_x():
    ...     global x
    ...     x = 30
    ...     print(f"Modified global x: {x}")
    ...
    >>> modify_global_x()
    Modified global x: 30
    >>> print(f"Global x after modify_global_x(): {x}")
    Global x after modify_global_x(): 30

    これでグローバルな x が変更されました。

  3. 関数はまた、その囲むスコープの変数にアクセスすることができます。

    >>> def outer_function(x):
    ...     def inner_function():
    ...         print(f"x from outer function: {x}")
    ...     inner_function()
    ...
    >>> outer_function(40)
    x from outer function: 40

    内側の関数は外側の関数の x パラメータにアクセスできます。

関数のスコープを理解することは、クリーンでバグのないコードを書くために重要です。それは意図しない副作用を防ぎ、関数をより予測可能にするのに役立ちます。

モジュールの作成と使用

このステップでは、Python のモジュールを作成して使用する方法を学びます。

  1. exit() を入力するか、Ctrl+D を押して Python インタプリタを終了します。
  2. LabEx VM 環境で WebIDE を開きます。

WebIDE LabEx VM interface 3. ~/project ディレクトリに新しいファイル math_operations.py を作成します。

touch ~/project/math_operations.py
  1. WebIDE エディタで新しく作成したファイルを開き、次の内容を追加します。

    ## math_operations.py
    
    def add(a, b):
        return a + b
    
    def subtract(a, b):
        return a - b
    
    def multiply(a, b):
        return a * b
    
    def divide(a, b):
        if b!= 0:
            return a / b
        else:
            return "Error: Division by zero"
    
    PI = 3.14159

    このモジュールには、4 つの基本的な数学演算と定数 PI が含まれています。

  2. ファイルを保存します(WebIDE では自動保存が有効になっています)。

  3. 同じディレクトリに別のファイル use_math_module.py を作成します。

    touch ~/project/use_math_module.py
  4. WebIDE エディタで use_math_module.py を開き、次の内容を追加します。

    ## use_math_module.py
    
    import math_operations
    
    result_add = math_operations.add(5, 3)
    result_subtract = math_operations.subtract(10, 4)
    result_multiply = math_operations.multiply(2, 6)
    result_divide = math_operations.divide(15, 3)
    
    print(f"Addition: {result_add}")
    print(f"Subtraction: {result_subtract}")
    print(f"Multiplication: {result_multiply}")
    print(f"Division: {result_divide}")
    print(f"Value of PI: {math_operations.PI}")

    このスクリプトは math_operations モジュールをインポートし、その関数と定数を使用しています。

  5. ファイルを保存し、ターミナルで次のコマンドを使用して実行します。

    python ~/project/use_math_module.py

    次のような出力が表示されるはずです。

    Addition: 8
    Subtraction: 6
    Multiplication: 12
    Division: 5.0
    Value of PI: 3.14159

モジュールを作成することで、関連する関数や変数を別々のファイルに整理することができ、コードの保守性と再利用性を向上させることができます。

モジュールをインポートすると、Python はそれをバイトコードにコンパイルし、コンパイルされたコードを __pycache__ ディレクトリに保存します。このディレクトリはモジュールファイルと同じ場所に作成され、コンパイルされたバイトコードファイル(.pyc または .pyo)が含まれています。

このディレクトリは安全に無視して構いません。なぜなら、Python が自動的にモジュールのコンパイルとキャッシュを処理するからです。

モジュールから特定の関数をインポートする

このステップでは、モジュールから特定の関数をインポートし、エイリアスを使ってコードをより簡潔にする方法を学びます。

  1. ~/project ディレクトリに新しいファイル advanced_math.py を作成します。

    touch ~/project/advanced_math.py
  2. WebIDE エディタで advanced_math.py を開き、次の内容を追加します。

    ## advanced_math.py
    
    import math
    
    def square_root(x):
        return math.sqrt(x)
    
    def power(base, exponent):
        return math.pow(base, exponent)
    
    def sin(angle):
        return math.sin(math.radians(angle))
    
    def cos(angle):
        return math.cos(math.radians(angle))

    このモジュールは Python の組み込み math モジュールを使って、より高度な数学演算を提供します。

  3. 同じディレクトリに use_advanced_math.py という名前のファイルを作成します。

    touch ~/project/use_advanced_math.py
  4. WebIDE エディタで use_advanced_math.py を開き、次の内容を追加します。

    ## use_advanced_math.py
    
    from advanced_math import square_root, power
    from advanced_math import sin as sine, cos as cosine
    
    x = 16
    y = 2
    angle = 30
    
    print(f"Square root of {x}: {square_root(x)}")
    print(f"{x} to the power of {y}: {power(x, y)}")
    print(f"Sine of {angle} degrees: {sine(angle)}")
    print(f"Cosine of {angle} degrees: {cosine(angle)}")

    このスクリプトは advanced_math モジュールから特定の関数をインポートし、sincos にエイリアスを使っています。

  5. ファイルを保存し、ターミナルで次のコマンドを使って実行します。

    python ~/project/use_advanced_math.py

    次のような出力が表示されるはずです。

    Square root of 16: 4.0
    16 to the power of 2: 256.0
    Sine of 30 degrees: 0.49999999999999994
    Cosine of 30 degrees: 0.8660254037844387

特定の関数をインポートしてエイリアスを使うことで、コードをより読みやすくし、異なるモジュール間の名前の衝突を避けることができます。

パッケージの作成

この最後のステップでは、関連するモジュールをディレクトリ階層にまとめる方法であるパッケージを作成する方法を学びます。

  1. ~/project ディレクトリに新しいディレクトリ geometry を作成します。

    mkdir ~/project/geometry
  2. geometry ディレクトリの中に、2つのファイル __init__.pyshapes.py を作成します。

    touch ~/project/geometry/__init__.py
    touch ~/project/geometry/shapes.py

    __init__.py ファイルは、Python にディレクトリをパッケージとして扱わせるために必要です。これは空でもよいし、パッケージの初期化コードを含んでいてもよいです。

  3. WebIDE エディタで shapes.py を開き、次の内容を追加します。

    ## geometry/shapes.py
    
    import math
    
    def circle_area(radius):
        return math.pi * radius ** 2
    
    def rectangle_area(length, width):
        return length * width
    
    def triangle_area(base, height):
        return 0.5 * base * height
  4. 次に、~/project ディレクトリに use_geometry_package.py という名前のファイルを作成します。

    touch ~/project/use_geometry_package.py
  5. WebIDE エディタで use_geometry_package.py を開き、次の内容を追加します。

    ## use_geometry_package.py
    
    from geometry.shapes import circle_area, rectangle_area, triangle_area
    
    radius = 5
    length = 4
    width = 6
    base = 3
    height = 8
    
    print(f"Area of circle with radius {radius}: {circle_area(radius):.2f}")
    print(f"Area of rectangle with length {length} and width {width}: {rectangle_area(length, width)}")
    print(f"Area of triangle with base {base} and height {height}: {triangle_area(base, height)}")
  6. ファイルを保存し、ターミナルで次のコマンドを使って実行します。

    python ~/project/use_geometry_package.py

    次のような出力が表示されるはずです。

    Area of circle with radius 5: 78.54
    Area of rectangle with length 4 and width 6: 24
    Area of triangle with base 3 and height 8: 12.0

パッケージを作成することで、関連するモジュールをディレクトリ階層にまとめることができ、プロジェクトで関連する機能を管理してインポートするのが簡単になります。

まとめ

この実験では、Python プログラミングにおける 2 つの基本的な概念:関数とモジュールを学びました。関数の定義と使用方法、関数のスコープの理解、モジュールの作成と使用、モジュールから特定の関数をインポートする方法、および関連するモジュールをパッケージにまとめる方法を学びました。

最初に簡単な関数を作成し、徐々に関数のスコープやグローバル変数などのより複雑な概念に移行しました。その後、関連する関数や変数を別々のファイルにまとめることでコードの保守性と再利用性を向上させるモジュールの作成方法を学びました。

モジュールから関数をインポートするさまざまな方法、特定の関数のインポートやエイリアスの使用などを学びました。この知識を使うことで、異なるモジュール間の名前の衝突を避けながら、より簡潔で読みやすいコードを書くことができます。

最後に、関連するモジュールをディレクトリ階層にまとめる方法であるパッケージの作成方法を学びました。これは、複数の関連するモジュールを管理する必要がある大規模なプロジェクトにとって特に便利です。

関数とモジュールのこれらの概念は、整理された、効率的な、再利用可能な Python コードを書くために不可欠です。Python の学習を続けるにつれて、これらのスキルは、より複雑なプログラムを構築し、大規模なプロジェクトでの共同作業にとって不可欠であることがわかります。これらの概念を定期的に練習し、Python モジュールやパッケージの豊富なエコシステムを探求して、プログラミング能力を向上させることを忘れないでください。