コンテンツにスキップ

関数のreturnの使い方をPythonチュートリアルで解説

CodeMDD.io

Pythonの戻り値の使い方とベストプラクティス

効果的にreturnステートメントを使用することは、Pythonicで堅牢なカスタム関数のコーディングにおいて、重要なスキルです。

このチュートリアルでは以下の内容を学びます:

  • 関数内でのPythonのreturnステートメントの使用方法
  • 関数から単一の値または複数の値を返す方法
  • returnステートメントの使用時に遵守すべきベストプラクティス

クイズに参加: インタラクティブな「The Python return Statement」クイズであなたの知識をテストしましょう。クイズの完了後にスコアが表示されますので、学習の進捗状況を追跡することができます:

クイズに参加する »

Python関数のはじめ方

ほとんどのプログラミング言語では、具体的な計算を実行するコードブロックに名前を割り当てることができます。これらの名前付きコードブロックは、コード内のさまざまな場所から呼び出すために名前を使用できるため、迅速に再利用することができます。

プログラマは、これらの名前付きコードブロックをサブルーチンルーチン手続き、または関数と呼びます。

Pythonでは、関数を定義するためにdefキーワードを使用します。以下の例をご覧ください:

def add_numbers(x, y):
"""与えられた二つの数値を加算する関数"""
return x + y

関数は複数の引数を受け取ることができ、処理を行った結果をreturnステートメントで返します。

Pythonのreturnステートメントの理解

Pythonのreturnステートメントは、関数が実行された結果を呼び出し元のコードに返すために使用します。returnステートメントの後に指定された値が呼び出し元に返されます。

明示的なreturnステートメント

明示的なreturnステートメントは、関数の中で明示的に値を返すために使用されます。以下の例をご覧ください:

def multiply_numbers(x, y):
"""与えられた二つの数値を掛け合わせる関数"""
return x * y

この関数では、与えられた二つの数値を掛け合わせた結果がreturnステートメントで返されます。

暗黙的なreturnステートメント

暗黙的なreturnステートメントは、関数の中で値を返すために使用されますが、returnキーワードを明示的に指定しない場合に発生します。以下の例をご覧ください:

def say_hello():
""""Hello, World!"と表示する関数"""
print("Hello, World!")
say_hello()

この関数はreturnステートメントを含んでいないため、呼び出し元に値を返すことはありません。この場合、関数内のコードが実行されるだけで、値は返されません。

戻り値の返却vs表示

関数が値を返す場合、その結果を明示的に取得して使用することができます。以下の例をご覧ください:

def calculate_square(x):
"""与えられた数値の二乗を計算する関数"""
return x ** 2
result = calculate_square(5)
print(result)

この場合、関数calculate_square5の二乗を計算し、その結果の25を返します。result変数には25が格納され、print関数によって出力されます。

一方、関数が値を返さずに単に値を表示する場合、呼び出し元はその値を取得することはできません。以下の例をご覧ください:

def say_hello():
""""Hello, World!"と表示する関数"""
print("Hello, World!")
result = say_hello()
print(result)

この場合、say_hello関数はprint関数を使用して文字列を表示しますが、値を返さないため、result変数にはNoneが格納されます。print(result)の出力はNoneとなります。

複数の値の返却

Pythonのreturnステートメントは、単一の値だけでなく、複数の値をタプルやリストの形式で返すこともできます。以下の例をご覧ください:

def get_name():
"""名前と姓を返す関数"""
return "John", "Doe"
first_name, last_name = get_name()
print(first_name)
print(last_name)

この場合、get_name関数はタプル形式で"John""Doe"を返します。first_name変数には"John"が、last_name変数には"Doe"が格納されます。print関数によってそれぞれの値が出力されます。

複数の値を返すことは、関数の柔軟性と便利さを向上させるために役立ちます。

Pythonのreturnステートメントの使用時のベストプラクティス

関数内でreturnステートメントを使用する際には、いくつかのベストプラクティスに従うことが推奨されます。以下にいくつかのベストプラクティスを紹介します:

明示的にNoneを返す

