2

数値のリストを受け取り、いくつかの桁で丸められた数値のリストを返す非常に単純な関数を作成しました。

def rounded(lista, digits = 3):
    neulist = []
    for i in lista:
        neulist.append(round(i, digits))
    return neulist

ただし、組み込み関数ではなく関数自体を誤ってコードに入れましたround()(以下の例のように)。

def rounded(lista, digits = 3):
    neulist = []
    for i in lista:
        neulist.append(rounded(i, digits))
    return neulist

そして、この出力を得ました:

Traceback (most recent call last):
  File "<pyshell#286>", line 1, in <module>
    rounded(a)
  File "<pyshell#284>", line 4, in rounded
    neulist.append(rounded(i, digits))
  File "<pyshell#284>", line 3, in rounded
    for i in lista:
TypeError: 'float' object is not iterable

問題は、関数自体rounded()を評価しているときに関数を適用する必要があることをインタプリタがどのように知るかです。rounded()まさにその関数を解釈しようとしている場合、どうrounded()すれば浮動小数点数を取る関数になるのでしょうか? 関数を評価して解釈するための一種の2サイクルの手順はありますか? それとも、ここで何か間違っていますか?

4

3 に答える 3

4

関数はオブジェクトです。これは、呼び出されたときではなく、定義時に作成されるため、Python がその使用方法を知らなかった場合、呼び出しが行われる前にエラーが発生します。
ただし、リストで呼び出しました。反復中に、関数はリストの最初の項目 (おそらく float) を使用して再帰的に呼び出されます。このフロートを引数として使用するfor i in lista:と、意味がなくなり、エラーが発生します。

于 2014-05-13T17:57:34.377 に答える
0

ここでは実際に 2 つのプロセスが発生しています。関数は、ソース テキストで検出されたときにコンパイルされ、後で呼び出しが行われます。関数の本体には への呼び出しが含まれていますがrounded、実際には関数の名前として追跡されています。これをチェックしてください:

def fun1(x):
    if x == 0:
        print x
    else:
        fun1(x-1)

fun2 = fun1

def fun1(x):
    print x

fun2(3)

ここではfun1()、明らかにそれ自体への再帰呼び出しで定義しています。ただし、 を再定義した後fun1()、関数の最初の定義の呼び出しは、完全に別の関数を参照するようになりました。

于 2014-05-13T18:07:43.233 に答える
0

recursionに出くわしました。

再帰関数は、プログラミングでは非常に一般的です。n番目のフィボナッチ数を計算するための次の (単純な) 関数を検討してください。

def fib(x):
    if x<=2:
        return 1
    else:
        return fib(x-1)+fib(x-2)

インタプリタが に到達するとすぐに関数定義が記録されるため、関数は自分自身を呼び出していることを認識していますfib(x):。その時点から、fibが定義されます。特に python の場合、動的に型付けされる言語であるため、関数を整数、文字列、または float で呼び出しても違いはありません。重要なのは、関数が 1 つの引数を取ることだけです。

于 2014-05-13T18:01:50.220 に答える