【问题标题】:The role of the "return" value and an unexpected result from a programme“返回”值的作用和程序的意外结果
【发布时间】:2021-11-16 07:16:54
【问题描述】:

首先,我想说我是编码新手。几天前我报名了 Python 课程;我以前从未有过任何编码经验。

我有一个关于“return”命令的问题(或者用术语来说它被称为什么)。我知道它的教科书定义——它应该将函数的值返回给调用者——但我仍然不明白它的真正作用......

假设我有一个函数:

def your_salary(a, b)
    salary = a * b #a is the number of hours worked, b is a rate per hour

现在我想使用该函数,所以我在脚本中调用该函数并计算薪水,所以我写了:

your_salary(40, 12) #40 hours worked for 12$ each

程序什么都不做。

当我将内置的打印功能添加到我的函数中时,我会得到正确的结果:

def your_salary(a, b)
    salary = a * b
    print(salary)

your_salary(40, 12)

=> 480

当我用“return”替换打印功能时,我又什么也得不到了。在我看来,“返回”不会将值返回给调用者。当我调用该函数时,它什么也没返回,程序没有向我显示函数 your_salary 中定义的计算结果。我想这就是为什么我不明白“返回”将值返回给它的调用者意味着什么的原因。有什么有用的解释吗?

【问题讨论】:

  • 您的代码中没有return 这个词。如果你在函数中说return salary,而print(your_salary(40,12)),它会如你所愿。仅运行 your_salary(40,12) 不会打印任何内容(除非您在交互式解释器中)。

标签: python return


【解决方案1】:

使用print 函数将一些变量值打印到控制台与从函数返回值不同。您的函数正在将 salary 变量打印到控制台,但 your_salary 正在返回 None 值。

def your_salary(a, b)
    salary = a * b
    return salary

result = your_salary(40, 12)
# I guess you are using an interactive shell or similar
result
=> 480 # Returned value

【讨论】:

    【解决方案2】:

    在交互式解释器中记录此会话:

    Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)] on win32 
    Type "help", "copyright", "credits" or "license" for more information.                       
    >>> def your_salary(a,b):                                                                    
    ...     salary = a*b                                                                         
    ...     return salary                                                                        
    ...                                                                                          
    >>> your_salary(9,200)                                                                       
    1800                                                                                         
    >>> print(your_salary(9,200))                                                                
    1800                                                                                         
    >>> i = your_salary(9,200)                                                                   
    >>> i                                                                                        
    1800                                                                                         
    >>>                                                                                          
    

    对于您在交互式解释器中输入的每一行,如果该行返回一个值,它将打印该值。 print 函数不返回值,所以我们唯一看到的是 print 函数本身的副作用。这是运行脚本时不会发生的事情。

    与以非交互方式运行此代码相比:

    C:\tmp>cat x.py
    def your_salary(a,b):
        salary = a*b
        return salary
    
    your_salary(9,200)
    print("Now!")
    print(your_salary(9,200))
    
    C:\tmp>python x.py
    Now!
    1800
    
    C:\tmp>
    

    请注意,除非我们有特定的 print 函数,否则不会打印任何内容。

    【讨论】:

      【解决方案3】:

      return 做了什么

      在表达式中调用函数时:

      def foo(val):
          return val - 1
      
      x = 5
      x + foo(x) / 10
      

      函数foo被执行,调用foo(x)被替换为foo的返回值:

      x = 5
      x + {{ result from calling foo(x) }} / 10
      

      在上面的具体例子中,我们知道foo(x)x - 1组成,所以这种情况下的返回值应该是4

      x = 5
      x + 4 / 10
      

      return 用于将数据从函数内部传递给函数的调用者。

      你的代码有什么问题

      你什么都没return

      在 Python 中,如果您在函数中省略 return,它将返回 None。因此,your_salary 函数有效地丢弃了它的结果,并且对your_salary 的调用总是评估为None

      这个

      def your_salary(hours, rate)
          salary = hours * rate
      
      your_salary(40, 12)
      

      评估为

      def your_salary(hours, rate)
          salary = hours * rate
      
      None
      

      哎呀!

      如何解决

      使用return

      这个

      def your_salary(hours, rate)
          salary = hours * rate
          return salary
      
      your_salary(40, 12)
      

      评估为

      def your_salary(hours, rate)
          salary = hours * rate
          return salary
      
      480
      

      print() 呢?

      正如提到的其他答案,print 向控制台发出文本。

      打印会完全绕过您的程序

      使用它以文本形式与用户交流信息。不要在你的程序中使用它来传递数据。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多