养成高效能习惯是人生少有的最值得坚持的几件事之一。——养高习
在用公式对一元二次方程求根的过程中,我们已经接触了“函数”。怎样?是否感觉到此“函数”与数学函数不太一样?
对呀!对呀!求平方根在数学里不就是个符号吗?在程序里怎么就成了函数呢?
这个问题甚好,有疑必思、有思必学、有学必问,学问就是这样来的。
这个问题要这样看。从本质上来说,程序函数与数学函数并没有不同。
函数从本质上来说,是数据的加工机器,是为了实现某个功能创造出来的(这也是函数的英文单词是function——功能的原因)。这部机器“吃进”一个数据或多个数据,加工之后,“吐出”一个或一组数据来。
“吃进”的数据,被称为自变量,“吐出”的数据,被称为函数值,而这部机器,则被称为对应法则,用函数名表示。这三者,就是函数三剑客,哦,错了,函数三要素。
由此可知,每个数学运算符,从本质上来说,不就是函数吗?
有的数学符号可以在电脑上输入,于是程序设计语言创造者就懒得再动脑筋,照搬,有的稍微变换也能输入,而像求平方根这样的半包围结构的符号,转换成什么符号都不好使,得了,就直接现形为函数格式吧!
数学里有大量的定义好的数学函数,程序里也有,数学里可以很方便地自定义函数,程序里也有,但稍微会。
程序里用“def函数名(自变量):”来自定义函数,实现函数功能的语句跟在它的后面,而且必须缩进同样的空格数(一般四格)。
现在,我们来改写求根公式程序,看看与非函数版有哪些不同?
defqiugen(a,b,c):
importmath
delta=b*b-4*a*c
sqrt_delta=math.sqrt(delta)
return((-b+sqrt_delta)/(2*a),(-b-sqrt_delta)/(2*a))
在函数版的求根公式里,我们把求根的过程自定义成一个函数:qiugen,它有三个自变量,生成的函数值用“return”语句来告知电脑。
注意若是一组值,要把它们用括号括起来。若是用小括号括起来,这组数被称为元组(tuple),它的特点是只能读不能增删改,你第一次给它什么,它会非常专一地守护着,直到生命末了;若是用中括号括起来,这组数被称为列表(list),它跟元组不同之处在于它不但可读(正确的废话)而且可写,可以随意进行增删改。聪明的你可能也猜到了,既然小括号、中括号都派上了用场,那大括号是否也有可能登上程序的舞台呢?你猜对了,真有大括号的用武之地。这种数据结构被称为字典(dict),这里先按下不表。
在这个函数里,出现了“delta”变量,我们用它保存判别式“Δ”的值,程序里不能用非英文的字母,所以容不下希腊字母“Δ”,我们只能用它的拼音来表示,我们也可以用别的英文字母表示这个变量,比如“panbieshi”,但最贴切的还是它。
之所以又加了“sqrt_delta”语句,是为了减少重复计算(有了它,判别式的开方只要做一次),同时也可以减少后面使用小括号的数量。
定义了这个函数,就可以像使用数学函数那样使用它了:
x=qiugen(3,7,2)
print(x[0],x[1])
x=qiugen(1,2,1)
print(x[0],x[1])
x=qiugen(2,5,5)
print(x[0],x[1])
因为函数值是一组数,所以使用的时候带上加了中括号的序数来引用,注意序数是从0开始的,所以,要使用第一个数,就得在数据序列(这个例子里是元组)名后加“[0]”,以此类推。
运行这个程序,会是什么结果呢?我们试试吧!
前面两次调用都不成问题(已出结果),第三次调用为啥报告说传入了无效参数(参数就是自变量)?
带着问题好好思考、学习、行动吧!
最后我们还是得说,程序函数和数学函数还是有些重要的不同点,那就是:程序里的函数太灵活啦!可以没有自变量,可以没有函数值,甚至连“机器”都可以徒有其名。
反面竟然也成立!不像每个数学函数的功能都单一,程序函数可以是多功能的——虽然可以,但不提倡。