-1

この単純なループは問題なく機能します。

>>> def loop (i):
        i+=i
        if 0<i<20:
            print i
            loop(i)


>>> loop (1)
2
4
8
16

しかし、これは機能せず、予期せずループを終了します。

>>> from functools import partial
>>> def loop (i):
        i+=i
        if 0<i<20:
            print i
            partial(loop,i)


>>> loop(1)
2
>>> 

どうしたの?何とか機能させるための解決策はありますか?

それは単なる単純な機能でした...私の本当の質問は次のとおりです。

Q: 毎回いくつかの引数のみを使用して、それ自体をループできる関数を作成するにはどうすればよいですか? ( partial以外の) どこかを見る必要がありますか?

4

4 に答える 4

4

partialcallable を作成するので、..

def loop (i):
        i+=i
        if 0<i<20:
            print i
            partial(loop,i)()
于 2013-04-17T07:10:38.957 に答える
1

あなたが何を達成しようとしているのか分かりませんが、部分的には実際には関数を実行しません

最初の例と同じ結果を得るには、次のようなものが必要です。

>>> from functools import partial
>>> def loop (i):
        i+=i
        if 0<i<20:
            print i
            partial(loop,i)()
于 2013-04-17T07:14:45.843 に答える
1

i問題は、関数をインクリメントしていることです。関数をインクリメントiして渡さないi-1loopください:-

>>> def loop(i):
...     if i>0 and i<20:
...             print i
...             loop(i-1)

このメソッドを使用して、関数を実行すると、出力は次のようになります。

>>> loop(1)
1
>>> loop(2)
2
1
>>> loop(3)
3
2
1
>>> loop(4)
4
3
2
1
>>> loop(20)
>>> loop(19)
19
18
17
16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
>>> 
于 2013-04-17T07:13:08.350 に答える
1

partialいくつかの引数が既に設定された関数を返します - 実際にはまだその関数を呼び出していません。partialこれを行うには、オブジェクトを呼び出す必要があります。

>>> def foo(a, b):
        print(a, b)
>>> bar = partial(foo, 5)
>>> bar
functools.partial(<function foo at 0x01E1A348>, 5)
>>> bar()
Traceback (most recent call last):
  File "<pyshell#6>", line 1, in <module>
    bar()
TypeError: foo() takes exactly 2 arguments (1 given)
>>> bar(4)
5 4

ご覧のとおり、partialここでは 1 つの引数を関数にバインドfooします。関数といくつかの引数を取り、元の引数よりもはるかに少ない引数の関数を返します。でパーシャルをすぐに呼び出すことで、ケースで機能させることができますpartial(loop, i)()が、これは単に を呼び出すのとまったく同じloop(i)です。これは、ここで使用するのは間違ったツールであることを意味します。partial主に、callable を別の関数に渡したい場合 (または、コード内で後で使用するために早期に設定したい場合)、一部 (またはすべて) を設定する場合に役立ちます。最終的に呼び出されたときではなく、その関数を使用することを決定したときの引数です。

于 2013-04-17T07:18:39.673 に答える