CC++ & Algorithm

Python函数的调用与返回值

困难6
语言版本:C++Python
概述:学会如何让定义好的函数真正运行,并拿到它计算出来的结果。

让函数真正跑起来,并把结果拿回来

上节课我们像写菜谱一样定义了函数,比如定义了一个做蛋糕的步骤。但电脑只是把菜谱记在脑子里,并没有真的动手做蛋糕。要让电脑按照菜谱做一遍,就需要调用这个函数。更棒的是,函数做完事情后,还能把结果“还”给我们,比如把烤好的蛋糕端出来。这个还回来的东西就叫返回值

举个例子:你告诉妈妈“帮我算一下这个月零花钱总数”,妈妈先记下你每周的零花钱(参数),然后算一算(函数的语句),最后告诉你“一共240元”(返回值)。整个过程就是调用函数,并拿到返回值。

下面我们来一步步搞清楚调用和返回值的所有秘密。


调用函数:让电脑执行一遍菜谱

在Python中,调用一个已经定义好的函数,只需要写出函数名,后面紧跟一对小括号 ()。就像你按一下微波炉的“开始”按钮,微波炉就立刻开始工作。

第一个例子:打招呼的机器人

之前我们定义过 say_hello 函数,它的作用是打印一句话。现在我们来调用它:

# 定义函数(菜谱)
def say_hello():
    print("你好,欢迎学习Python!")

# 调用函数(让电脑执行菜谱)
say_hello()   # 电脑会跑到函数体内,执行 print 语句,输出一行字

如果你写 say_hello 而不加括号,电脑只会认为你在说“我想用那个函数的名字”,并不会执行函数里的代码。就像你喊“微波炉”三个字,微波炉不会自己启动;只有按下“开始按钮”(括号)才会工作。

调用多次,执行多次

函数可以被调用任意多次。每次调用,电脑都会从头到尾执行一遍函数体内部的代码。好比一个做三明治的菜谱,妈妈每次做三明治都按相同步骤操作。

# 定义做一个三明治的函数
def make_sandwich():
    print("1. 拿两片面包")
    print("2. 抹上花生酱")
    print("3. 放几片香蕉")
    print("4. 合上面包,完成!")

# 早上做一次
make_sandwich()
# 中午再做一次
make_sandwich()
# 晚上朋友来,再做一次
make_sandwich()

运行后,你会发现同样的四行提示出现了三次。这就是函数调用的威力——重复执行又不浪费代码。


返回值:让函数把结果还给你

很多时候,我们不光希望函数做点事(比如打印),还希望它把我们需要的计算结果交出来。比如你写一个 add 函数,给他两个数字,它算好和之后,把结果“扔回来”给你。这个扔回来的东西就是返回值

在Python中,用 return 语句来返回一个值。函数执行到 return 后,就立刻结束,并把后面的值送给调用它的地方。

看代码:加法的简单函数

# 定义加法函数,接收两个数,返回它们的和
def add_numbers(a, b):
    result = a + b   # result 是局部变量
    return result    # 把 result 的值扔回去

# 调用函数,把返回值赋值给 total
total = add_numbers(3, 5)   # total 会得到 8
print(total)   # 输出 8

这里的 add_numbers(3, 5) 就像你递给自动售货机两枚硬币(参数3和5),按下按钮(调用),机器把一瓶3块和一瓶5块的饮料组合起来,然后“咚”一声掉出一瓶价值8块的饮料(返回值8)。你用篮子(变量 total)接住它。

如果函数没有 return,返回值是什么?

有些函数只管做事,不打算送回任何东西,比如前面的 say_hello。当你调用这样的函数时,Python会自动返回 NoneNone 是一个特殊的值,表示“什么都没有”或“空”。你可以这样理解:自动售货机如果只亮个灯(打印一句话),但不掉饮料,那你伸手去接,手里就是空的(None)。

试试这个:

def say_hello():
    print("Hello!")

value = say_hello()   # 函数先打印 Hello!,然后返回 None
print(value)          # 输出 None

多个返回值:一次取多个结果

有时一个函数需要送回不止一个结果。比如你想知道一个同学的数学和语文成绩,然后分别处理。Python允许用逗号列出多个返回值,它们会被打包装进一个元组(可以想象成一个小盒子,里面装着好几样东西)。

