Python:如何编写一个函数,该函数使用它的多个参数在自身上循环?

Python:如何编写一个函数,该函数使用它的多个参数在自身上循环?,python,function,python-2.7,Python,Function,Python 2.7,这个简单的循环工作得很好: >>> def loop (i): i+=i if 0<i<20: print i loop(i) >>> loop (1) 2 4 8 16 def循环(i): i+=i 如果0>循环(1) 2. 4. 8. 16 但这一个不起作用,它意外地退出了循环: >>> from functools import part

这个简单的循环工作得很好:

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


>>> loop (1)
2
4
8
16
def循环(i): i+=i 如果0>循环(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
>>> 
>>从functools导入部分
>>>def回路(i):
i+=i
如果0>循环(1)
2.
>>> 
有什么问题吗?有没有办法让它发挥作用

这只是一个简单的函数。。。 我真正的问题是:

问:如何编写一个能够在自身上循环的函数,每次只使用一些参数?我应该看看其他地方(而不是部分)?

创建一个可调用的,所以

def loop (i):
        i+=i
        if 0<i<20:
            print i
            partial(loop,i)()
def循环(i):
i+=i

如果0,问题是您在函数中递增
i
。不要增加
i
并在
循环中传递
i-1
:-

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

不确定您试图实现什么,但partial实际上并不是只运行函数构造,而是返回具有给定“fixed”参数的函数

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

>>> from functools import partial
>>> def loop (i):
        i+=i
        if 0<i<20:
            print i
            partial(loop,i)()
>>从functools导入部分
>>>def回路(i):
i+=i

如果0
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
def foo(a,b): 印刷品(a、b) >>>bar=部分(foo,5) >>>酒吧 functools.partial(,5) >>>bar() 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 bar() TypeError:foo()正好接受2个参数(给定1个) >>>酒吧(4) 5 4

如您所见,
partial
在这里将一个参数绑定到函数
foo
——它接受一个函数和一些参数,并返回一个比原始函数少很多参数的函数。您可以通过使用
partial(loop,i)(
)立即调用partial使其在您的情况下工作,但这与仅调用
loop(i)
完全相同。这意味着您在此处使用的工具是错误的-
partial
主要用于将可调用函数传递到另一个函数(或只是在代码中提前设置以便稍后使用)并在决定使用该函数时设置其部分(或全部)参数的情况,而不是在它最终被调用的时候。

tl;为什么递归不适合你?是的,我想我在代码中忽略了调用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