Python の関数とモジュール

PythonBeginner
オンラインで実践に進む

はじめに

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

関数の定義と使用

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

ターミナルで次のコマンドを入力して、Python インタプリタを起動します。

python

Python のプロンプト(>>>)が表示されれば、Python インタラクティブシェルに入ったことになります。

Python Interpreter

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

def greet(name):
    return f"Hello, {name}!"

result = greet("Alice")
print(result)

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

Hello, Alice!

関数は def キーワードに続いて関数名、そして括弧内のパラメータを使用して定義します。関数の本体はインデント(字下げ)されます。
この関数は name というパラメータを受け取り、挨拶の文字列を返します。その後、引数 "Alice" を指定して関数を呼び出し、結果を出力しています。
return 文は、関数から値を返すために使用されます。return 文がない場合、関数は None を返します。
関数は、再利用可能なコードをカプセル化し、特定のタスクを実行するために使用されます。これは Python プログラムの主要な構成要素です。

次に、計算を行う関数を作成してみましょう。

def calculate_area(length, width):
    return length * width

area = calculate_area(5, 3)
print(f"The area is: {area}")

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

The area is: 15

この関数は、与えられた長さ(length)と幅(width)から長方形の面積を計算します。

関数には、パラメータのデフォルト値を設定することもできます。

def power(base, exponent=2):
    return base ** exponent

print(power(3))
print(power(3, 3))

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

9
27

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

関数はタプルを使用して複数の値を返すこともできます。

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 ではインデントが非常に重要であることを忘れないでください。関数の本体は一貫してインデントされている必要があります。

関数のスコープを理解する

このステップでは、関数のスコープ(有効範囲)と、変数が関数の内部と外部でどのように振る舞うかについて学びます。

Python インタプリタで、ローカル変数とグローバル変数について調べてみましょう。

x = 10  ## グローバル変数

def print_x():
    print(f"Global x: {x}")

print_x()

def change_x():
    x = 20  ## ローカル変数
    print(f"Local x: {x}")

change_x()
print(f"Global x after change_x(): {x}")

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

Global x: 10
Local x: 20
Global x after change_x(): 10

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

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

def modify_global_x():
    global x
    x = 30
    print(f"Modified global x: {x}")

modify_global_x()
print(f"Global x after modify_global_x(): {x}")

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

Modified global x: 30
Global x after modify_global_x(): 30

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

また、関数はそれを取り囲むスコープ(エンクロージングスコープ)の変数にアクセスすることもできます。

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

outer_function(40)

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

x from outer function: 40

内側の関数(inner function)は、外側の関数(outer function)のパラメータ x にアクセスできます。

関数のスコープを理解することは、クリーンでバグのないコードを書くために不可欠です。これにより、意図しない副作用を防ぎ、関数の動作をより予測しやすくすることができます。

モジュールの作成と使用

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

exit() と入力するか、Ctrl+D を押して Python インタプリタを終了します。

LabEx VM 環境で WebIDE を開きます。

WebIDE LabEx VM interface

~/project ディレクトリに math_operations.py という名前の新しいファイルを作成します。

touch ~/project/math_operations.py

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 が含まれています。

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

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

touch ~/project/use_math_module.py

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 モジュールをインポートし、その関数と定数を使用します。

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

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 がモジュールのコンパイルとキャッシュを自動的に処理するため、このディレクトリについては特に気にする必要はありません。

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

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

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

touch ~/project/advanced_math.py

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 モジュールを使用して、より高度な数学演算を提供します。

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

touch ~/project/use_advanced_math.py

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 にはエイリアスを使用しています。

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

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

特定の関数をインポートしたりエイリアスを使用したりすることで、コードの可読性を高め、異なるモジュール間での名前の衝突を避けることができます。

パッケージの作成

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

~/project ディレクトリに geometry という名前の新しいディレクトリを作成します。

mkdir ~/project/geometry

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

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

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

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

次に、~/project ディレクトリに use_geometry_package.py という名前のファイルを作成します。

touch ~/project/use_geometry_package.py

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)}")

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

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 の膨大なモジュールやパッケージのエコシステムを探索して、プログラミング能力をさらに向上させていきましょう。