通过多个函数传递变量值(列表) - Python

时间:2016-12-11 23:42:47

标签: python python-2.7 list function

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

这基本上是我的程序,但是简化了,将它粘贴在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()

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

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

无需重写函数并进行重大修改(这意味着如果有人建议采用更简单的方法,我将不得不重写我的程序,如果我采用它,则可能意味着我在其他地方失去了功能)。任何人都可以告诉我如何通过m和l传递在函数2中的函数,直到函数1才能在函数3中访问它们?

任何建议都会非常感激,正如你可以从评论代码中看到的那样 - 我试图解决这个问题,但我想在无助之前我会请求一些帮助。

2 个答案:

答案 0 :(得分:0)

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

编程方式应该是:

  1. 定义一些变量
  2. 对这些变量做点什么。
  3. 获得结果。
  4. 现在,如果你继续关注,你可以尽可能深入地编写程序。和你的一起,你想做的是:

    1. 定义一些变量(a,b,c,d)
    2. 将它们发送到功能1来做一些事情......
    3. 将功能1中的一些变量再次传递给功能2。
    4. 从功能2中获取结果并将其存储在功能1中。
    5. 从函数1中获取结果并在main()中使用它,但需要。
    6. 我会考虑使用类来定义变量,这可以作为各种类型的数据结构:

      ORDER BY

      然后在你的主要使用那些带有函数的变量:

      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. 变量,否则情况并非如此。一个方法本身应该始终是你需要不断重复而不需要过多依赖其他东西的东西。它应该只是取一些变量并吐出结果。不要试图互连太多的方法 - 它会变得混乱。

      我希望这会有所帮助。

答案 1 :(得分:0)

我相信下面的答案可以解决您的问题。请注意,我无法引用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()