【问题标题】:Python - basic variable handling from funcsPython - 来自函数的基本变量处理
【发布时间】:2012-02-19 21:33:43
【问题描述】:

当我试图学习如何编码(在 python 中)时,我遇到了我经常遇到的同样的问题。

如何正确地将变量传入和传出函数。

在这个例子中,我想在函数进程中创建一个新变量,但我不知道如何正确取回(这个方法不起作用。)

a = "foo"
def func_1():
 b = "bar"
 print a,b
 return (b)
func_1()
print b 

我'期望' b 在函数调用后可用,因为我已经返回它......我很感激我没有正确理解如何实现/管理变量

谢谢。

【问题讨论】:

  • 别生气,但我认为你真正需要的是Python BeginnersGuide
  • @Rik Poggi - 我同意。不明白为什么他会被冒犯。如果他使用一本假设读者已经具备基本编程知识的书,我觉得他会感到非常沮丧。我记得刚开始学习编程。它是一整桶新概念,其中许多并不直观。对于我们这些已经编程一段时间的人来说,很容易忘记我们认为理所当然的所有基本知识。
  • @Rik Poggi - 我没有被冒犯,我同意 DutrowLLC 的观点,有时基本文本假定我没有的语义知识水平。我大致知道我想做什么,我只是不能总是将这些例子与我的世界观联系起来。这是一个学习曲线,我正在慢慢弄清楚。
  • @Jay Gattuso - 我注意到你得到了很多非常优秀的程序员没有得到的东西 - 外交。看起来您对所有花时间回答的人都投了赞成票,还给他们留下了很好的评论,让他们感觉良好。该技能将带您走远。
  • “我大致知道我想做什么”。在函数中创建新变量?这是一个语义问题,通过教程完全解决了。您似乎对变量范围规则感到困惑;教程将有助于填补空白。

标签: python function variables


【解决方案1】:

我认为这就是你想要做的:

a = "foo"
def func_1():
 b = "bar"
 print a,b
 return b     # Took out parenthasis
returned_b = func_1()  # Added variable to hold the returned "b"
print returned_b 

您似乎只是在学习一般的编码。您的问题似乎在于了解计算机代码通常是如何工作的,而不是特别是 Python。

其他几件事。

a = "foo" 行中,a 是一个全局变量。这在编程中经常不受欢迎,因为它会造成混乱(尽管我觉得它可能特别在 Python 中使用得更多)。

您似乎无法理解变量如何工作的一个方面,即“范围”。当您在func_1() 内声明变量b 时,它只有函数作用域。一旦函数退出,该变量将不再存在,除非您返回该值并将其存储在另一个变量中,巧合的是,该变量也可能被称为 b

我不确定您是否能够从一本面向已经知道如何编程的人的普通 Python 书籍中学习这些概念。您可能需要的是一本教您如何进行一般编程的书,并且还使用 Python 作为首选语言。正如我在顶部评论中提到的,找到正确的学习资源是关键,否则您可能会陷入沮丧的世界。

以下是如何设置“正常”程序的示例:

def main():                 # Calling main() "runs" the program
   a = add(1,2)
   print a

def add(first, second):     # functions are normally declared outside of other functions, 
   result = first + second  #  that way, they can be used anywhere
   return result

【讨论】:

  • 啊。那么返回的数据是一个未赋值的对象,需要在主例程中赋值给一个命名的对象才能访问?
  • @Jay Gattuso - 不完全是。我只是在关于“范围”的答案中添加了更多内容。函数退出后,“b”不再存在。您需要将函数的返回值分配给另一个变量。
  • 优秀。谢谢你。我读得越多,我就越明白。我想如果你有一个具有多 func 范围的变量,最好有一个 func 来设置它们,并使它们可用于主例程,而不是在开始时将它们声明为全局变量?
  • @Jay Gattuso - 简而言之:不。这里有一些细微差别,但具有“多功能范围”的变量可能是全局变量。在你的情况下,如果你只是一次写几行 python 来学习,像 "a='foo'" 这样的全局变量就可以了。通常,“真实”程序中的所有内容都发生在函数内部。所以你声明“a='foo'”的地方,无论如何都会在某种主函数中。我可能不应该提到全局变量这件事,因为它令人困惑。
  • @Jay Gattuso - 我没有注意到下面有人使用“全局 b”在函数内部声明了一个全局变量。这绝对是我不会在你的情况下做的事情,因为这不是一件“正常”的事情,并且会阻止你了解程序的正常编写方式。
【解决方案2】:

您已退回它,但未将其分配给任何东西:

def func_1():
    b = "bar"
    a = 2
    return a, b

a, b = func_1()
print b

