私なら、タプルのまま返して呼び出し元でリストに変換します。
Python
1def function():
2 lst = [1, 2]
3 return lst[0]+lst[1], lst[0]-lst[1], lst[0]*lst[1], lst[0]/lst[1]
4
5ret = function()
6print(ret, list(ret))
実行結果 Wandbox
(3, -1, 2, 0.5) [3, -1, 2, 0.5]
個人的には、イテラブルな返り値をリストに変換するのは呼び出し元の責任だと思っています。
#####理由
ぱっと思い付いた理由は、次の二つです。
処理が関数の実装に影響されること
関数がグローバルなリストを返してくる恐れがあります。
返り値を安心して使うためには、どちらにせよオブジェクトを再生成しなくてはいけません。
例えば、こんなふうに関数が実装されていたとします。
Python
1def function():
2 return lst
返り値の使い方に依っては、副作用が生じます。
Python
1>>> lst = []
2>>> ret = function()
3>>> ret.append(42)
4>>>
5>>> print(lst)
6[42]
7>>> ret is lst
8True
Python
1>>> lst = []
2>>> ret = list(function())
3>>> ret.append(42)
4>>>
5>>> print(lst)
6[]
7>>> ret is lst
8False
遅延評価のメリットを潰しかねないこと
関数をジェネレータとして実装することで、パフォーマンスの向上を図ることができます。
例えば、長い時間を要する処理を繰り返す関数があるとします。
そのような関数は、ジェネレータ関数として実装することで処理を分散するのが一般的です。
Python
1def function():
2 for _ in range(3):
3 print('wasting time...')
4 yield 42
全体の実行時間は短縮されませんが、待ち時間の集中に依るストレスは幾分か緩和されます。
Python
1>>> for e in function():
2... print('got e')
3...
4wasting time...
5got e
6wasting time...
7got e
8wasting time...
9got e
10>>>
返り値をリストとして得たい場合は、呼び出し元で明示的に変換してやります。
Python
1>>> lst = list(function())
2wasting time...
3wasting time...
4wasting time...
5>>>
最初からリストを返すような実装だと、目的に応じて使い分けられるメリットが潰れます。
おまけ
変わり種。
Python
1import operator as op
2
3
4def function():
5 return map(
6 lambda f: f(1, 2),
7 [op.add, op.sub, op.mul, op.truediv]
8 )
9
10ret = function()
11print(ret, list(ret))
実行結果 Wandbox
<map object at 0x7fe52abcf080> [3, -1, 2, 0.5]
Python2.7のmapはリストを返す仕様でした。
3.0以降でイテレータを返す仕様に変更されたのは、前述の二番目の理由に依るものです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/12/03 01:06