crignactor
@crignactor (クリグナ)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Python 関数 引数と戻り値の個数制限について 教えていただきたいです。

教えていただきこと

僕の参考書には、関数の引数の個数が無制限(0〜複数)、一方で戻り値が1つ(コレクション可)という旨のことが書いてありました。
一方で、以下の理由(###)から、このような対比とは逆に引数も戻り値もタプル(のネスト)という意味で1つの値という見方もできます。
つまり、引数と戻り値の個数制限は見方によるのだと思います。
あえて、最初に書いたような無制限と1つと対比する理由があるのでしょうか?
また、そもそも私の下の考え方は間違っていないでしょうか?

###理由
仮引数は数値や文字列、コレクションを「,」で結ぶので、仮引数に実引数を代入するということは、タプルのネスト(コレクションが入っていなければネストじゃないですね)に対応する構造を持つタプルを代入すると見做せると思います。そのとき、引数の個数はタプルとして1つと考えることができると思うのですが…
この解釈をすると、引数も戻り値と同様に1つであるといえると思います。

0

1Answer

一般的な言語では、引数は複数、戻り値は1つですね。
言語実装によっては引数の個数に制限がある場合もあります。
C言語の実装では、引数をスタックに積み、戻り値をCPUレジスタで返すため、そのような制約になっていたりします。構造体を定義して複数の値を返すことも可能ではあります。

Pythonの値は、整数値1つだろうと、複数の値を持つタプルだろうと、すべて1つのオブジェクトです。
なので、戻り値は1つということになります。

Pythonでは、引数を一つにまとめて受け取る方法も用意されています。
その場合は呼び出し元の引数の数は可変長になってしまうので、引数の数を厳密にしたいなら引数をカンマ区切りで書くことになります。

def func1(arg1, arg2, arg3):
    print(arg1, arg2, arg3)

def func2(*args):
    print(args)
    print(*args)

func1(1, 2, 3)
func2(1, 2, 3)
try:
    func1(1, 2, 3, 4)
except TypeError as e:
    print(e)
func2(1, 2, 3, 4)
実行結果
1 2 3
(1, 2, 3)
1 2 3
func1() takes 3 positional arguments but 4 were given
(1, 2, 3, 4)
1 2 3 4
2Like

Comments

  1. @crignactor

    Questioner

    ありがとうございます。
    私はPythonを始めてまだ7日くらいで、1日2時間くらい、スッキリシリーズで勉強しているのですが、昨日質問した後初めてオブジェクトという概念を知りました。その上で読めたので、疑問が解決するだけでなくオブジェクトの理解も深まりました。
    また、コードもtry文は本に載ってなかったのでそういう意味でも勉強になりました。
    ありがとうございました〜

Your answer might help someone💌