学径 LearnPath

编程语言基础

函数

封装一组代码片段。

讲解模式

通过本节课,你将理解:

#goal

上一课把数据收进字典与集合。再往前走一步:若同一套步骤要对许多组数字反复执行,就不必每次都把移项、合并、相除再抄一遍。

函数 给一段过程一个名字,并用 抽象 把细节藏进函数体。调用处只关心:送进哪些已知量,拿回什么所求。方程里的系数对应参数;要求的未知数对应返回值。

本节课你将学会用 def 定义函数,分清 return 与 print,并看见抽象如何让人站在问题一层思考。

运行环境仍是本平台的 在线 IDE。

差分机要执行的,是方法

#hook

查尔斯·巴贝奇的差分机被设计来按固定规则生成数表。十九世纪的航海与工程依赖对数表;人工抄写时,错一行就会把后续工作带偏。

差分机要解决的,不是某一行算得快一点,而是:一旦方法造进机器,换一组初值,不必重造机器,也不必靠人把同一套规则再抄一遍。

伦敦科学博物馆复原的差分机二号
伦敦科学博物馆按巴贝奇差分机二号图纸复原的机器。摄影:User:geni。来源:Wikimedia Commons,CC BY-SA 4.0。

函数继承的是同一种冲动。程序保存的是方法;题目以参数进入,未知数以返回值出来。

看下面四道一元一次方程——步骤同形,变的只是数字:

  1. 2x+3=02x + 3 = 0
  2. −5x+10=0-5x + 10 = 0
  3. 4x−7=3x4x - 7 = 3x
  4. x−4=3x+2x - 4 = 3x + 2

解依次是 −3/2-3/2、22、77、−3-3。能把这套步骤封成一个名字,以后只改数字、不改算法——这就是抽象。

def:给过程起名字

#explore-def

约定标准形式 ax+b=cx+dax + b = cx + d。移项后 (a−c)x=d−b(a-c)x = d-b。记 A=a−cA = a-c,D=d−bD = d-b:若 A≠0A \neq 0,则 x=D/Ax = D/A。

def 定义函数,括号里列出参数;return 把值交回调用处:

python
def solve(a, b, c, d):
    A = a - c
    D = d - b
    if A != 0:
        return D / A
    else:
        return '无唯一解'


print(solve(2, 3, 0, 0))

运行后应看到 -1.5。只写下 def 而不调用,什么也不会发生——名字给出能力,调用才动用能力。

方程语言程序语言
未知数 xx返回值
系数 a,b,c,da,b,c,d参数
解方程的步骤函数体
「解方程」这个能力函数名

打印给人看,返回值给下一计算

#explore-return

print 把字送到屏幕。屏幕上的 -1.5 不能直接当作下一道方程的系数继续算——人可以看见它,程序自己却接不上。

python
print((0 - 3) / 2)          # 只能给人看
x = solve(2, 3, 0, 0)       # 值留给程序
print(x)

返回值是给计算用的;打印是给人看的。两者不要互相冒充。

前四次调用的解,可以成为第五次的系数——嵌套靠的是 return,不是屏幕:

python
a_ = solve(2, 3, 0, 0)
b_ = solve(-5, 10, 0, 0)
c_ = solve(4, -7, 3, 0)
d_ = solve(1, -4, 3, 2)
print(solve(a_, b_, c_, d_))

接口:已知进去,所求出来

#explore-interface

说清已知与所求,抽象才站得住。参数是已知(系数),返回值是所求(未知数)。

若把 xx 也列进参数,调用者必须先知道答案——那是传话,不是解方程。若函数只 print 不 return,第五道就接不上。若 A=0A=0 时仍硬除,抽象就把「不能除」藏进了机器里。

抽象的意义不在少打字,而在让调用处只看见接口:四个系数进去,一个解出来。内部以后换成别的算法,调用方式可以几乎不动。

三元一次方程组每式四个系数,大约十二个参数;变复杂的主要是函数内部,调用仍可以是一次函数调用。

本节练习:把摄氏度交回去

#practice

在 在线 IDE 里定义 celsius_to_fahrenheit(c),用 return 交回 c×9/5+32c \times 9 / 5 + 32,不要用 print 代替返回。调用时传入 100,应得到 212;再把这次返回值减去 32,应得到 180。若函数只打印、不返回,减 32 这一步就接不上。

本节要点

#review
  • 函数对过程做抽象:参数进,返回值出。系数对应参数,未知数对应返回值。
  • def 给出能力;调用才动用能力。只定义不调用,什么也不会发生。
  • 打印给人看,返回值给下一计算用。嵌套靠的是返回值,不是屏幕。
  • 说不清已知与所求,抽象就会把两侧写混。内部可以变长;接口应当稳定。

单选题

系数与未知数

方程 ax + b = 0 中,a 是什么?

单选题

函数抽象的是什么

定义一个函数,其实是在对一段什么进行抽象?

单选题

三元方程组的参数

解三元一次方程组(每式四个系数)的函数大约需要几个参数?内部消元变复杂时,调用方是否必须同样变复杂?

单选题

打印还是返回

若要把四道方程的解再送进第五道方程,solve 应当怎样交出未知数?

单选题

已知与所求

定义解方程的函数时,人必须先能指出哪一件?

未登录时不会保存学习进度