案例 2-1中的第6行,用def关键字定义了一个函数,名字叫calcu_tri,这种形式就是函数的定义,calcu_tri函数的参数是x和y,然后依旧使用缩进的方法标志函数的范围,calcu_tri函数只有两个语句,而从第11行开始就不是calcu_tri函数的范围了。
第7行 没什么意思,只是通过打印信息提示一下程序现在运行的位置
第8行 return是一个Python语法关键字,顾名思义,函数将在此返回(到调用位置),并带回一个值:1.0*x*y/2.0也就是说calcu_tri函数传入参数x,y;并返回按公式1.0*x*y/2.0计算所得到的值。
第11行取消了缩进,表示回到程序,到15,16行,输入了a和h
第17行,呼呼哈哈,像数学中调用函数一样,将a,h当作参数调用了calcu_tri函数,然后程序会到calcu_tri函数中去运行,直至运行到calcu_tri函数的return语句,这里调用使用到的参数叫“实参”(实际参数),calcu_tri函数按参数排列顺序接收a,h的值到x,y中x,y属于calcu_tri函数定义时使用的参数叫“形参”(形式参数),calcu_tri函数中return后面的叫“返回值”。之所以出现实参、形参、返回值的说法对编程到没什么意义,就是一会说到各部分时指代比较明确。这里说一句实参和形参是否使用一样的名称着实没有关系。
可以看到第17行利用一个赋值将calcu_tri函数的值给了area然后在第18行打印
这里需要知道的是,python也是“先定义再使用”的语言。于是,上面的程序,把6-8行的函数定义放到19行之后就会有错误,因为程序在17行要求调用calcu_tri函数时,calcu_tri函数还不存在。
另外 Python也支持格式化输出: 第19行可以改成
print “area is ”+ '{:d}'.format(area)
这里先提一下格式化输出,Python是荷兰程序员Guido van Rossum发明的,荷兰人的语言、语法思维方式显然和我们不一样,我咋觉得和英语国家的人也不一样,所以Python的格式控制太有意思了,需要花一次课才能讲清楚,现在我们用不到,所以知道输出整型数用 '{:d}'.format(整型数),就行了,不用细究。
注意!!!本次课的重点是:这种函数定义和使用方式没什么实际用途,最大的不方便就是函数不能作为一个“工具包”被其他程序利用(即复用)。所以把函数打包十分重要,请看案例2-2。
案例2-2 示范了如何使用外部文件的资源,这样所有函数都可以被新程序复用了。本案例包括两个文件,一个叫python02_m.py,他将调用calcu_tri函数,但是这个函数在l另一个文件python02_s.py中。于是在python02_m.py的第6行:from python02_s import *
这句话说“从python02_s 中引入所有函数”,于是,在python02_m.py中可以使用calcu_tri函数了。注意,from的时候不要有 python02_s.py文件的后缀“.py”
为什么要这样做呢,这样就可以方便地进行工具包(函数库)的复用了,比如你在python02.py中写了求各种图形面积的函数,那么求下面图形阴影部分面积时,只需要写写函数调用的组合就好了,而具体而微的细节就不用重复了。
今天的“作业”就是请大家试试:利用多文件函数机制求下面图形的面积,练习的方式可以先仿照案例2-1写一个求圆的面积的函数并调用,以熟悉函数的定义与调用的基本方法,然后就尝试一下多文件机制吧。