-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
>>> 

有什么问题?有没有办法让它以某种方式工作?

那只是一个简单的功能......我真正的问题是:

问:如何编写一个能够循环自身的函数,每次只有几个参数?我应该看看其他地方(除了部分)吗?

4

4 回答 4

4

partial创建一个可调用的,所以..

def loop (i):
        i+=i
        if 0<i<20:
            print i
            partial(loop,i)()
于 2013-04-17T07:10:38.957 回答
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

不确定您要实现的目标,但部分实际上并未运行该函数,仅构造并返回带有您给出“固定”参数的函数

您需要这样的东西才能获得与第一个示例相同的结果:

>>> 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

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这里将一个参数绑定到函数foo- 它接受一个函数和一些参数,并返回一个比原始参数少得多的函数。您可以通过立即调用部分来使其在您的情况下工作partial(loop, i)(),但这与调用完全相同loop(i)。这意味着您在这里使用的工具是错误的 -partial主要适用于您希望将可调用对象传递给另一个函数(或只是提前设置以便稍后在代码中使用)并设置一些(或全部)的情况它的参数是在您决定使用该函数时,而不是在最终调用它时。

于 2013-04-17T07:18:39.673 回答