agentmentoragentmentor

第 05 节:把一段流程折成函数

本节 objectives:

  • def 定义函数并调用它
  • 区分打印结果和返回结果
  • 把重复逻辑拆成可测试的小函数

先修:变量、条件、循环 | 上一节 << 04 | 下一节 06 >>

代码能跑,不代表它容易改

当同一段逻辑在三个地方出现,你每改一次都要同步三处。函数把一段流程命名,让你在需要时调用它。Python 用 def 定义函数;函数可以接收参数,也可以用 return 把结果交回调用位置1

入门时最重要的一刀是:会显示给人的东西用 print(),要继续参与计算的东西用 return

讲解

函数名回答“这段代码做什么”。 def minutes_to_label(total_minutes): 比一串散落的除法和取余更容易读。名字是给未来的你看的。

参数是函数的输入。 同一个函数用不同参数调用,就能处理不同数据。参数让函数不必依赖外面的固定变量。

返回值连接下一步。 return label 不是显示文字,而是把结果交给调用者。调用者可以打印它、保存它、或传给另一个函数。

小函数更容易自测。 如果一个函数只做一件事,你可以用两三个输入检查它是否可靠。

跟我做一遍(worked example)

把分钟转换逻辑折成函数:

python
def format_duration(total_minutes):    hours = total_minutes // 60    minutes = total_minutes % 60    return f"{hours}h {minutes}m"
label = format_duration(135)print(label)

函数内部负责计算和组装字符串。外部负责决定怎么使用结果。这样以后你可以把 format_duration(45) 用在任何地方,不必复制那两行计算。

换你补全(faded example)

补全函数:及格返回 True,否则返回 False

python
def is_passing(score):    if score >= 60:        return ____    return ____
print(is_passing(82))

答案:

python
def is_passing(score):    if score >= 60:        return True    return False
print(is_passing(82))

关键判断点是:函数返回布尔值,调用者以后可以把它放进别的 if

小结 + 通向下一节

函数让一段逻辑有了名字和边界。下一节处理函数常常要接收的数据:不止一个值时,该用列表还是字典。

Footnotes

  1. Python Tutorial: More Control Flow Tools — https://docs.python.org/3/tutorial/controlflow.html

练习

Level 1: 写一个 greet(name)

  • 做法:函数接收名字,返回 Hello, <name> 字符串;在外面打印返回值。
提示 1

先写 return "Hello, " + name。 Level 2: 给任务加标签。

  • 做法:写 task_label(title, done),完成时返回 [x] title,未完成时返回 [ ] title
提示 2

先判断 done,再组装字符串。

看参考答案

这个函数会在最后的 CLI 项目里复用。

自评