Python 函式与模组

进阶

def 定义函式,参数是输入,return 把结果交回;import 引入模组(math 平方根、random 随机数);函式写一次随处用,令程式短而清晰。

适合:中二资讯及通讯科技 · 单元:演算法与程式 · 建议学习路径第 6/12 课

学完呢课,你会识:
  • def 定义函式;呼叫函式名加括号才会执行。
  • 参数是函式的输入;return 把结果交回。
  • print 只显示;return 才可以拿来继续计算。
文体:编程教学课有声朗读

文体小知识:编程教学课每个概念都配一段可以亲手试的代码例子,照住输入、改一改,最快学会。

资讯及通讯科技Information & Communication Technology

§课文原文 Passage

1函式(Function)是一段有名字、可以重复使用的程式码。用 def 定义:def greet(name): print("你好," + name)。之后任何地方输入 greet("小明") 就会印出「你好,小明」— 写一次,用到足。定义了但未呼叫,函式是不会执行的。

2括号内的 name 是参数(Parameter),是函式的「输入」;函式可以用 return 把结果交回给呼叫者:def area(w, h): return w * h。执行 result = area(3, 4) 之后,result 就是 12。return 的结果可以继续拿去计算(例如 area(3, 4) * 2 得 24),这是 print 做不到的。

3模组(Module)是别人写好的函式库:import math 之后可以用 math.sqrt(16) 计平方根(得 4.0)、math.pi 是圆周率;import random 之后 random.randint(1, 6) 可以模拟掷骰(1 至 6 随机整数)。站在别人的肩膀上,不用样样自己写。

4为什么要用函式?试想想一份程式要计 20 位同学各自三科的平均分:把计算写成函式 average(scores),之后每人一行就能计好;不用把同一段代码贴上 20 次。函式令程式更短、更易改、更易测试 — 改函式一行,所有用到的地方同时更新。

1重点摘要 Summary

def 定义函式,参数是输入,return 把结果交回;import 引入模组(math 平方根、random 随机数);函式写一次随处用,令程式短而清晰。

2生字卡 Vocabulary

F
Function函式

有名字、可重复使用的程式码区块,接收输入、可以回传结果。

d
def定义关键字

Python 用来定义函式的关键字,格式:def 函式名(参数):。

P
Parameter参数

定义函式时括号内的变数,是函式的输入,例如 def greet(name) 的 name。

A
Argument引数

呼叫函式时括号内的实际值,例如 greet("小明") 的「小明」。

R
Return value回传值

函式用 return 交回给呼叫者的结果,可以继续拿去计算。

C
Call呼叫

执行函式:写函式名加括号并给出引数,例如 greet("小明")。

M
Module模组

预先写好的函式库,例如 math、random,引入后即可使用。

i
import引入

把模组载入程式的关键字,例如 import math 之后才能用 math.sqrt。

r
random.randint()随机整数函数

回传指定范围内(包括两端)的随机整数,例如 random.randint(1, 6) 模拟掷骰。

