Pythonの関数とモジュール

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

はじめに

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

関数の定義と利用

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

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

python

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

Python Interpreter

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

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

インデントされた return 行を入力した後、空行でEnterキーを一度押して関数定義を終了します。次に、同じインタプリタで関数を実行します。

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

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

Hello, Alice!

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

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

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

空行でEnterキーを押して定義を終了し、関数を呼び出します。

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

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

The area is: 15

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

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

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

空行でEnterキーを押し、両方の呼び出しをテストします。

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

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

9
27

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

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

def min_max(numbers):
    return min(numbers), max(numbers)

空行でEnterキーを押し、関数を呼び出します。

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 が変更されました。

関数は、囲んでいるスコープ(enclosing scope)の変数にアクセスすることもできます。

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モジュールの作成方法と利用方法を学びます。

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モジュールやパッケージのエコシステムを探求してください。