コンテンツにスキップ

Pythonでreturn文を使う方法を簡単に解説します

CodeMDD.io

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

Pythonのreturnステートメントは、関数やメソッドの中で重要な役割を果たしています。returnステートメントを使うことで、関数から呼び出し元のコードにPythonオブジェクトを返すことができます。これらのオブジェクトは、プログラム内でさらなる演算を行うために使用することができます。

効果的にreturnステートメントを使用することは、Pythonicで堅牢なカスタム関数をコードするための基本的なスキルです。

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

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

クイズに挑戦しよう: 対話型の「Pythonのreturnステートメント」クイズで自分の知識をテストしましょう。クイズの完了後、スコアが表示されるので、学習の進捗を追跡することができます。

クイズに挑戦する »

Python関数のはじめ方

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

プログラマーは、これらの名前付きコードブロックをサブルーチンルーチン手続き、または関数と呼びます。呼び方は言語によって異なりますが、Pythonでは関数と呼ばれています。

関数の作成はPythonでのプログラミングの基本の一つです。関数は、特定のタスクを処理するための複数のステートメントのグループです。関数は以下のように定義されます。

def 関数名(引数1, 引数2, ...):
処理1
処理2
...
return 返り値
  • defキーワードを使用して関数を定義します。
  • 関数名は任意の名前を付けることができますが、できるだけ意味のある名前を使用することが望ましいです。
  • 引数は、関数に渡すことができる値です。引数は任意の数を持つことができます。
  • returnステートメントは、関数の処理が完了した後に呼び出し元に値を返すために使用されます。返り値はない場合、returnステートメントは省略することができます。

以下は、Pythonで単純な関数の例です。

def greet():
return "Hello, World!"
message = greet()
print(message)

この例では、greet関数が定義されています。この関数は単純に文字列”Hello, World!”を返します。greet関数を呼び出すと、returnステートメントによって返り値が呼び出し元に返されます。返された値は変数messageに代入されており、print関数によって表示されます。

ソースコードでの実行結果は以下のようになります。

Hello, World!

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

returnステートメントは、Pythonの関数内で使用されます。このステートメントを使用すると、関数は実行結果として値を返すことができます。returnステートメントは、関数内のどの位置でも使用することができますが、returnステートメントが実行されると、関数の実行はそこで終了し、呼び出し元に値が返されます。

Pythonのreturnステートメントを理解するためには、明示的なreturnステートメントと暗黙的なreturnステートメントの2つのタイプを把握する必要があります。

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

明示的なreturnステートメントは、関数内で特定の位置で呼び出されるステートメントです。returnステートメントが実行されると、関数の実行が終了し、指定された値が呼び出し元に返されます。

以下は、明示的なreturnステートメントの例です。

def add_numbers(num1, num2):
sum = num1 + num2
return sum
result = add_numbers(5, 3)
print(result)

この例では、add_numbers関数が定義されています。この関数は、2つの数値を受け取り、それらを足し合わせた結果を返します。returnステートメントが実行されると、計算結果が呼び出し元に返され、変数resultに代入されます。その後、print関数によって結果が表示されます。

ソースコードでの実行結果は以下のようになります。

8

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

Pythonの関数は、明示的なreturnステートメントがない場合、自動的にNoneを返します。このような動作のため、Pythonでは暗黙的なreturnステートメントを使用することができます。

以下は、暗黙的なreturnステートメントの例です。

def greet():
print("Hello, World!")
message = greet()
print(message)

この例では、greet関数が定義されています。この関数は単純に文字列を表示するだけで、明示的なreturnステートメントはありません。その結果、関数の実行は終了せず、自動的にNoneが呼び出し元に返されます。変数messageに代入されたNoneは、print関数によって表示されます。

ソースコードでの実行結果は以下のようになります。

Hello, World!
None

暗黙的なreturnステートメントは、関数の最後に配置されることが一般的ですが、必ずしもそうである必要はありません。関数内のどの位置でも、returnステートメントがないまま関数の実行が終了した場合、Pythonは自動的にNoneを返します。

返り値の返却 vs 表示

関数内で結果を得るためには、returnステートメントを使用する方法と、print関数を使用する方法の2つがあります。どちらの方法を使用するかは、関数の目的に応じて選択する必要があります。

returnステートメントの場合は、関数の実行結果を呼び出し元に返すことができます。一方、print関数の場合は、結果を表示するための出力文が表示されますが、関数の呼び出し元には直接的な値が返されません。