3逐步讲解 Steps

  1. 定义与呼叫第一个函式函式(Function)是一段有名字、可重复使用的程式码。用 def 定义:def hello(): 下一行缩排 print("Hello!")。定义之后程式并不会立即执行函式体,必须呼叫 hello() 才会印出 Hello!。语法要点:def 关键字、函式名、括号、冒号,函式体必须缩排。把常用的计算或显示写成函式,之后任何地方输入函式名即可使用,达到「写一次、处处可用」的效果。
  2. 参数:函式的输入括号内的名字是参数(Parameter),即函式的输入。def greet(name): print("你好," + name) 定义了一个带参数的函式;呼叫 greet("小明") 印出「你好,小明」,greet("Mary") 印出「你好,Mary」。同一个函式,不同输入产生不同结果,如同自动贩卖机:同一部机器,投入不同选择出不同饮品。参数可以有多个,例如 def area(w, h),呼叫时按次序传入 area(3, 4),第一个参数对应 3,第二个对应 4。
  3. return:交回结果return 语句把结果交回给呼叫者:def area(w, h): return w * h 定义之后,x = area(3, 4) 令 x = 12。交回的值可以继续参与计算:area(3, 4) * 2 得 24,area(3, 4) + area(2, 5) 得 22。注意 return 之后的函式体不会执行,因为函式已经结束。return 是函式向外交付成果的正式通道,令函式像零件一样串联组合,构成更大的程式。
  4. return 与 print 的分别return 与 print 常被混淆。print 只是显示在萤幕上,值并没有交回程式;return 才是把值交回。对比:def f(): return 5 之后可以写 y = f() + 1,y 是 6,因为 f() 交回了 5;若 def g(): print(5),执行 y = g() + 1 时 y 拿不到任何值,运算报错,因为 g 只负责显示、没有交回任何东西。口诀:print 给人看,return 给程式用;需要结果参与计算时,必须用 return。
  5. math 模组:现成的数学工具模组(Module)是别人写好的函式库,import 之后即可使用。import math 之后:math.sqrt(16) 计算平方根得 4.0;math.pi 是圆周率 ≈ 3.14159;计算半径 3 的圆面积:math.pi * 3 * 3 ≈ 28.27。不必自己发明平方根的计算方法,站在别人的肩膀上做事,这正是模组的价值。常用的还有 math.ceil 与 math.floor 等取整函式;往后学习三角计算时,math 模组同样是标准工具。
  6. random 模组:模拟随机import random 之后可以模拟随机事件。random.randint(1, 6) 模拟掷骰子,每次随机传回 1 至 6 的整数;配合 for 回圈可以掷十次:for i in range(10): print(random.randint(1, 6))。random.choice(["苹果", "香蕉", "橙"]) 从清单随机抽一项,可用来做课堂抽签小程式;random.shuffle 则把清单次序打乱,如同洗牌。抽奖程式、游戏中敌人随机走动、统计模拟,全部建立在 random 模组之上。
  7. 函式加回圈:威力倍增函式与呼叫组合威力倍增。定义 def average(nums): return sum(nums) / len(nums) 之后:print(average([80, 90])) 得 85.0;print(average([70, 75, 95])) 得 80.0;多少次呼叫都可以,不必重写计算。实际场景:全班 30 人各三科成绩,每人一行 average(该人成绩) 即可完成统计;若计算方法要修改,例如剔除最低分再计,只需改函式内一行,所有呼叫同时更新,这正是函式化编程的核心优势。

4图解 Diagrams

Python 函式:一块可重用嘅积木 Functionsdef make_tea(cups):return "冲好 " + str(cups) + " 杯茶"print(make_tea(3))↑ def 定义 cups 系参数 return 交返结果写一次 make_tea(),之后无论要 3 杯定 100 杯,一句 call 搞掂好处:唔使重复写同一段码;改一处,全部生效——模组化思维模组 module:人哋写好嘅函式库(例如 random 随机数),import 就用得
图 1:Python 函式结构

5例题示范 Example

例题:写一个函式 max2(a, b) 回传两数中较大的一个,并用它找出 17 和 9 的较大者。

  1. def max2(a, b): — 定义函式,两个参数 a 和 b。
  2. 函式体:if a > b: return a,否则 return b。
  3. 呼叫:print(max2(17, 9)) — 因为 17 > 9 成立,回传 a = 17。
  4. 再试边界:print(max2(9, 9)) — a > b 不成立,走 return b = 9;两数相等时结果仍是 9,正确。
  5. 答案:def max2(a, b): if a > b: return a,否则 return b;max2(17, 9) = 17。

6常见错误 Mistakes

✗ 「def 写完,函式就会自动执行。」
✓ def 只是定义;要呼叫(例如 hello())才会执行。
✗ 「函式体不用缩排。」
✓ Python 靠缩排分辨哪些语句属于函式或回圈;漏了缩排会语法错误。
✗ 「print 和 return 一样。」
✓ print 只负责显示;return 把值交回程式继续运算。要拿结果继续运算必须用 return。
✗ 「greet(name) 和 greet("小明") 是同一回事。」
✓ 定义时括号内是参数(name),呼叫时括号内是实际值("小明");呼叫时必须给实际值。
✗ 「用 math.sqrt 之前不用 import。」
✓ 模组要先 import(例如 import math),否则会出现 NameError。

75 题快测 Quick check

Q1哪个关键字用来定义函式?A. function B. def C. define

Q2def add(a, b): return a + b,那么 add(3, 5) 的结果是多少?

Q3函式中要把计算结果交回给呼叫者,应该用什么?

Q4import random 之后,怎样模拟掷一次六面骰?

Q5为什么要把常用计算写成函式?

8重点回顾 Recap

  • def 定义函式;呼叫函式名加括号才会执行。
  • 参数是函式的输入;return 把结果交回。
  • print 只显示;return 才可以拿来继续计算。
  • import 模组:math.sqrt 平方根、math.pi 圆周率、random.randint 随机整数。
  • 函式写一次随处用 — 更短、易改、易测。

同级其他科

同一科其他级别