関数が戻り値を返さない場合、明示的にNoneを返すことが推奨されます。これにより、呼び出し元が関数が値を返さないことを明確に認識することができます。以下の例をご覧ください:

def say_hello():
""""Hello, World!"と表示する関数"""
print("Hello, World!")
return None

この例では、returnステートメントが明示的にNoneを返すようになっています。

戻り値の記憶

関数が値を返す場合、その値を変数に割り当てることで、後の処理で使用することができます。以下の例をご覧ください:

def calculate_square(x):
"""与えられた数値の二乗を計算する関数"""
return x ** 2
result = calculate_square(5)
print(result)

この場合、関数calculate_squareの結果を変数resultに割り当てています。その結果を後続の処理で使用できます。

複雑な式の回避

関数が値を返す場合、返される値を取得するために他の式を含んでいる場合、可読性の低下やエラーの発生の可能性があります。そのため、戻り値を変数に割り当て、その変数を使用することを推奨します。以下の例をご覧ください:

# 非推奨
if calculate_square(5) >= 25:
print("Large number!")
# 推奨
result = calculate_square(5)
if result >= 25:
print("Large number!")

この例では、戻り値が25以上かどうかをチェックしています。戻り値を変数に割り当てることで、if文の条件式を読みやすくし、エラーの発生を防ぐことができます。

値の変更よりも戻り値を返す

関数が変数を変更する代わりに値を返すことを推奨します。関数が呼び出し元に値を返すことで、プログラムの状態の変更を防ぐことができます。以下の例をご覧ください:

my_list = [1, 2, 3]
# 非推奨
def add_to_list(value):
"""リストに値を追加する関数"""
global my_list
my_list.append(value)
add_to_list(4)
print(my_list) # [1, 2, 3, 4]
# 推奨
def get_extended_list(value):
"""値が追加されたリストのコピーを返す関数"""
return my_list + [value]
extended_list = get_extended_list(4)
print(extended_list) # [1, 2, 3, 4]
print(my_list) # [1, 2, 3]

この例では、戻り値を使用した方が変数の変更よりも望ましいとされています。add_to_list関数ではグローバル変数my_listを変更するため、関数が呼び出されるとリストが変更されます。一方、get_extended_list関数では新しいリストを返すため、元のリストは変更されません。

条件文でreturnを使用する

関数が条件文を含む場合、条件によって異なる値を返すことができます。returnステートメントを使用して、それに応じた値を返すことが推奨されます。以下の例をご覧ください:

def check_even(number):
"""与えられた数値が偶数かどうかを確認する関数"""
if number % 2 == 0:
return True
return False

この例では、関数check_evenは与えられた数値が偶数であるかどうかをチェックします。偶数の場合はTrueを、そうでない場合はFalseを返します。

TrueまたはFalseの返却

真偽値を返す関数では、TrueまたはFalseを明示的に返すことが推奨されます。以下の例をご覧ください:

def is_even(number):
"""与えられた数値が偶数かどうかを確認する関数"""
if number % 2 == 0:
return True
return False

この例では、関数is_evenは与えられた数値が偶数であるかどうかをチェックします。偶数の場合はTrueを、そうでない場合はFalseを返します。

ループの短絡評価

ループ内でreturnステートメントを使用することで、処理を早期終了させることができます。以下の例をご覧ください:

def find_number(numbers, target):
"""与えられたリスト内でターゲットの数値を検索する関数"""
for number in numbers:
if number == target:
return True
return False

この例では、関数find_numberはリスト内でターゲットの数値を検索します。ターゲットの数値が見つかった場合はTrueを、そうでない場合はFalseを返します。ループ内でターゲットの数値が見つかった場合、returnステートメントによりループが中断されます。

デッドコードの認識

returnステートメント以降のコードが実行されないように注意する必要があります。これをデッドコードと呼びます。以下の例をご覧ください:

def check_even(number):
"""与えられた数値が偶数かどうかを確認する関数"""
if number % 2 == 0:
return True
print("This line will not be executed")
return False

