Python入門:関数から複数の値を返す方法
Pythonでは、関数から複数の値を返すことができます。戻り値として辞書・タプル・リストなどのデータ型を利用すれば、複数の値をまとめてメインプログラムに渡せます。さらに、値をカンマで区切って直接返す方法もあります。
Pythonで関数から複数の値を返すには
Pythonの関数から複数の値を返す主な方法は、以下の4つです。
- 複数の値を含むリストを返す
- 複数の値を含むタプルを返す
- 複数のキーと値を持つ辞書を返す
- 値をカンマで区切って返す
これらのデータ型はいずれも複数の値を格納できます。中でも、カンマ区切りで返す方法が最もシンプルで意図が伝わりやすいでしょう。この方法なら「複数の独立した値をメインプログラムに返したい」という意図がコードから明確に読み取れます。
Pythonのreturn文は、関数内の値をメインプログラムへ送るための構文です。通常は1つの値を返すために使われますが、複数の値を返すことにも対応しています。
カンマ区切りで複数の値を返す
return文の後に、返したい値をカンマで区切って記述するだけで、複数の値を返せます。
ここでは、家電量販店の売上データを集計するプログラムを例に考えてみましょう。500ドルを超える売上の件数と、全売上の平均額を計算します。
まず、売上リストを格納した配列を定義します。
sales = [59.99, 240.00, 655.25, 75.99]
次に、500ドル超の売上件数と平均購入額を計算する関数を作成しましょう。
def calculate_data(sales):
over_limit = 0
for s in sales:
if s > 500:
over_limit += 1
average_purchase = sum(sales) / len(sales)
return over_limit, average_purchase
この関数はforループでリスト内の各売上を走査し、500ドルを超える売上が見つかるたびに変数over_limitを1ずつ加算します。その後、売上合計を売上件数で割ることで平均購入額を求めています。
関数の最後では、return文を使ってover_limitとaverage_purchaseの2つの値をメインプログラムに返します。
あとは関数を呼び出して、計算結果をコンソールに表示するだけです。
over_limit, average_purchase = calculate_data(sales)
print("{} sales were made over $500. The average purchase was ${}.".format(over_limit, round(average_purchase)))
round()メソッドで平均購入額を丸めてから表示しています。プログラムを実行すると、次のような出力が得られます。
1 sales were made over $500. The average purchase was $258.
500ドルを超える売上が1件、平均購入額が258ドルであることが正しく表示されました。
このコードが動作する仕組みは次のとおりです。return文にカンマ区切りで値を指定すると、Pythonはそれらを自動的にタプルにまとめて返します。そして、以下の行でタプルを2つの変数にアンパック(展開)しているのです。
over_limit, average_purchase = calculate_data(sales)
リストまたはタプルで複数の値を返す
リストとタプルはどちらも複数の値を格納できるデータ型なので、これらを使って複数の値を返すこともできます。
リストやタプルの利用が特に適しているのは、返す値同士に何らかの関連性がある場合です。もちろん、特に関係のない値の集合を返すのにも使えます。
先ほどの例を少し修正して、リストで値を返すようにしてみましょう。
def calculate_data(sales):
over_limit = 0
for s in sales:
if s > 500:
over_limit += 1
average_purchase = sum(sales) / len(sales)
return [over_limit, average_purchase]
return文で2つの値を1つのリストにまとめました。リストには「500ドル超の購入件数」と「平均購入額」がこの順序で格納されています。
タプルを返す場合は、角括弧 [ ] を丸括弧 ( ) に置き換えます。タプルはイミュータブル(変更不可)である点がリストとの大きな違いです。後から値を書き換える可能性がある場合は、リストを選ぶとよいでしょう。
メインプログラム側でこれらの値にアクセスするには、インデックスを指定します。
values = calculate_data(sales)
print("{} sales were made over $500. The average purchase was ${}.".format(values[0], round(values[1])))
values[0]という記法で、calculate_data()関数が返したリストの先頭要素(over_limitの値)にアクセスし、values[1]で平均購入額にアクセスしています。
実行結果は先ほどと同じです。
1 sales were made over $500. The average purchase was $258.
動作は前の例とまったく同じですが、今回はリストを使って値をまとめて返しています。
辞書で複数の値を返す
辞書(dict)を使っても、関数から複数の値を返せます。
前の例では返す値が2つだけだったため、アンパック構文で簡潔に受け取れました。しかし、扱う値が増えてくると、各値にラベル(キー)を付けられる辞書の方が扱いやすくなります。
先ほどの関数を、辞書で値を返す形に書き換えてみましょう。
def calculate_data(sales):
over_limit = 0
for s in sales:
if s > 500:
over_limit += 1
average_purchase = sum(sales) / len(sales)
return { "limit": over_limit, "average": average_purchase }
この関数は2つのキーと値を持つ辞書を返します。「limit」「average」というキーによって、それぞれの値を一意に識別できます。続いて、関数の呼び出し部分とprint文を新しい形式に合わせて修正します。
values = calculate_data(sales)
print("{} sales were made over $500. The average purchase was ${}.".format(values["limit"], round(values["average"])))
関数から返された辞書を変数valuesに代入し、values["limit"]とvalues["average"]のようにキーを指定して値を取り出しています。
プログラムを実行してみましょう。
1 sales were made over $500. The average purchase was $258.
出力結果は以前と同じです。これは想定どおりで、変更したのは値の返し方だけで、計算ロジック自体は変わっていないためです。
まとめ
Pythonの関数から複数の値を返すには、辞書・タプル・リストのいずれかを使う方法があります。これらのデータ型はすべて複数の値を格納でき、複数値返却のための専用構文はないものの、実用性の高い代替手段となっています。
扱う値が少ない場合は、カンマ区切りでの返却が最も簡潔で読みやすい選択肢です。一方、返す値の数が多い場合や、各値に意味を持たせたい場合は、辞書を使うとメインプログラム側のコードも理解しやすくなります。
用途に応じてこれらの方法を使い分け、可読性の高いPythonコードを書いていきましょう。
-
Python関数からJSONオブジェクトを返す方法をわかりやすく解説
Pythonの関数からJSONオブジェクト(JSON形式の文字列)を返すには、標準ライブラリの json モジュールに含まれる json.dumps() 関数を使用します。この関数は、Pythonの辞書(dict)などのオブジェクトをJSON形式の文字列へ変換(シリアライズ)してくれます。 基本的な例 以下は、Pythonの辞書をJSON文字列に変換して返す関数のシンプルな例です。 import json # Pythonの辞書 a = {name: Sarah, age: 24, isEmployed: True} def retjson(): python2json = jso
-
Pythonで関数から別の関数を返す方法をわかりやすく解説
Pythonは第一級関数(first-class functions)をサポートしているプログラミング言語です。実際、Pythonにおけるすべての関数は第一級オブジェクトとして扱われます。 これは何を意味するのでしょうか。具体的には、以下のようなことが可能になります。 関数の中から別の関数を返す(returnする) 関数をリストや辞書などのコレクションに格納する 関数を、通常の変数やオブジェクトと同じように扱う さらに、関数の中で別の関数を定義し、それを返すことさえできます。これはクロージャ(closure)と呼ばれる強力なテクニックの基礎にもなる概念です。 サンプルコード:関数内で関数を