Python 函式与模组
进阶def 定义函式,参数是输入,return 把结果交回;import 引入模组(math 平方根、random 随机数);函式写一次随处用,令程式短而清晰。
- def 定义函式;呼叫函式名加括号才会执行。
- 参数是函式的输入;return 把结果交回。
- print 只显示;return 才可以拿来继续计算。
文体小知识:编程教学课每个概念都配一段可以亲手试的代码例子,照住输入、改一改,最快学会。
§课文原文 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
有名字、可重复使用的程式码区块,接收输入、可以回传结果。
Python 用来定义函式的关键字,格式:def 函式名(参数):。
定义函式时括号内的变数,是函式的输入,例如 def greet(name) 的 name。
呼叫函式时括号内的实际值,例如 greet("小明") 的「小明」。
函式用 return 交回给呼叫者的结果,可以继续拿去计算。
执行函式:写函式名加括号并给出引数,例如 greet("小明")。
预先写好的函式库,例如 math、random,引入后即可使用。
把模组载入程式的关键字,例如 import math 之后才能用 math.sqrt。
回传指定范围内(包括两端)的随机整数,例如 random.randint(1, 6) 模拟掷骰。
3逐步讲解 Steps
- 定义与呼叫第一个函式函式(Function)是一段有名字、可重复使用的程式码。用 def 定义:def hello(): 下一行缩排 print("Hello!")。定义之后程式并不会立即执行函式体,必须呼叫 hello() 才会印出 Hello!。语法要点:def 关键字、函式名、括号、冒号,函式体必须缩排。把常用的计算或显示写成函式,之后任何地方输入函式名即可使用,达到「写一次、处处可用」的效果。
- 参数:函式的输入括号内的名字是参数(Parameter),即函式的输入。def greet(name): print("你好," + name) 定义了一个带参数的函式;呼叫 greet("小明") 印出「你好,小明」,greet("Mary") 印出「你好,Mary」。同一个函式,不同输入产生不同结果,如同自动贩卖机:同一部机器,投入不同选择出不同饮品。参数可以有多个,例如 def area(w, h),呼叫时按次序传入 area(3, 4),第一个参数对应 3,第二个对应 4。
- 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 是函式向外交付成果的正式通道,令函式像零件一样串联组合,构成更大的程式。
- 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。
- 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 模组同样是标准工具。
- 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 模组之上。
- 函式加回圈:威力倍增函式与呼叫组合威力倍增。定义 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
5例题示范 Example
例题:写一个函式 max2(a, b) 回传两数中较大的一个,并用它找出 17 和 9 的较大者。
- def max2(a, b): — 定义函式,两个参数 a 和 b。
- 函式体:if a > b: return a,否则 return b。
- 呼叫:print(max2(17, 9)) — 因为 17 > 9 成立,回传 a = 17。
- 再试边界:print(max2(9, 9)) — a > b 不成立,走 return b = 9;两数相等时结果仍是 9,正确。
- 答案:def max2(a, b): if a > b: return a,否则 return b;max2(17, 9) = 17。
6常见错误 Mistakes
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 随机整数。
- 函式写一次随处用 — 更短、易改、易测。