学径XUEJING · 个人学习平台通知设置

课程库 AI 主线 Python 进阶语法 › 第 3

函数进阶 —— 参数默认值、关键字参数、返回多值

普通课55 分钟

本课导读

阶段 0 的函数课教会你 def、传参数、return 一个值——函数已经"能用"。本课让它变"好用":默认参数(不传也有兜底)、关键字参数(调用时点名传值,代码自己会说话)、返回多值(一次交回好几样东西)。这三样在你读别人代码、用别人的库时天天见——sorted(names, key=len, reverse=True) 里的门道,学完这课就全通了。预计 55 分钟。

热身:你已经会的函数

Python

两个参数、按顺序传、return 一个字符串——这是阶段 0 的功夫。现在开始升级。

一、默认参数:不传也有兜底

行政小美做工牌,发现 95% 的员工都在总部,每次都传"总部"很烦。给参数设个默认值

Python
  • 定义时写 参数=默认值,调用时可传可不传:不传用默认,传了就覆盖
  • 这就是"可选项"的实现方式——回想 sorted(nums, reverse=True)reverse 正是个默认为 False 的默认参数,所以平时可以不写它

说明

规矩一条:默认参数必须排在普通参数后面def f(office="总部", name) 会直接报语法错——Python 无法分辨你传的第一个值该给谁。记法:必填的站前排,可选的靠后站

二、关键字参数:点名传值

参数一多,按顺序传值就成了记忆负担,还容易错位。调用时可以点名

Python
  • 调用时写 参数名=值,就是关键字参数——顺序随便换,可读性大增
  • 位置和关键字可以混用,但位置参数必须在前book_room("A03", hour=14, date="7月10日") 合法;反过来先关键字后位置会报错
  • 现在回头看 sorted(names, key=len, reverse=True)——names 按位置传,key 和 reverse 按关键字点名。你已经会读所有库函数的调用了

提示

类比记忆:位置参数像流水线上岗——站错位置就顶错岗;关键字参数像点名报到——"我是 date,我的值是 7 月 10 日",谁也错不了。参数超过两三个时,点名是给未来读代码的人(多半是你自己)积德。

三、返回多值:一次交回好几样

运营小林写了个分析函数,既想要平均值,又想要最大值。函数其实能一次 return 多个:

Python
  • return a, b, c:逗号隔开就能返回多个值
  • 接的一方 x, y, z = 函数(...)——变量数和返回值数对上,各就各位,这个动作叫解包
  • 整体接住时得到的是元组(tuple):一个"不可修改的列表"——能取值、能遍历,不能 append 不能改。函数返回多值、字典的 .items(),背后都是它

说明

元组新面孔?其实你早见过:for day, count in steps.items() 里每圈拿到的就是一个元组,day, count 正是解包。元组现阶段掌握"能看懂、能解包"即可,不必深挖。

四、没有 return 的函数返回什么

Python

答案:None没写 return(或 return 后面不带值)的函数,默认返回 None——上一课 .sort() 返回 None 就是这个原理。区分两件事:

  • print() 是把字给人看(屏幕输出)
  • return 是把值交给代码接着用(能赋值、能参与计算)

想"既显示又能用"?函数里 return,调用后再 print——数据的去向由调用方决定,这是好函数的修养。

✍️ 练习

练习 1:奶茶下单函数

写函数 order(drink, size="中杯", sugar="半糖"),返回一句订单描述。分别用"只传饮品名""点名改糖度""全部点名"三种方式调用。

Python
✅ 参考答案
def order(drink, size="中杯", sugar="半糖"):
    return f"{size}{drink},{sugar}"

print(order("茉莉奶绿"))
print(order("茉莉奶绿", sugar="无糖"))
print(order(drink="乌龙奶茶", size="大杯", sugar="全糖"))

练习 2:成绩速报

写函数 report(scores),一次返回:及格人数(60 分及以上)、最高分。用解包接住并打印。

Python
💡 提示

及格人数可以用上一课的推导式加 len:len([s for s in scores if s >= 60])。返回时逗号隔开两个值。

✅ 参考答案
scores = [72, 45, 95, 60, 88, 31]

def report(scores):
    passed = len([s for s in scores if s >= 60])
    return passed, max(scores)

passed, top = report(scores)
print(f"及格 {passed} 人,最高 {top} 分")

练习 3:改错题(挑战)

下面的代码有两处错误(一处在定义,一处在调用),修好让它跑起来。

Python
💡 提示

错误一:默认参数站错了排。错误二:调用时先关键字后位置——顺序反了。

✅ 参考答案
def send_msg(to, text="收到请回复"):   # 必填在前,默认在后
    return f"发给{to}:{text}"

print(send_msg("小雨", text="开会啦"))  # 位置在前,关键字在后
print(send_msg("阿杰"))                # 顺便试试默认值

📝 随堂测验

随堂测验0 / 5 题正确

1. def f(a, b=10): 定义后,调用 f(3) 的结果是?

2. 下面哪个函数定义会直接报错?

3. sorted(names, key=len, reverse=True) 这个调用里,key=len 属于?

4. def f(): return 1, 2 —— x = f() 之后 x 是什么?

5. def log(msg): print(msg) —— r = log("hi") 之后 r 是什么?

本课小结

  • 默认参数 def f(x, y=兜底):可传可不传;必填在前,可选在后
  • 关键字参数 f(y=值):调用时点名,可读性大增;位置参数必须写在关键字参数前面
  • return a, b 返回多值(打包成元组),x, y = f() 解包接住
  • 没写 return → 返回 None;print 给人看,return 给代码用

下一课看看 import 到底在干什么——作用域与模块,你将正式打开 Python 标准库这个百宝箱。

划选正文任意文字可高亮、批注或加入复习卡

讨论

载入中…