【问题标题】:Passing variable values (lists) through multiple functions - Python通过多个函数传递变量值(列表) - Python
【发布时间】:2016-12-11 23:42:47
【问题描述】:

我编写了一个执行一些复杂任务的程序。我认为确保我的代码简洁明了的最好方法是定义多个函数。不幸的是,通过这样做,我遇到了一个问题,我必须从各种函数返回多个值以用于其他函数,并且被这一切绊倒。

这基本上是我的程序,但经过简化,将其粘贴到 IDLE 中,它应该适合你。

def function_zero():
    a = ['1', '2', '3']
    b = ['4', '5', '6']
    c = ['0']
    d = ['0']
    return a, b, c, d

def function_one(a):
    for i in a:
        function_two(i)
#   m, l = function_two(i)    

def function_two(i):
    morel = []
    lessl = []
    sum_i = int(i)*2
    if sum_i >= 3:
        morel.append(i)
    if sum_i <= 3:
        lessl.append(i)
#   return m, l

def function_three(a, b, c, d):
#def function_three(a, b, c, d, m, l):
   print a, b, c, d
   #print m, l

def main():
    a, b, c, d = function_zero()
    function_one(a)
    function_three(a, b, c, d)
#   function_three(a, b, c, d, e, f)    

if __name__ == '__main__':
    main()

函数 0 解析报告,生成值 a、b 等。函数一实际上使用 itertools 和 izip 将 a 和 b 合并在一起,但为简单起见,这是隐藏的。本质上,它的作用是执行一个需要两个参数的命令,重要的是这些命令在迭代中完成。

函数二介绍了这里的主要问题,列出对象l和m。我不知道这些应该在哪里启动,如果我在函数之外启动它们,它可能会变得混乱,所以我在函数二内完成了。由于 NameError 和未解析的引用,我在尝试在函数三(函数三是报告函数)中打印它们时也遇到了严重问题。

无需重写函数和进行重大修改(这意味着如果有人建议更简单的方法,我将不得不重写我的程序,如果我采用它,这可能意味着我在其他地方失去了功能)。谁能告诉我如何将在函数二中启动的 m 和 l 传递到函数一,以便在函数三中访问它们?

任何建议都将不胜感激,正如您从注释代码中看到的那样 - 我试图解决这个问题,但我想在无助地破解之前我会寻求一些帮助。

【问题讨论】:

  • 你能给minimal reproducible example 一个不那么抽象的函数集吗?
  • 您演示了如何在保存对function_zero 返回的值的引用以及使用其中一个引用的参数调用function_one 时传递变量。用function_two 做类似的事情。
  • 不是将单个i 传递给function_two,而是传递整个a 并返回a 并分成m, l = function_two(a)。目前尚不清楚您打算如何处理这些分区值。顺便说一句,有一个名为 partition()itertools 配方可能有用。

标签: python python-2.7 list function


【解决方案1】:

我相信下面的答案可以解决您的问题。请注意,我找不到引用 ml 的可能性,因为每次您想打印这些值时 - 只会打印最后一个值。这是因为您的 function_one 在每次迭代时都会覆盖它。所以我添加了两个新值,no,它们保存了函数返回的值。最后它会变得有点混乱,但它有效!您的注释掉的代码离您不远了,我认为您只需要多花一分钟调试时间,您就会注意到这个问题。

def function_zero():
    a = ['1', '2', '3']
    b = ['4', '5', '6']
    c = ['0']
    d = ['0']
    return a, b, c, d


def function_one(a):
    n = []
    o = []
    for ai in a:
        function_two(ai)
        m, l = function_two(ai)
        n.append(m)
        o.append(l)
    return m, l, n, o

def function_two(ai):
    m = []
    l = []
    sum_ai = int(ai)*2
    if sum_ai >= 3:
        m.append(ai)
    if sum_ai <= 3:
        l.append(ai)
    return m, l

def function_three(a, b, c, d, n, o):
    print a, b, c, d
    print n
    print o

def main():
    a, b, c, d = function_zero()
    m, l, n, o = function_one(a)
    function_three(a, b, c, d, n, o)


if __name__ == '__main__':
    main()

【讨论】:

    【解决方案2】:

    我可以看到你想要做什么,但也许让我帮你澄清一些关于 python 和编程的事情。

    编程应该走的路:

    1. 定义一些变量
    2. 用这些变量做点什么。
    3. 获取结果。

    现在,如果您继续遵循这一点,您可以随心所欲地编写程序。有了你,你想做的是:

    1. 定义一些变量(a,b,c,d)
    2. 将他们送到功能 1 做一些事情...
    3. 再次将一些变量从函数 1 传递到函数 2。
    4. 从函数 2 中获取结果并将其存储在函数 1 中。
    5. 从函数 1 中获取结果,并根据需要在 main() 中使用它。

    我会考虑使用一个类来定义你的变量,这可以作为一种数据结构:

    class variables:
        def __init__(self):
            '''
            Create a class, store some variables.
            '''
            self.a = ['1', '2', '3']
            self.b = ['4', '5', '6']
            self.c = ['0']
            self.d = ['0']
    

    然后在你的主函数中使用这些变量:

    def main():
        var = variables()
        result = function_one(var.a)
        # Do something with the results.
    

    我认为您可能会感到困惑,认为一个定义/方法中的变量可以通过另一种方法全局访问。除非您指定global 变量,否则情况并非如此。并且方法本身应该始终是您需要不断重复的东西,而不会过多地依赖其他东西。它实际上应该只输入一些变量并输出结果。不要尝试互连太多方法 - 它会变得混乱。

    我希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-20
      • 1970-01-01
      • 2019-06-28
      • 2018-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多