【问题标题】:Python: How to write a function which loops over itself with a number of its arguments? [closed]Python:如何编写一个使用多个参数循环自身的函数? [关闭]
【发布时间】:2013-04-17 07:04:24
【问题描述】:

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

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

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

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

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

【问题讨论】:

标签: python function python-2.7


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    问题是你在函数中增加i。不要增加i 并在loop 函数中传递i-1:-

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 是的,我认为我忽略了在我的代码中调用部分的部分。谢谢
      【解决方案4】:

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

      【讨论】:

      • 是的。我只是以简单的循环函数为例来澄清我的问题。我不想将人们与外星人功能混淆。谢谢。
      猜你喜欢
      • 1970-01-01
      • 2021-12-28
      • 1970-01-01
      • 1970-01-01
      • 2017-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-27
      相关资源
      最近更新 更多