【讨论】:

    【解决方案3】:

    这是您修改的示例:

    a = "foo"
    def func_1():
        b = "bar"
        print a,b
        return b
    b = func_1()
    print b
    

    函数内部的b是一个局部变量,所以它在函数外部是不可用的,但是既然你返回它,你可以将返回的值赋给一个新的变量(我也叫b,但它是不是同一个)。

    另一种方法是在函数内使用全局(非局部)变量。为此,您需要在函数内将其声明为全局:

    a = "foo"
    def func_1():
        global b
        b = "bar"
        print a,b
    func_1()
    print b
    

    【讨论】:

    • 啊,我之前尝试过全局方法,并且毫无疑问地被告知这是一种不好的方法。公平地说,我是在用它来掩盖我的理解不足......谢谢。
    【解决方案4】:

    func_1() 内部的 b 是函数的本地变量,在函数外部不可用。您需要函数func_1()的返回值赋给主体中的一个变量名。

    b = func_1()
    print b
    

    【讨论】:

      【解决方案5】:

      函数调用是表达式。像任何表达式一样,它们具有值。如果你不给任何东西赋值,它就会丢失。

      def add(a, b):
          result = a + b
          return result
      
      four = add(2, 2)
      

      函数的任何局部变量(如上述情况下的abresult)在函数外部不可见,即它们是函数的局部变量。

      函数调用的值是传递给函数内部return 语句的值。在这种情况下,它是局部变量 result 的值。

      【讨论】:

        【解决方案6】:

        我想你的意思是,我如何访问从函数返回的值。

        假设你有一个函数:

        def func_1():
            b = 1
            return b
        

        如果您想要该函数的返回值,请设置一些与其相等的变量,如下所示:

        someVariable = func_1() #func_1 executes it's code, and returns the value contained in b
        

        通过将参数放在函数声明行的括号中,将参数传递给函数:

        a = "foo"
        
        def func_1(some_foo): #here some_foo represents a variable you are passing to func_1
            b = "bar"
            print some_foo, b #now you're referencing the variable you passed
            return b
        
        #Now you call the function like this:
        func_1(a) #passing a (which equals "foo")
        

        要传递多个参数,您的函数声明应如下所示:

        def func_1(some_foo1, some_foo2,...):
        

        记住在函数内声明/初始化的变量只能在该函数块内访问,这一点也很重要。因此:

        def func_1(some_foo1):
            print some_foo1
        
        a = some_foo1 #Doesn't work. The variable some_foo1 doesn't exist outside of `func_1`
        

        【讨论】:

        • 是的,这正是我想要做的。谢谢。
        【解决方案7】:

        我“期待”b 在函数调用后可用,因为我已经返回了它

        根本的误解:您不是在返回一个变量,而是在返回一个值。变量是值的标签(名称)。在函数内部,您有一个名称 b 对应一个值 "foo"。您使用此名称来引用该值,以便您可以返回它。

        在外面,要使用这个值,你必须用它做点什么。对函数的调用 - func_1() - 在包含它的任何表达式中都是返回值的替代。因此,像func_1() 这样的代码行本身并没有做任何可见的事情:您有一个计算结果为"foo" 的表达式,但是对"foo" 没有任何作用。

        例如,您可以使用print(func_1()) 来显示字符串。您可以将返回值分配给另一个变量:c = func_1()。现在c 是返回的"foo" 值的名称。您可以将函数调用用作更大表达式的一部分:c = func_1() + "bar" - 现在c 是字符串"foobar" 的名称,它是通过将函数返回的字符串与直接指定的字符串连接在一起而创建的。

        另一方面:要将信息输入函数,您应该将其作为参数传递。这些是括号内的值:当您编写函数时,将参数名称(另一种变量)放在括号内,当您调用函数时,将调用函数的参数(表达式提供值)。现在,在函数内部,每次调用它时,参数都会引用参数值。

        让我们举一个简单的例子。我们将创建一个将“bar”附加到输入字符串的函数,并调用它几次。

        def add_bar(to):
            return to + "bar"
        

        注意我们如何返回任何表达式。调用函数时,会计算表达式,将传入的参数字符串to 连接到常量"bar",并返回结果值。这里没有代表整个返回值的变量,因为同样,我们返回的是一个值,而不是一个变量。

        现在我们可以这样称呼它。同样,参数可以是任何表达式 - 所以是一个常量:

        add_bar("foo")
        

        或者我们之前已经赋值的变量:

        my_string = "sand"
        add_bar(my_string)
        

        或更复杂的东西,甚至可能涉及对函数的另一个调用:

        add_bar(add_bar("bar ") + " ")
        

        但同样,这些都不会真正做任何事情,除了产生字符串然后把它扔掉。所以让我们解决这个问题:

        print("I want a " + add_bar("chocolate") + ".")
        

        【讨论】:

          猜你喜欢
          • 2011-08-18
          • 2022-01-21
          • 2015-01-13
          • 2015-11-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多