【问题标题】:Use output of function as input of new iteration of function使用函数的输出作为新的函数迭代的输入
【发布时间】:2019-04-02 19:20:46
【问题描述】:

我有一个函数可以简化为:

def do_stuff(a,b,c):
    a = a*2
    b = b*3
    c = c
    return a, b, c

给定初始条件:a = 2, b = 3, c = 1

我想迭代函数直到 a 等于 64

我正在尝试使用 while 循环,例如

while True:
   new_a, new_b, new_c = do_stuff(a, b, c)

   ... Here is where I am confused ...

   if new_a = 64:
       return False

我如何声明函数的初始值,然后让它在下一次迭代中使用自己的输出作为输入。

感谢任何帮助!

【问题讨论】:

    标签: python python-3.x loops recursion


    【解决方案1】:
    def do_stuff(a,b,c):
            global new_a
            global new_b
            global new_c
            new_a = a*2
            new_b = b*3
            new_c = c
            print(new_a,new_b,new_c)
            return(new_a,new_b,new_c) 
    
    new_a = 2
    new_b = 3
    new_c = 1
    
    while new_a != 64:
          do_stuff(new_a,new_b,new_c)
          if new_a == 64:
                  break
    

    【讨论】:

    • 我的错,我改正了。
    • 这个解决方案有很多问题:没有理由使用全局变量或从你不使用的函数返回一些东西。
    【解决方案2】:

    回答具体问题

    将您的函数设为生成器,使用生成器表达式进行过滤并在其上调用 next

    >>> def do_stuff(a,b,c):
    ...:    while True:
    ...:        a = a*2
    ...:        b = b*3
    ...:        c = c
    ...:        yield a, b, c
    ...:        
    >>> next((a, b, c) for a, b, c in do_stuff(2, 3, 1) if a == 64)
    >>> (64, 729, 1)
    

    为未来的读者回答标题中更一般的问题

    如何将一个函数的输出作为另一个函数的新迭代的输入?

    考虑一个协程!这是一个非常基本的例子。

    >>> def computation(x):
    ...:    return x%2
    >>> 
    >>> def consumer():
    ...:    while True:
    ...:        got = yield 
    ...:        print('consumer got value {}'.format(got))
    ...:        # do something awesome with got
    ...:        
    >>> 
    >>> cons = consumer()
    >>> next(cons) # prime coroutine
    >>> 
    >>> for i in range(3):
    ...:    cons.send(computation(i))
    consumer got value 0
    consumer got value 1
    consumer got value 0
    

    如果您想了解有关协程的更多信息,请查看 this David Beazley 的精彩演讲。

    【讨论】:

      【解决方案3】:

      如果您正在寻找一个简单的迭代解决方案,试试这个。

      def do_stuff(a,b,c):
          a = a*2
          b = b*3
          c = c
          return a,b,c
      
      a,b,c = (2,3,1)
      while a != 64:
          a,b,c = do_stuff(a,b,c)
      

      【讨论】:

        【解决方案4】:

        您可以使用带有if 语句的递归函数:

        def do_stuff(a, b, c):
            if a == 64:
                return a, b, c
            return do_stuff(a*2, b*3, c)
        
        a, b, c = do_stuff(2, 3, 1)
        
        print((a, b, c))
        
        (64, 729, 1)
        

        请参阅Basics of recursion in Python 以了解递归的工作原理。

        【讨论】:

          猜你喜欢
          • 2019-07-23
          • 2022-11-21
          • 2014-11-20
          • 2020-02-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多