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
如果0partial
返回一个已经设置了某些参数的函数,那么它实际上还没有调用该函数。您需要调用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