举个生活中的例子:求最小值和最大值

你和小伙伴做游戏,每个人报出自己的身高(厘米),你想找到最矮的和最高的。写个函数帮你做这件事:

# 定义函数,输入一组数字列表,返回最小值和最大值
def min_max(numbers):
    smallest = min(numbers)   # 用Python内置的min函数
    biggest = max(numbers)    # 用Python内置的max函数
    return smallest, biggest   # 返回两个值,Python自动把它们变成元组

# 班级里几个同学的身高列表
heights = [135, 148, 129, 152, 140]
# 调用函数,用两个变量接住返回的元组的两个元素
low, high = min_max(heights)
print("最矮:", low, "厘米")     # 输出 最矮: 129 厘米
print("最高:", high, "厘米")    # 输出 最高: 152 厘米

你看到我们用 low, high 两个变量同时接受返回值。这叫做“元组解包”。如果只用一个变量接,得到的就是一个元组:

result = min_max(heights)
print(result)   # 输出 (129, 152)

调用函数时容易犯的错误(常见错误)

  1. 忘记加小括号

    • print(say_hello) 只会打印出函数对象本身,比如 <function say_hello at 0x...>
    • say_hello() 才是正确调用。
  2. 调用后不接返回值,但又想用结果

    • ❌ 这样只会打印“None”:
      def add(a, b):
          return a + b
      add(2, 3)   # 调用了,但没保存结果,结果白白消失
      print(add(2, 3))   # 这样是 OK 的,但很多人忘记保存
      
    • ✅ 应该用变量接住:total = add(2, 3)
  3. return 后面写了代码,以为还能继续执行

    • 函数一旦遇到 return,立即结束,后面的语句不会执行。
      def test():
          print("开始")
          return 100
          print("结束")   # 这行永远不会执行
      test()   # 只会输出“开始”
      
  4. 调用函数时参数个数不对

    • 如果定义时有两个参数,你却只传一个,Python会报错 TypeError: missing 1 required positional argument

完整示例:计算长方形的面积和周长

让我们把今天学到的所有知识用在一个完整小程序里。定义两个函数:一个算面积,一个算周长。然后调用它们并打印结果。

# 定义计算长方形面积的函数
def rectangle_area(length, width):   # length: 长, width: 宽
    area = length * width
    return area

# 定义计算长方形周长的函数
def rectangle_perimeter(length, width):
    perimeter = 2 * (length + width)
    return perimeter

# 长方形的尺寸
my_length = 5
my_width = 3

# 调用两个函数,分别保存返回值
area_value = rectangle_area(my_length, my_width)         # 面积 = 5*3 = 15
perimeter_value = rectangle_perimeter(my_length, my_width)  # 周长 = 2*(5+3) = 16

# 输出结果
print("长为", my_length, "宽为", my_width, "的长方形")
print("面积:", area_value)
print("周长:", perimeter_value)

运行结果:

长为 5 宽为 3 的长方形
面积: 15
周长: 16

相关指引

掌握了调用和返回值,你已经能写出很多有用的函数了。接下来你可以学:

  • 参数传递:如何给函数传不同的“材料”,包括默认参数、关键字参数等。
  • 变量的作用域:函数内部定义的变量(比如 resultarea)在函数外能用吗?了解局部变量和全局变量的区别。
  • 函数嵌套:在一个函数里调用另一个函数,就像搭积木。

继续加油,你会发现函数是让代码变得简洁又强大的好帮手!

例题精讲

1单选题

执行以下代码后,输出结果是什么?\ndef add(a, b):\n return a + b\n\nresult = add(3, 5)\nprint(result)

A8
B(3, 5)
C35
D15
2单选题

在Python中,如果一个函数没有return语句,那么它的返回值是?

A0
BNone
C空字符串
DFalse
3判断题

在Python中,调用函数时必须将返回值赋给一个变量,否则程序会报错。

4填空题
请补全代码,实现一个函数square,接收一个数字n,返回n的平方,并调用它输出9。\ndef square(n):\n    ___\n\nprint(square(3))
5填空题
阅读以下代码,在空白处填入合适的代码,使程序输出"及格"。\ndef check_score(score):\n    if score >= 60:\n        return "及格"\n    else:\n        return "不及格"\n\nresult = ___(75)\nprint(result)