関数が他のコードとの連携や計算結果の利用を目的としている場合は、returnステートメントを使用することが適切です。一方、単に結果を表示するだけの目的であれば、print関数を使用することが適切です。

以下は、returnステートメントとprint関数の使用例です。

# returnステートメントを使用する場合
def add_numbers(num1, num2):
sum = num1 + num2
return sum
result = add_numbers(5, 3)
print(result) # 結果を表示
# print関数を使用する場合
def greet():
print("Hello, World!")
greet() # 結果を表示

ソースコードでの実行結果は以下のようになります。

8
Hello, World!

複数の値の返却

returnステートメントは、複数の値を返すことも可能です。Pythonでは、returnステートメントを使用して、タプルやリストといった複数の値を返すことができます。これにより、1つの関数で複数の結果を返すことができます。

以下は、複数の値を返す関数の例です。

def calculate_stats(numbers):
total = sum(numbers)
avg = total https://codemdd.io/ len(numbers)
return total, avg
numbers = [5, 2, 8, 12, 3]
total_sum, average = calculate_stats(numbers)
print("Sum:", total_sum)
print("Average:", average)

この例では、calculate_stats関数が定義されています。この関数は、リスト内の数字の合計と平均を計算し、それぞれの値をタプルとして返します。returnステートメントによって複数の値が呼び出し元に返され、total_sumaverageという変数に代入されます。その後、print関数によって結果が表示されます。

ソースコードでの実行結果は以下のようになります。

Sum: 30
Average: 6.0

関数からの複数の値の返却には、タプルを使用し、呼び出し元で複数の変数に分割代入する方法が一般的です。ただし、リストや他のコレクションも使用することができます。

Pythonのreturnステートメントの使用におけるベストプラクティス

returnステートメントを使用する際には、状況に応じていくつかのベストプラクティスを守ることが重要です。以下にいくつかの注意点を紹介します。

明示的にNoneを返す

関数が値を返さない場合、明示的にNoneを返すことが望ましいです。これにより、関数が値を返すことなく終了したり、コード内で意図しないバグが発生することを防ぐことができます。

以下は、明示的にNoneを返す関数の例です。

def process_data(data):
if data:
# データの処理
return result
else:
return None

この例では、process_data関数が定義されています。関数は、データが存在する場合に処理を行い、そうでない場合はNoneを返します。

返り値を記憶する

関数からの返り値を利用する場合は、その値を変数に代入して保持することが望ましいです。これにより、後で値を利用する際に再度関数を呼び出す必要がなくなり、効率的なコードを記述することができます。

以下は、返り値を記憶する例です。

def calculate_area(radius):
area = 3.14 * radius * radius
return area
circle_radius = 5
circle_area = calculate_area(circle_radius)
print("Circle Area:", circle_area)

この例では、calculate_area関数が定義されています。関数は、与えられた半径に基づいて円の面積を計算し、その値を返します。関数が返す値を変数circle_areaに代入し、その後print関数によって結果が表示されます。

ソースコードでの実行結果は以下のようになります。

Circle Area: 78.5

複雑な式の回避

returnステートメント内で複雑な式を使用することは避けるべきです。複雑な式はコードの可読性を低下させるだけでなく、バグを引き起こす可能性もあります。代わりに、複雑な式を適切な変数に分割して、それらをreturnステートメントで返すことが望ましいです。

以下は、複雑な式を適切に分割する例です。

def calculate_complex_expression(x, y, z):
intermediate_result1 = (x + y) * z
intermediate_result2 = (x - y) https://codemdd.io/ z
result = intermediate_result1 + intermediate_result2
return result

この例では、calculate_complex_expression関数が定義されています。関数は、与えられた引数を使用して複雑な式を計算し、その結果を返します。複雑な式の計算の途中結果を適切な変数に代入し、最終的な結果を返すことにより、コードの可読性を向上させています。

グローバル変数の変更 vs 返り値の返却

関数がグローバル変数の値を変更する際は、代わりにreturnステートメントを使用して値を返すことが望ましいです。グローバル変数を変更すると、コードの予測性が低下し、バグの発生しやすいコードになる可能性があります。

以下は、変数を返す代わりにグローバル変数を変更する例です。

count = 0
def increment_count():
global count
count += 1
increment_count()
print(count)

この例では、countというグローバル変数が定義されています。increment_count関数は、count変数の値をインクリメントします。関数の実行後にprint関数でcount変数の値を表示します。

ソースコードでの実行結果は以下のようになります。

1

条件文との組み合わせでのreturnステートメントの使用

