第 4 章:函数——把代码打包复用

写过前三章的练习后你可能会发现:有些代码写了一遍又一遍。 函数就是把一段常用代码打包起来、起个名字、随处调用的工具。

4.1 定义和调用函数

用 函数 关键字定义,用 返回 把结果交出来:

python函数 问候(名字):
    返回 "你好," + 名字 + "!"

打印(问候("小明"))      # 你好,小明!
打印(问候("基石学员"))  # 你好,基石学员!

拆解一下:

没有 返回 的函数也能用,它返回 空:

python函数 打印横线():
    打印("----------------")

打印横线()

4.2 参数:给函数输入

参数可以是任意多个:

python函数 加(a, b):
    返回 a + b

打印(加(3, 4))        # 7
打印(加(10, 20))      # 30

参数的个数必须对上:加(1) 或 加(1, 2, 3) 都会报中文错误: 函数「加」需要 2 个参数,但传了 1 个。

4.3 作用域:函数里的变量是私有的

函数内部创建的变量,外部看不见:

python函数 计算():
    令 结果 = 42       # 只在函数内部有效
    返回 结果

打印(计算())           # 42
打印(结果)             # 错误!找不到名字「结果」

反过来,函数可以读外部的变量:

python令 税率 = 0.13

函数 含税价(价格):
    返回 价格 * (1 + 税率)    # 能读到外面的 税率

打印(含税价(100))      # 113.0

最好的习惯是:需要什么就通过参数传进去,少依赖外面的变量。

4.4 函数调用函数、自己调用自己

函数体里可以调用其他函数。特别地,函数还可以调用自己——这叫递归:

python函数 阶乘(n):
    如果 n <= 1:
        返回 1
    返回 n * 阶乘(n - 1)      # 函数调用自己

打印(阶乘(5))       # 120(1×2×3×4×5)

再看经典的斐波那契数列(每一项等于前两项之和):

python函数 斐波那契(n):
    如果 n <= 2:
        返回 1
    返回 斐波那契(n - 1) + 斐波那契(n - 2)

打印(斐波那契(10))  # 55

递归的关键是出口:一定要有一个能直接返回、不再调用自己的情况(比如 n &lt;= 1),否则会无限递归下去。

4.5 实用组合:函数 + 循环 + 判断

python函数 求平均(分数们):
    返回 总和(分数们) / 长度(分数们)

函数 等级(分数):
    如果 分数 >= 90:
        返回 "优秀"
    否则如果 分数 >= 60:
        返回 "及格"
    否则:
        返回 "不及格"

令 成绩 = [85, 92, 78, 60]
遍历 分数 在 成绩:
    打印(分数, "→", 等级(分数))
打印("平均:", 求平均(成绩))

4.6 试试看

  1. 写一个函数 最大公约数(a, b)(提示:从小的那个数往下试,或用辗转相除法)。
  2. 写一个函数 重复文本(文本, 次数),返回重复后的文本。
  3. 用递归写 求和(n):1+2+…+n。

示例代码:examples/tutorial/06_函数演示.jsh

本章小结