常用运算、使用自定义函数在这章读者们将实践函数的用法,包括定义,使用,引用等等,本书的特点是“实用”,所以这章特别说明了使用外部文件配置函数,这是一种在开发中特别有用技术。本章所涉及的技术要点包括:1)函数要先定义再使用2)Python的缩进格式3)形参、实参、返回值4)局部变量与全局变量5)常用运算6)利用import导入机制7)Python的格式化输出开门见山,看下面的例程。案例2-1:用函数的方法计算三角形面积案例2-1导读无论已经提到多少遍都要再次强调的是:python是“先定义再使用”的语言。所以函数在使用之前也需要定义。于是,上面的程序,把6-8行的函数定义放到19行之后就会有错误案例第6行,用def关键字定义了一个函数,名字叫calcu_tri,这种形式就是函数的定义,calcu_tri函数的参数是x和y,然后使用缩进的方法标志函数的范围,calcu_tri函数只有两条语句,这两条语句的缩进(句首空格数)相同,而从第11行开始就不是calcu_tri函数的范围了。Python利用排版的缩进格式表达语句的归属范围,第7,8行的缩进格式表明,这两句话隶属于第6行定义的函数。def函数定义x,y参数函数体案例2-1导读第7行calcu_tri函数的功能,首先通过打印信息提示一下程序现在运行的位置第8行return也是一个Python语法关键字,顾名思义,函数将在此返回(到调用位置),并带回一个值,即:1.0*x*y/2.0。也就是说calcu_tri函数传入参数x,y;并返回按公式1.0*x*y/2.0计算所得到的值。第11行取消了函数calcu_tr的缩进,表示回到程序主框架的范畴,到15,16行,输入了a和h。案例2-1导读第17行,像数学中调用函数一样,程序将a,h当作参数调用了calcu_tri函数,然后程序加载calcu_tri函数并运行,直至运行到calcu_tri函数的return语句,在回到函数被调用的位置,可以看到第17行利用一个赋值将calcu_tri函数的值给了area然后在第18行打印。另外Python也支持格式化输出:第19行可以改成print“areais”+'{:d}'.format(area)案例2-1导读这里先提一下格式化输出,Python的格式化输出十分有特点,需要一段时间才能讲清楚,现在我们用不到很复杂的方式,暂时知道输出整型数用'{:d}'.format(整型数),就行了,不用细究。在真实的应用中,形如案例2-1的函数使用方式没什么实际用途,最大的不方便就是函数不能作为一个“工具包”被其他程序利用(即复用)。所以把函数打包十分重要,请看案例2-2。案例2-2:开发一个求三角形面积的工具包案例2-2:开发一个求三角形面积的工具包案例2-2示范了如何使用外部文件的资源,这样所有函数都可以被新程序复用了。本案例包括两个文件,一个叫python02_m.py,程序将调用calcu_tri函数,但是这个函数在l另一个文件python02_s.py中。于是在python02_m.py的第6行:frompython02_simport*这句话说“从python02_s中引入所有函数”,于是,在python02_m.py中可以使用calcu_tri函数了。注意,使用from引用文件模块的时候不要有文件名的后缀“.py”案例2-2:开发一个求三角形面积的工具包为什么要分成两个文件呢呢,这样就可以方便地进行工具包(函数库)的复用了,比如开发人员完成了求各种图形面积的函数,那么求图2-1中的图形阴影部分面积时,只要把包含简单图形求面积的函数文件导入(import)进来,然后把各种函数组合一下,就完成了开发任务,这种开发就简单多了,所以尽量使用多文件机制定义函数,否则函数的功效将大打折扣。图2-1知识梳理与扩展函数的定义和调用函数在调用前必须定义,比如在函数A中调用函数B,被调用的函数叫“被调函数”,例如上面提到的函数B,那么函数A就是主调函数,函数被调用时使用到的参数叫“实参”(实际参数),而函数定义时使用的参数叫形参(形式参数)。例如上面的示例,calcu_tri函数按参数排列顺序接收a,h的值到x,y中,x,y属于calcu_tri函数定义时使用的参数被称为“形参”,而a,h被称为实参。calcu_tri函数中return后面的叫“返回值”。之所以出现实参、形参、返回值的说法对编程来说没什么意义,只是教学和交流时指代比较明确。知识梳理与扩展函数的定义和调用在Python中形参和实参之间采用之传递的机制,形参的变化不会改变实参。例如:运行以上简短代码,读者会发现调用函数fun1前后k的值并没有发生变化。#形参不改变实参的示例deffun1(a):a=a+1print‘a=’+`a`return0k=10print‘Beforek=’+`k`fun1(k)print‘Afterk=’+`k`知识梳理与扩展缩进格式函数定义时需要利用缩进格式,所谓缩进是指在代码行开始部分的空格。代码行开头的前导空白用于确定语句的分组,同样的缩进级别的语句属于同一语句块。全局变量与局部变量简单的说在函数内部定义的变量的使用范围仅限于函数内部,被称为局部变量,而不属于任何函数的变量就是全局变量,但是想要形象地理解全局变量和局部变量有一个简单的判断方法,那就是变量的作用范围由缩进格式标志的代码块确定,在一个代码块声明的变量仅限于本(级)代码块使用。#全局变量与局部变量示例deffun1(a):a=a+1print‘a=’+`a`return0k=10print‘Beforek=’+`k`fun1(k)print‘Afterk=’+`k`知识梳理与扩展常用运算Python提供丰富的计算功能,其中算术运算有:+(加),-(减),*(乘),/(除),%(取余)。他们的运算规则与常规算术运算一样,若要提高某部分表达式的运算优先级则在该部分表达式外面使用“()”,“()”的使用可以嵌套。另外进行除法运算时除数不能为0,计算机语言中的计算与日常计算不同,需要注意数据的类型,例如两个整型数据进行除法运算。简洁起见,将常用的运算总结如下表:知识梳理与扩展常用运算1、括号(),括号内的数据优先处理,括号可以嵌套使用2、算术运算符知识梳理与扩展常用运算3、关系运算符注意:Python的关系运算和逻辑运算中用布尔值表达两种结果:True:真以及False:假。知识梳理与扩展常用运算4、逻辑运算符5、运算优先级以上列出的运算符优先次序为:括号,算术运算,关系运算,逻辑运算知识梳理与扩展import模块导入机制利用import导入机制可以将已有的函数功能模块导入程序。这个机制方便代码复用,要注意引用功能模块的文件时不需要后缀名。格式化输出Python支持数据的格式化,优势是可以方便地将数据格式化成相应的字符串。常用的格式化功能如下:1)基本格式:STRING.format(表达式),STRING表达字符串2)字符串中加如形如{:^nd}的格式控制符,用以控制format中表达式的输出形式3)常用格式控制符有:{:^nd}用来输出整形,n代表输出所占字符列数;{:^m.nf}用来输出浮点型,m代表输出所占字符列数,n代表小数点部分的位数。4)若指定输出的字符列数大于实际输出,则输出空格占位;若实际输出字符数大于指定,则按实际输出。小节对一个开发人员而言,代码复用意味着工作经验的积累,函数为开发人员提供了这种机制。开发人员可以把一些常用的功能抽象成函数形式,再把同类的多个函数(例如求各种不同图形面积的的函数)打包成一个文件,这样就可以在开发其他程序中便利的使用以前的工作成果了。另外这种机制也可以支持小组开发,例如多名开发人员组成小组,规定好功能间的接口,然后分别提交不同的功能文件,通过函数的相互调用完成程序的功能。这样可以较大的提升开发效率。小节在定义函数的过程中要注意函数代码的范围,Python没有利用“{}”或“begin...end”来标志代码的开始与结束,Python利用了缩进这种更接近人类书写的方式,但是这种方式在针对大代码块时也有一定劣势,例如代码过长导致不能在一屏中显示所有代码时就有容易出现类似“IndentationError:unexpectedindent”的错误,这个含义是是缩进错误,这是书写格式中明显的错误,按提示的行号修正就可以了。另外还有因缩进导致的逻辑错误,此类错误是隐性的,系统不会给予提示所以更加隐蔽。实际上Python的缩进书写机制鼓励开发人员尽量写短的代码,短的方法当然包括将功能尽量包装成函数。Python在函数调用过程中使用值传递的形式,所以主调函数中的实参不会因形参在被调用函数中变化而变化。练习二1:尝试自编一个面积工具包求图2-2阴影部分面积2:海伦公式的用途是利用三角形三条边求面积,编写一个函数,可以利用海伦公式求三角形面积3:编写一个求矩形面积的函数。4:利用第2、3题的成果编写程序,输入梯形的四条边,求梯形面积。图2-2求阴影部分面积