質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1072閲覧

Python:return文での値の返し方

Ykkykk

総合スコア140

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2018/12/03 00:52

Pythonの関数でreturn文を書く際の値の返し方についての質問です。

関数内でなんらかの処理をして算出された値をリストにして返したいときに、
returnの部分でリストを作成する操作をするよりも、あらかじめ変数にしてしまって返したほうがよいのでしょうか?

Python

1def function(): 2 lst = [1, 2] 3 a = lst[0] + lst[1] 4 b = lst[0] - lst[1] 5 c = lst[0] * lst[1] 6 d = lst[0] / lst[1] 7 return list((a, b, c, d))

このような返し方をするのと、

Python

1def function(): 2 lst = [1, 2] 3 lst2 = [] 4 a = lst[0] + lst[1] 5 lst2.append(a) 6 b = lst[0] - lst[1] 7 lst2.append(b) 8 c = lst[0] * lst[1] 9 lst2.append(c) 10 d = lst[0] / lst[1] 11 lst2.append(d) 12 return lst2

以上のような返し方をするのとでは処理に違いが生じているのでしょうか?
ご教示いただけますと幸いです。よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

上は(a,b,c,d)tupleを作ってからlistに変換、下はlst2 = []を作ってそれぞれをappendですから、処理の内容は違います。

パフォーマンスはともかく、下のコードはやたら冗長ですから、避けたほうが良いでしょう。


listを返したい」ということであれば、私ならこう書くと思います。

python

1def function(): 2 lst = [1, 2] 3 a = lst[0] + lst[1] 4 b = lst[0] - lst[1] 5 c = lst[0] * lst[1] 6 d = lst[0] / lst[1] 7 return [a, b, c, d]

投稿2018/12/03 00:57

編集2018/12/03 01:02
hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Ykkykk

2018/12/03 01:06

ご回答いただきありがとうございます。一つ目はタプルを作ってからリストに変換という処理になっているのですね。 returnの部分でリストを作成する操作をした方がすっきりする感じですね。 ありがとうございました!
guest

0

私なら、タプルのまま返して呼び出し元でリストに変換します。

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 04:04

編集2018/12/03 07:56
LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Ykkykk

2018/12/03 07:30

ご回答いただきありがとうございます。 そういった考え方が全くわからないため質問いたしました。 呼び出し元でリストにする方が良いという考え方もあるのですね。 また、変わり種のやり方についてもお教えいただきありがとうございます。勉強になりました。 ありがとうございました!
LouiS0616

2018/12/03 07:57

呼び出し元でリストに変換する方が良いと思う理由について追記しました。 それなりにややこしい話であるうえに、じゃっかん質問の本旨から逸れてしまいましたので、気が向いたときにでもご覧いただければ結構です。
Ykkykk

2018/12/03 09:11

詳細な解説までご追記くださりありがとうございます。 こういった考え方については解説用のサイトや書籍では見たことがないため、大変勉強になります。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問