複数の関数を使用することを妨げるものはありません。各関数は、返したい複数の結果の1つを返します。
たとえば、Pythonで次の関数がリストを返す場合があります。
def f(x):
L = []
for i in range(x):
L.append(x * i)
return L
とのため[0, 3, 6]
に戻ります。代わりに、あなたは完全に持つことができますx=3
[0, 5, 10, 15, 20]
x=5
def f_nth_value(x, n):
L = []
for i in range(x):
L.append(x * i)
if n < len(L):
return L[n]
return None
次に、特定の入力に対して任意の出力を要求し、それを取得するか、None
十分な出力がない場合は取得することができます。
In [11]: f_nth_value(3, 0)
Out[11]: 0
In [12]: f_nth_value(3, 1)
Out[12]: 3
In [13]: f_nth_value(3, 2)
Out[13]: 6
In [14]: f_nth_value(3, 3)
In [15]: f_nth_value(5, 2)
Out[15]: 10
In [16]: f_nth_value(5, 5)
この場合のように、同じ作業を行う必要がある場合は、計算リソースが無駄になる可能性があります。理論的には、すべての結果を内部に保持する別の関数を返すことで回避できます。
def f_return_function(x):
L = []
for i in range(x):
L.append(x * i)
holder = lambda n: L[n] if n < len(L) else None
return holder
だから今私たちは持っています
In [26]: result = f_return_function(5)
In [27]: result(3)
Out[27]: 15
In [28]: result(4)
Out[28]: 20
In [29]: result(5)
従来の型なしラムダ計算は、このアイデアを完全に表現することができます。(結局のところ、チューリング完全です。)たくさんの値を返したいときはいつでも、n-th
任意の値を与えることができる関数を返すだけn
です。
2番目の質問に関しては、Pythonはそのような構文を許可します。正確にわかっている場合は、関数が返す値の数だけです。
def f(x):
L = []
for i in range(x):
L.append(x * i)
return L
In [39]: a, b, c = f(3)
In [40]: a
Out[40]: 0
In [41]: b
Out[41]: 3
In [42]: c
Out[42]: 6
In [43]: a, b, c = f(2)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-43-5480fa44be36> in <module>()
----> 1 a, b, c = f(2)
ValueError: need more than 2 values to unpack
In [44]: a, b, c = f(4)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-44-d2c7a6593838> in <module>()
----> 1 a, b, c = f(4)
ValueError: too many values to unpack
最後に、このLispチュートリアルの例を次に示します。
;; in this function, the return result of (+ x x) is not assigned so it is essentially
;; lost; the function body moves on to the next form, (* x x), which is the last form
;; of this function body. So the function call only returns (* 10 10) => 100
* ((lambda (x) (+ x x) (* x x)) 10)
=> 100
;; in this function, we capture the return values of both (+ x x) and (* x x), as the
;; lexical variables SUM and PRODUCT; using VALUES, we can return multiple values from
;; a form instead of just one
* ((lambda (x) (let ((sum (+ x x)) (product (* x x))) (values sum product))) 10)
=> 20 100