条件文と組み合わせてreturnステートメントを使用することで、特定の条件に基づいて関数の実行結果を制御することができます。条件文を使用すれば、異なる返り値を持つ関数を定義することができます。

以下は、条件文と組み合わせたreturnステートメントの例です。

def is_positive(number):
if number > 0:
return True
else:
return False

この例では、is_positive関数が定義されています。関数は、与えられた数値が正の数かどうかを判定し、結果をTrueまたはFalseで返します。

TrueまたはFalseを返す

条件の結果に基づいてTrueまたはFalseを返す場合、returnステートメントを使用することが望ましいです。これにより、関数がブール値を返すことが期待されていることを明示的に示すことができます。

以下は、TrueまたはFalseを返す関数の例です。

def is_even(number):
if number % 2 == 0:
return True
else:
return False

この例では、is_even関数が定義されています。関数は、与えられた数値が偶数かどうかを判定し、結果をTrueまたはFalseで返します。

ループの早期終了

ループ内の特定の条件に基づいて関数の実行を早期終了する場合、returnステートメントを使用することができます。これにより、不要な処理が行われるのを防ぐことができます。

以下は、ループの早期終了に使用するreturnステートメントの例です。

def find_item(items, target):
for item in items:
if item == target:
return True
return False

この例では、find_item関数が定義されています。関数は、与えられたリスト内で目標のアイテムを検索し、見つかった場合にTrueを返します。見つからなかった場合は、Falseを返します。

デッドコードの認識

returnステートメントを使用する際には、デッドコードを認識することが重要です。デッドコードは、returnステートメント以降にあるコードで、実行されることはないコードです。関数の処理中に特定の条件でreturnステートメントが実行される場合、以降のコードは実行されないため、デッドコードが発生する可能性があります。

デッドコードを防ぐためには、関数のreturnステートメントの位置を適切に配置することが重要です。また、デッドコードが発生しないように、コードを十分にテストすることも重要です。

以下は、デッドコードの例です。

def calculate_total(items):
total = 0
for item in items:
total += item
if total > 100:
return total
# この行はデッドコードです
print("Total so far:", total)
return total

この例では、calculate_total関数が定義されています。関数は、与えられたリスト内の要素を合計し、合計値が100を超える場合にその値を返します。条件が満たされると、returnステートメントが実行され、print文以降のコードは実行されません。

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

returnステートメントを使用して、複数の名前付きオブジェクトを返すこともできます。Pythonでは、タプルや辞書などのデータ構造を使用して、複数のオブジェクトをまとめて返すことができます。これは、関数が異なる種類のデータを返す必要がある場合に便利です。

以下は、複数の名前付きオブジェクトを返す関数の例です。

def get_user_info():
name = "John Doe"
age = 30
hobbies = ["Reading", "Gaming", "Cooking"]
return name, age, hobbies
user_name, user_age, user_hobbies = get_user_info()
print("Name:", user_name)
print("Age:", user_age)
print("Hobbies:", user_hobbies)

この例では、get_user_info関数が定義されています。関数は、名前、年齢、趣味のリストを含む複数の名前付きオブジェクトを返します。returnステートメントによって複数の値が呼び出し元に返され、それぞれの値が別々の変数に代入されます。その後、print関数によって結果が表示されます。

ソースコードでの実行結果は以下のようになります。

Name: John Doe
Age: 30
Hobbies: ['Reading', 'Gaming', 'Cooking']

関数の返り値としての関数: クロージャ

関数は、返り値として他の関数を返すことも可能です。このような関数を返す関数をクロージャと呼びます。クロージャは、内部関数とその外側の関数を組み合わせることで、状態を保持するように設計されます。

以下は、クロージャの例です。

def outer_function(x):
def inner_function(y):
return x + y
return inner_function
closure = outer_function(5)
result = closure(3)
print(result)

この例では、outer_functioninner_functionという2つの関数が定義されています。outer_functionは、引数xを受け取り、内部関数inner_functionを返します。inner_functionは引数yを受け取り、xyの和を返します。

outer_functionを呼び出すと、それによって返されたinner_functionがクロージャとして利用できます。クロージャは、outer_functionが終了した後でも、xの値を保持し続けることができます。そのため、closure(3)を呼び出すことで、xの値に5が使用された状態で内部関数が実行され、結果が返されます。

ソースコードでの実行結果は以下のようになります。

8

クロージャは、プライベートな状態を持つ関数を作成するための強力な手法です。クロージャを活用することで、関数内で状態を保持する必要がある場合に便利なソリューションを得ることができます。

