Pythonで複数の返り値を返す

記事タイトルとURLをコピーする

はじめに

アプリケーションサービス部ディベロップメントサービス1課の森です。
めちゃめちゃ久しぶりのブログを書いてますが、最近の流行りはマインクラフトとスプラトゥーン2です。
もうすぐスプラトゥーン3が出るので楽しみにしています。

今回は、Pythonでプログラムを書いてて、「あれ?こんなことしたいけど、かっこいい方法ないかな?」からの学びの共有です。
なにかのINPUTになればと思います。

前提条件

  • Python 3.9

やること

  • Python関数で複数の返り値を返す

これまで

これまで複数の返り値を返す場合は、以下のようなことを考えていました。

  • リスト型で返すパターン
def sample() -> list:
    sample_list = [0, 1, 2, 3]
    sample_str = "tuple_return_test"

    return_list = []
    return_list.append(sample_list)
    return_list.append(sample_str)

    return return_list
  • 辞書型で返すパターン
def sample() -> dict:
    sample_list = [0, 1, 2, 3]
    sample_str = "tuple_return_test"

    return_dict = {}
    return_dict["sample_list"] = sample_list
    return_dict["sample_str"] = sample_str

    return return_dict

本編

「これまで」にも書いてたのですが、ぱっと思いついたプログラムはこんな感じだったのですが、
メンバに聞いたり、調べたりしてるとこんなことができることがわかりました。

def sample():
    sample_list = [0, 1, 2, 3]
    sample_str = "tuple_return_test"

    return sample_list, sample_str


なんと、 コンマ区切りで値が返せる ということです。
あまりにも驚きすぎて、大きな声で「マジで!」と言ってしまうくらいでした。
で、もう少し返り値を調べてみました。

返り値の型を確認

ターミナルで簡易的にプログラムを実行して返り値の型を確認してみました。

>>> def sample():
...     sample_list = [0, 1, 2, 3]
...     sample_str = "tuple_return_test"
...     return sample_list, sample_str
... 
>>> return_value = sample()
>>> type(return_value)
<class 'tuple'>
>>> print(return_value)
([0, 1, 2, 3], 'tuple_return_test')

なるほど。タプル型なんですね。

関数の返り値の型定義

タプル型までわかったので、後は、返り値を型定義してみます。

>>> from typing import Tuple
>>> def sample() -> Tuple[list, str]:
...     sample_list = [0, 1, 2, 3]
...     sample_str = "tuple_return_test"
...     return sample_list, sample_str
... 
>>> return_value = sample()
>>> type(return_value)
<class 'tuple'>
>>> print(return_value)
([0, 1, 2, 3], 'tuple_return_test')

これで、返り値の型定義ができました。

Tuple[list, str] でいいです。

返り値の受け方

上記では、 return_value で受けてました。
これで取り出す場合は、
return_value[0]sample_list の値であるリスト [0, 1, 2, 3] が取得でき、
return_value[1]sample_str の値である文字列 "tuple_return_test" が取得できます。

ただ、このやり方だけではなく、返り値を受ける方法があるので紹介します。

>>> from typing import Tuple
>>> def sample() -> Tuple[list, str]:
...     sample_list = [0, 1, 2, 3]
...     sample_str = "tuple_return_test"
...     return sample_list, sample_str
... 
>>> return_sample_list, return_sample_str = sample()
>>> type(return_sample_list)
<class 'list'>
>>> print(return_sample_list)
[0, 1, 2, 3]
>>> type(return_sample_str)
<class 'str'>
>>> print(return_sample_str)
tuple_return_test

返り値自体もコンマ区切りで変数を指定すれば、返り値を受けれるので、わざわざインデックスを指定して受ける必要ので、
こちらのほうが可読性もあがりそうですね。

さいごに

自分はJavaやC#、VB.NET、ASP.NET、PerlやPHPなどなど色々な言語を書いてきましたが、
これを知って、Pythonってすげぇな(他の言語がすごくないわけではない)って思いました。
また、色々書いてみて、アウトプットしていければなと思いました。