编程语言基础
函数
封装一组代码片段。
通过本节课,你将理解:
#goal差分机要执行的,是方法
#hook查尔斯·巴贝奇的差分机被设计来按固定规则生成数表。十九世纪的航海与工程依赖对数表;人工抄写时,错一行就会把后续工作带偏。
差分机要解决的,不是某一行算得快一点,而是:一旦方法造进机器,换一组初值,不必重造机器,也不必靠人把同一套规则再抄一遍。

函数继承的是同一种冲动。程序保存的是方法;题目以参数进入,未知数以返回值出来。
看下面四道一元一次方程——步骤同形,变的只是数字:
解依次是 、、、。能把这套步骤封成一个名字,以后只改数字、不改算法——这就是抽象。
def:给过程起名字
#explore-def约定标准形式 。移项后 。记 ,:若 ,则 。
def 定义函数,括号里列出参数;return 把值交回调用处:
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 而不调用,什么也不会发生——名字给出能力,调用才动用能力。
| 方程语言 | 程序语言 |
|---|---|
| 未知数 | 返回值 |
| 系数 | 参数 |
| 解方程的步骤 | 函数体 |
| 「解方程」这个能力 | 函数名 |
打印给人看,返回值给下一计算
#explore-returnprint 把字送到屏幕。屏幕上的 -1.5 不能直接当作下一道方程的系数继续算——人可以看见它,程序自己却接不上。
print((0 - 3) / 2) # 只能给人看
x = solve(2, 3, 0, 0) # 值留给程序
print(x)返回值是给计算用的;打印是给人看的。两者不要互相冒充。
前四次调用的解,可以成为第五次的系数——嵌套靠的是 return,不是屏幕:
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说清已知与所求,抽象才站得住。参数是已知(系数),返回值是所求(未知数)。
若把 也列进参数,调用者必须先知道答案——那是传话,不是解方程。若函数只 print 不 return,第五道就接不上。若 时仍硬除,抽象就把「不能除」藏进了机器里。
抽象的意义不在少打字,而在让调用处只看见接口:四个系数进去,一个解出来。内部以后换成别的算法,调用方式可以几乎不动。
三元一次方程组每式四个系数,大约十二个参数;变复杂的主要是函数内部,调用仍可以是一次函数调用。
本节练习:把摄氏度交回去
#practice在 在线 IDE 里定义 celsius_to_fahrenheit(c),用 return 交回 ,不要用 print 代替返回。调用时传入 100,应得到 212;再把这次返回值减去 32,应得到 180。若函数只打印、不返回,减 32 这一步就接不上。
本节要点
#review- 函数对过程做抽象:参数进,返回值出。系数对应参数,未知数对应返回值。
def给出能力;调用才动用能力。只定义不调用,什么也不会发生。- 打印给人看,返回值给下一计算用。嵌套靠的是返回值,不是屏幕。
- 说不清已知与所求,抽象就会把两侧写混。内部可以变长;接口应当稳定。
单选题
系数与未知数
方程 ax + b = 0 中,a 是什么?
单选题
函数抽象的是什么
定义一个函数,其实是在对一段什么进行抽象?
单选题
三元方程组的参数
解三元一次方程组(每式四个系数)的函数大约需要几个参数?内部消元变复杂时,调用方是否必须同样变复杂?
单选题
打印还是返回
若要把四道方程的解再送进第五道方程,solve 应当怎样交出未知数?
单选题
已知与所求
定义解方程的函数时,人必须先能指出哪一件?
未登录时不会保存学习进度