第 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 <= 1),否则会无限递归下去。
4.5 实用组合:函数 + 循环 + 判断
python函数 求平均(分数们):
返回 总和(分数们) / 长度(分数们)
函数 等级(分数):
如果 分数 >= 90:
返回 "优秀"
否则如果 分数 >= 60:
返回 "及格"
否则:
返回 "不及格"
令 成绩 = [85, 92, 78, 60]
遍历 分数 在 成绩:
打印(分数, "→", 等级(分数))
打印("平均:", 求平均(成绩))
4.6 试试看
- 写一个函数
最大公约数(a, b)(提示:从小的那个数往下试,或用辗转相除法)。 - 写一个函数
重复文本(文本, 次数),返回重复后的文本。 - 用递归写
求和(n):1+2+…+n。
示例代码:
examples/tutorial/06_函数演示.jsh
本章小结
函数 名字(参数1, 参数2):定义函数,返回交出结果- 函数内部变量是私有的(局部作用域)
- 函数可以调用其他函数,也可以调用自己(递归),递归要有出口
- 没写
返回的函数返回空