この例では、returnステートメントの後にprint関数がありますが、関数がreturnステートメントを実行すると、この行は実行されません。

複数の名前付きオブジェクトの返却

関数が複数の名前付きオブジェクトを返す場合、タプルや辞書の形式で返すことが推奨されます。以下の例をご覧ください:

def get_person():
"""名前と年齢を返す関数"""
return {"name": "John", "age": 30}
person = get_person()
print(person["name"])
print(person["age"])

この例では、関数get_personは名前と年齢を保持する辞書を返します。person変数には辞書が格納され、それぞれの値が出力されます。

関数の戻り値: クロージャ

関数は別の関数を返すこともあります。これをクロージャと呼びます。以下の例をご覧ください:

def multiply_by(x):
"""指定された数値で掛け算を行う関数を返す関数"""
def multiplier(number):
return number * x
return multiplier
multiply_by_2 = multiply_by(2)
print(multiply_by_2(5)) # 10
multiply_by_3 = multiply_by(3)
print(multiply_by_3(5)) # 15

この例では、関数multiply_byは掛け算を行う関数を返します。戻り値の関数は指定された数値で掛け算を行うため、multiply_by_2(5)10を、multiply_by_3(5)15を返します。

関数の受け渡しと戻り値: デコレータ

関数は他の関数を受け取り、別の関数を返すこともあります。これをデコレータと呼びます。デコレータは特定の機能を追加するために使用されます。以下の例をご覧ください:

def uppercase(func):
"""文字列を大文字に変換するデコレータ"""
def wrapper(text):
return func(text.upper())
return wrapper
@uppercase
def say_hello(name):
"""名前を大文字で挨拶する関数"""
return f"Hello, {name}!"
print(say_hello("John")) # "HELLO, JOHN!"

この例では、uppercaseデコレータが関数say_helloを受け取り、新しい関数を返します。新しい関数は与えられた文字列を大文字に変換してから元の関数に渡します。say_hello("John")の結果は"HELLO, JOHN!"となります。

ユーザー定義オブジェクトの返却: ファクトリパターン

関数はユーザー定義オブジェクトも返すことができます。これをファクトリパターンと呼びます。ファクトリパターンでは、関数が新しいオブジェクトを生成して返すことで、柔軟なインスタンス化を実現します。以下の例をご覧ください:

class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def create_person(name, age):
"""Personオブジェクトを作成して返す関数"""
return Person(name, age)
person = create_person("John", 30)
print(person.name)
print(person.age)

この例では、create_person関数が新しいPersonオブジェクトを作成し、それを返します。person変数にはcreate_person関数の返り値であるPersonオブジェクトが格納され、nameageが出力されます。

try … finallyブロック内のreturnの使用

try ... finallyブロックの中でreturnステートメントを使用すると、finallyブロックが実行される前に関数が終了します。以下の例をご覧ください:

def divide(x, y):
"""二つの数値の除算を行う関数"""
try:
result = x https://codemdd.io/ y
return result
finally:
print("Finally block executed")
print(divide(10, 2)) # 5.0

この例では、divide関数がxyで割った結果を返しますが、finallyブロックが実行される前に関数が終了します。finallyブロック内のメッセージが出力されます。

ジェネレータ関数でのreturnの使用

returnステートメントを使用してジェネレータ関数内で早期終了することができます。以下の例をご覧ください:

def generate_numbers():
"""1から10までの数値を生成するジェネレータ関数"""
for i in range(1, 11):
if i == 5:
return
yield i
numbers = generate_numbers()
for number in numbers:
print(number)

この例では、generate_numbers関数が1から10までの数値を生成しますが、i5になった時点でreturnステートメントが実行され、関数が早期終了します。したがって、5以降の数値は出力されません。

結論

Pythonのreturnステートメントを効果的に使用することで、関数をより読みやすく、保守性が高く、簡潔に記述することができます。明示的なreturnステートメントや暗黙的なreturnステートメント、戻り値の変数への割り当て、複数の値の返却、ベストプラクティスなど様々な使い方があります。これらの使用方法をマスターすることで、Pythonで効果的な関数を作成することができます。