【问题标题】:Python definition function parameter passing [closed]Python定义函数参数传递[关闭]
【发布时间】:2012-11-01 07:08:03
【问题描述】:

对于你们中的大多数人来说,这可能是常识,但我发现很难掌握这一点。如果你创建一个函数比如

def one():
    x=1
    y=2
    z=3
    h=33
    j=454
    l=353
    m=898

然后假设我有另一个函数,def two():,我想将 def one() 中的变量用于 def two,并且我还在 def two() 中创建了两个新变量。我该怎么做呢。

那么,假设我有第三个函数 def three(),我将如何将 def 1 和 def 2 中的变量用于 def 3?我使用的方法效率非常低,而且可能做的比需要的多。我所做的是在 def 2 中,将 def 1 中的所有变量添加到 def 2 的参数中,然后我还在函数 2 的 def 中调用函数 1。我知道 SO 上有很多线程,我看过通过他们中的许多人,他们并不简单。他们使用我不熟悉的非常具体和高级的代码,因此无法理解。我的例子非常简单明了,我相信如果回答它会帮助很多新手。谢谢!

编辑:我不想要一种最终使用我不熟悉的高级代码的“简单”方式。我想要一种简单易懂的“高效”方法。

【问题讨论】:

  • 也许你应该将它包装在一个类中并使用self。检查stackoverflow.com/q/6236032/1031900
  • 一堂课听起来是最合适的。不过,在深入了解之前,您可能需要先阅读 python 教程。
  • 我不理解您隐含的“简单”、“高级”或“高效”概念。我怀疑他们被误导了。我投票决定关闭它,因为我认为它过于宽泛,而且实际上它甚至都不是特定于 Python 的。
  • @KarlKnechtel 谢谢,我以后会记住这一点。如果您等到我得到一个好的答案后再关闭它,我将不胜感激。

标签: python function parameters definition


【解决方案1】:

我认为最好的解决方案是为您的代码(类、方法和继承)采用 OO 范式。

使用简单的函数,您可以在使用全局变量和局部作用域之间进行选择。

【讨论】:

  • 嗯......不知道那些甚至是什么......我希望有一个更简单的解决方案
【解决方案2】:

数据作为参数传入函数,函数作为返回值传出。函数的理想情况是您无需访问函数范围之外的变量。

如果你有很多数字,也许你应该将它们声明为一个列表(更易于管理),然后将它们作为参数传递到函数中,然后作为返回值传递到函数之外?

【讨论】:

  • 如果不使用列表,那么如果我在函数一的定义中使用返回,然后我在函数二的定义中调用函数一,那么所有变量值现在都会成为function2 的定义?
  • @user1716168 没有什么会神奇地成为“function2定义的一部分”;调用返回值的函数的目的是在某些表达式中使用它,例如变量赋值:val = one(param1, param2)。现在val 保存one 返回的任何内容。所有这些都可以在另一个函数中。
【解决方案3】:

可以使用global 关键字来创建和修改全局变量,如下所示:

In [1]: def one():
   ...:     global a
   ...:     a = 1
   ...: 

In [2]: one()

In [3]: a
Out[3]: 1

但是,拥有这么多(甚至可能是任何)全局变量并不是一个好的做法。您可以声明一个全局 list 并将所有这些值保留在其中,这样会更干净;尽管您应该尽力坚持使用 Andrew 的回答中概述的函数参数和返回值。

【讨论】:

    【解决方案4】:

    如果我明白你需要什么,那么我认为 python 给你带来的最简单的方法就是下一个 ->

    class Helper:pass 
    
    # use name space
    def one(a):  
        a.x=1
        a.y=2
        a.z=3
        a.h=33
        a.j=454
        a.l=353
        a.m=898
    
    def two(a):
        a.y=7
    
    a=Helper()
    
    one(a)
    print(a.x,a.y)
    two(a)
    print(a.x,a.y)
    
    #-------------------------------------------------------------------
    # I think you have solution and dont need to read next lines :)
    # next lines are just bonus ;)
    #-------------------------------------------------------------------
    
    # you could use more independent "namespaces"
    b=Helper()
    one(b)
    print(b.y)
    print(a.y)  # "namespace a" is unchanged
    
    # if you like to see which attributes are defined you could use funciton dir
    # (under python3 it is a little more complicated)
    print(dir(a))
    print(dir(b))
    
    # please dont do next lines at home!!! :P:P:P (__builtins__ is special you could get unwanted results!) 
    one(__builtins__)
    
    print(x) # 
    

    【讨论】:

    • 太棒了,谢谢,这很有用
    【解决方案5】:

    如果你完全不清楚你想要做什么,这里有一个简单的方法可以做到这一点:

    class One(object):
        x=1
        y=2
        z=3
        h=33
        j=454
        l=353
        m=898
    
    
    class Two(One):
        n=42
        o=1337
    
    print Two.x, Two.n  # 1, 42
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-21
      • 1970-01-01
      • 1970-01-01
      • 2017-11-17
      • 1970-01-01
      相关资源
      最近更新 更多