[解決済み] 関数が複数の値を返すことはpythonicですか?
2023-06-23 12:18:56
質問
Pythonでは、1つの関数が複数の値を返すことができます。 以下はその例です。
def divide(x, y):
quotient = x/y
remainder = x % y
return quotient, remainder
(q, r) = divide(22, 7)
これは非常に便利なように見えますが、悪用される可能性もありそうです("まあ、関数Xはすでに中間値として必要なものを算出していますね。 Xはその値も返すようにしましょう")。
いつ線を引いて、別のメソッドを定義すべきでしょうか?
どのように解決するのですか?
もちろんです(提供された例に対して)。
タプルはPythonの一級市民です。
ビルトイン関数である
divmod()
があり、これはまさにそれを行うものです。
q, r = divmod(x, y) # ((x - x%y)/y, x%y) Invariant: div*y + mod == x
他の例もある。
zip
,
enumerate
,
dict.items
.
for i, e in enumerate([1, 3, 3]):
print "index=%d, element=%s" % (i, e)
# reverse keys and values in a dictionary
d = dict((v, k) for k, v in adict.items()) # or
d = dict(zip(adict.values(), adict.keys()))
ちなみに、括弧はほとんどの場合必要ありません。 引用元 Python ライブラリリファレンス :
タプルは様々な方法で構築することができます。
- 空のタプルを表すために一組の括弧を使用する。()
- シングルトンタプルを表すための末尾のカンマの使用: a, または (a,)
- カンマで項目を区切る: a、b、c または (a、b、c)
- tuple()組み込みの使用:tuple()または tuple(iterable)
関数は単一目的であるべき
したがって、関数は単一のオブジェクトを返さなければなりません。あなたの場合、このオブジェクトはタプルです。タプルをアドホックな複合データ構造として考えてみましょう。ほとんどすべての関数が複数の値を返す言語があります(Lispのリスト)。
を返すだけで十分な場合もあります。
(x, y)
の代わりに
Point(x, y)
.
名前付きタプル
Python 2.6での名前付きタプルの導入により、多くの場合、プレーンタプルの代わりに名前付きタプルを返すことが望ましいとされています。
>>> import collections
>>> Point = collections.namedtuple('Point', 'x y')
>>> x, y = Point(0, 1)
>>> p = Point(x, y)
>>> x, y, p
(0, 1, Point(x=0, y=1))
>>> p.x, p.y, p[0], p[1]
(0, 1, 0, 1)
>>> for i in p:
... print(i)
...
0
1
関連
-
[解決済み] 関数デコレータを作成し、それらを連鎖させるには?
-
[解決済み] for'ループでインデックスにアクセスする?
-
[解決済み] 関数内でグローバル変数を使用する
-
[解決済み] 複数の例外を1行でキャッチする(ブロックを除く)
-
[解決済み] 列の値に基づいてDataFrameから行を選択するにはどうすればよいですか?
-
[解決済み] 環境変数の値にアクセスする方法
-
[解決済み】forループを使った辞書の反復処理
-
[解決済み】JavaScriptの関数にデフォルトのパラメータ値を設定する
-
[解決済み] ファブリック経由でデプロイユーザとしてvirtualenvを有効化する
-
[解決済み] オブジェクトのリストに特定の属性値を持つオブジェクトが含まれているかどうかをチェックする
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] PythonでSVGからPNGに変換する
-
[解決済み] Spyderを仮想環境で動作させるには?
-
[解決済み] 小数点以下1桁を取得する[重複]。
-
[解決済み] タプルのリストを複数のリストに変換するには?
-
[解決済み] Pythonのargparseを使った隠し引数の作成
-
[解決済み] PythonからSMTPを使用してメールを送信する
-
[解決済み] 文字列のリストを内容に基づいてフィルタリングする
-
[解決済み] Flask でグローバル変数はスレッドセーフか?リクエスト間でデータを共有するには?
-
[解決済み] PySparkでデータフレームのカラムをString型からDouble型に変更する方法は?
-
[解決済み] Django filter queryset __in for *every* item in list