开始之前
从 M2 开始,你已经调用过 print()、input()、int()、float()、str() 和 len()。这些都是 Python 已经提供的函数或可调用能力:把信息放进括号,Python 完成一个明确任务。
现在要把自己写过的计算和判断也组织成 function。函数不是为了增加语法,而是为了避免重复、给任务起清楚的名字,并让同一段逻辑能够处理不同数据。
概念 01
Function definition 让 Python 记住一个有名字的任务
当一组步骤会重复使用时,给它一个名字比复制多份代码更容易理解和修改。
Function definition 的英文全称是 Function definition,中文叫函数定义,Python 写成 def greet(): 后接缩进的函数体。它的意思是:“创建一个叫 greet 的 function;以后被调用时,执行缩进的代码。”实际用途是给一段任务命名并集中保存,而不是到处复制相同步骤。
def 是 Python keyword(关键字),英文来自 define,中文可以理解为“定义”。def 用来开始函数定义;greet 是我们选择的 function name;() 是函数接收数据的位置;冒号 : 表示后面开始函数体;缩进表示哪些代码属于这个函数。
运行到 def greet(): 时,Python 只记住这个定义,不会立刻执行缩进的 print()。因此只运行下面的 definition 不会出现输出。这一点和普通代码按顺序立即执行不同:函数体要等函数被调用才运行。
- Function definition 创建有名字的任务
- def 来自 define
- 函数名说明任务
- () 是接收数据的位置
- 冒号和缩进标记函数体
定义函数时不会立即执行函数体
Python 已经记住 greet,但还没有收到执行 greet 的要求,所以函数体中的 print() 不会运行。
点击“运行”后,程序输出会显示在这里。
概念 02
Function call 才让已经定义的函数执行
定义与执行分开后,同一个有名字的任务可以在需要时调用一次或多次。
Function call 的英文全称是 Function call,中文叫函数调用,Python 写成 show_message()。Function call 是让已经定义好的函数真正执行。实际用途是按需要启动一段已经命名的任务。
def show_message(): 开始的是 definition,只让 Python 记住函数;后面的 show_message() 才是 call。程序执行到 call 时进入缩进的函数体,显示 Welcome;函数体结束后再回到调用位置之后继续。
同一个 function 可以调用多次。写两次 show_message(),函数体就执行两次。这样只需在 definition 中修改一处,所有调用都会使用更新后的步骤。
- Definition 负责创建
- Call 负责执行
- 函数调用写成 name()
- 调用时进入函数体
- 函数结束后回到调用位置
定义一次,调用两次
definition 本身没有输出;两个 function call 分别执行一次函数体,因此 Welcome 出现两次。
点击“运行”后,程序输出会显示在这里。
概念 03
Parameter 接收数据,Argument 提供实际值
函数接收不同数据后,同一段逻辑就能服务不同的人、数字或记录,而不必复制并改写代码。
Parameter 的英文全称是 Parameter,中文叫参数,Python 写在 function definition 的括号中,例如 def greet(name):。Parameter 是函数内部用来接收外部数据的名字;这里 name 是 parameter。它的实际用途是让函数逻辑不依赖某个固定值。
Argument 的英文全称是 Argument,M2 已把它解释为调用时放进括号里的实际信息。例如 greet("Amy") 中,"Amy" 是 argument;函数开始执行时,这个值交给 parameter name。Parameter 出现在定义里,argument 出现在调用里,不是同一件事。
多个 parameter 用逗号分隔,例如 def introduce(name, age):。调用 introduce("Amy", 20) 时,arguments 按位置交给 parameters:第一个给 name,第二个给 age。实际用途是让一个任务同时处理多项相关数据。本课不使用默认参数或可变数量参数。
- Parameter 在 definition 中接收数据
- Argument 在 call 中提供实际值
- 值按位置交给对应 parameter
- 多个参数用逗号分隔
- 同一函数可处理不同 arguments
两个参数接收两组不同的参数值
每次 call 都把两个 arguments 按位置交给 name 和 age;同一个函数因此产生不同结果。
点击“运行”后,程序输出会显示在这里。
概念 04
return 把结果交回来;print() 只负责显示
函数返回的结果可以保存、比较、继续计算或交给另一个函数;只显示结果无法完成这些后续工作。
return statement 的英文全称是 Return statement,中文叫 return 语句,Python keyword(关键字)写成 return。例如 def double(number): return number * 2 会把计算结果交回调用它的位置。return 不是“显示”,它的实际用途是让函数产生可以继续使用的数据。
Return value 的英文全称是 Return value,中文叫返回值。double(5) 产生 return value 10;result = double(5) 再把这个值保存到 result。数据流是 argument 5 → parameter number → expression number * 2 → return value 10 → variable result。
print() 与 return 必须分开理解:print(number * 2) 只把 10 显示在 Terminal;return number * 2 才把 10 交回调用者。如果函数只有 print(),result = double(5) 不会保存显示过的 10。
None 的英文名称就是 None,Python 写成 None,中文可以理解为“这里没有实际结果”。函数没有执行 return 时,Python 会让调用得到 None。它实际帮助我们发现函数只做了显示,却没有交回需要的数据;本课不深入 None 的类型机制。
- return 把结果交回调用者
- Return value 可以保存和继续使用
- print() 只显示信息
- 没有 return 的函数会得到 None
- 参数进入,返回值出来
显示结果与返回结果不是一回事
show_double 显示 10 后没有 return,所以 shown_result 是 None;create_double 把 10 交回来,因此 returned_result 保存 10。
点击“运行”后,程序输出会显示在这里。
常见错误
这些写法为什么不工作
错误不是失败,而是 Python 告诉你“这部分我无法理解”。先找到差异,再一次只改一个问题。
只定义函数,却忘记调用
def 只让 Python 记住函数。没有 function call 时,缩进的函数体不会执行。
def show_message():
print("Ready")def show_message():
print("Ready")
show_message()调用时没有提供 parameter 需要的数据
definition 中 name 是需要接收数据的 parameter;call 必须提供对应 argument。检查参数数量与调用中的值是否一致。
def greet(name):
print(f"Hello {name}")
greet()def greet(name):
print(f"Hello {name}")
greet("Amy")引导修改
用不同 arguments 重复调用总价函数
这不是正式练习。跟着步骤修改已有代码,观察每次改变如何影响程序。
- 1先运行代码,确认 calculate_total(10, 3) 的 return value 被 total 保存。
- 2把第一次调用的 price 和 quantity arguments 改成 8.5 与 4。
- 3再增加第二次调用 calculate_total(12, 2),并把返回值保存到另一个变量。
- 4使用两个 f-string 分别输出两个变量保存的结果。
完成后:同一个 function 使用两组 arguments,两个 return value 分别保存并通过 f-string 显示。
修改这段代码
先运行,再按左侧步骤逐项修改。你的草稿会保存在这个浏览器中。
点击“运行”后,程序输出会显示在这里。
正式练习
现在独立完成 2 道练习
先运行代码观察问题,再点击“检查答案”。检查只关心题目要求的结果,不要求你照抄参考写法。
正式练习
实现数字加倍函数
完成 function double(number)。number 是 parameter;必须使用 return 交回 number * 2 的结果。不要使用 print() 代替 return,函数会用多个不同 arguments 检查返回值。
点击“运行”后,程序输出会显示在这里。
需要一点提示?
先自己尝试一次;卡住时再逐级打开提示。
本课总结
本课小结
- 1Function definition 使用 def、函数名、括号、冒号和缩进,让 Python 记住一个任务。
- 2Function call 才会执行函数体;parameter 在定义里接收 argument。
- 3return 把 return value 交回调用者,print() 只负责显示。
- 4没有执行 return 的函数会产生 None,不能把显示过的内容当作返回值。