関数の引数としての関数: デコレータ

関数は、引数として他の関数を受け取ることも可能です。このような関数を引数として受け取り、その関数を内部で利用する関数をデコレータと呼びます。デコレータは、関数の動作に修飾を加えるために使用されます。

以下は、デコレータの例です。

def decorator_function(original_function):
def wrapper_function():
print("Before function execution")
original_function()
print("After function execution")
return wrapper_function
def display():
print("Display function ran")
decorated_display = decorator_function(display)
decorated_display()

この例では、decorator_functionwrapper_functionという2つの関数が定義されています。decorator_functionは、引数として受け取った関数を実行する前後にメッセージを表示するラッパー関数を返します。

display関数は、メッセージを表示する単純な関数です。

decorator_functiondisplay関数を渡して、decorated_displayというデコレータ関数を作成します。decorated_displayを実行すると、display関数が実行される前後にメッセージが表示されます。

ソースコードでの実行結果は以下のようになります。

Before function execution
Display function ran
After function execution

デコレータを使用することで、関数の動作を柔軟に修正することができます。特定の機能を関数に追加する場合や、関数の前処理や後処理を実行する場合などにデコレータを活用することができます。

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

関数は、ユーザー定義のオブジェクトを返すことも可能です。これにより、関数が異なるタイプのオブジェクトを生成するために使用されることがあります。このアプローチは、ファクトリパターンとして知られています。

以下は、ファクトリパターンの例です。

class Person:
def __init__(self, name):
self.name = name
def create_person(name):
return Person(name)
person = create_person("Alice")
print(person.name)

この例では、Personというユーザー定義のクラスが定義されています。create_person関数は、与えられた名前を使用してPersonクラスのインスタンスを生成し、返します。

create_person関数を使ってpersonオブジェクトを作成し、print関数によって名前が表示されます。

ソースコードでの実行結果は以下のようになります。

Alice

ファクトリパターンを使用することで、より柔軟なオブジェクトの作成が可能になります。関数を使用してオブジェクトを生成することで、インスタンス化の方法をカプセル化し、コードの可読性を向上させることができます。

try … finallyブロックでのreturnステートメントの使用

tryfinallyブロックを使用することで、returnステートメントを含む関数でも必要なクリーンアップ処理を実行することができます。finallyブロック内の処理は、returnステートメントが含まれている場合でも必ず実行されます。

以下は、tryfinallyブロックでreturnステートメントを使用する例です。

def process_data():
try:
# データの処理
return result
finally:
# クリーンアップ処理
cleanup()
data_result = process_data()

この例では、process_data関数内でデータの処理を行い、結果を返す前にクリーンアップ処理を実行する必要があります。tryブロック内でデータの処理を行い、finallyブロック内でクリーンアップ処理を実行しています。returnステートメントによって結果が返される場合でも、必ずクリーンアップ処理が実行されることが保証されます。

ジェネレータ関数でのreturnステートメントの使用

ジェネレータ関数は、複数の値を生成するための関数です。ジェネレータ関数では、yieldステートメントを使用して値を生成しますが、必ずしもreturnステートメントを含む必要はありません。ジェネレータ関数内でreturnステートメントが実行されると、ジェネレータが終了します。

以下は、returnステートメントを含むジェネレータ関数の例です。

def generate_numbers():
for i in range(5):
yield i
return "Done"
numbers = generate_numbers()
for number in numbers:
print(number)
try:
print(next(numbers))
except StopIteration as e:
print("Exception:", str(e))

この例では、generate_numbersというジェネレータ関数が定義されています。関数内で0から4までの数値を生成し、yieldステートメントによって値を返します。また、returnステートメントによってジェネレータが終了する直前に”Done”という値を返します。

generate_numbers関数を使ってジェネレータオブジェクトnumbersを作成し、ループで値を表示します。最後のprint(next(numbers))では、ジェネレータが終了しているため、StopIteration例外が発生します。

ソースコードでの実行結果は以下のようになります。

0
1
2
3
4
Exception: Done

結論

Pythonのreturnステートメントは、関数やメソッド内で使用する重要な要素です。returnステートメントを効果的に使用することで、関数が返す値を制御し、より柔軟なコードを記述することができます。関数の返り値を利用する方法や、複数の値の返却方法など、さまざまな使い方を学びました。さらに、returnステートメントのベストプラクティスや、関数を返す方法についても学びました。

Pythonのreturnステートメントを正しく使用することで、より高品質で効率的なコードを記述することができます。しっかりと理解し、実践してみてください。

リンク