八、函数
首先我们看一段代码:
# -*- coding: utf-8 -*- r1 = 1 print 2 * PI * r1 * r1 |
上述代码是实现了三次求圆的面积,在Python的正常应用中,我们经常会把重复的代码进行统一的规范与整理,将重复的功能单一化,这就是函数。函数是为了使得写好的程序中,经常需要被使用的代码能够很方便的被使用,也为了从逻辑上更便捷的管理和维护代码。
Python不仅可以灵活地定义函数,而且系统体身也为我们提供了大量的内置函数,方便在日常应用中的操作。除Python外,基本上所有的高级语言都支持函数。
8.1 常用内置函数
第5行ord()函数,可以实现将字符转换成ASCII数值。
第7行chr()函数,可以实现将ASCII数值转换成字符。
第4行range()函数,可以生成0至11之前的数值列表。
第6行len()函数,可以计算出对象的长度。
第4行int()函数,可以将字符”1″转换为数值”1″。
第6行str()函数,可以将数值”1″转换为字符”1″。
第8行float()函数,可以将数值”1″转换为浮点数值”1.0″。
第4〜6行abs()函数,实现了正数、负数及小数的绝对值结果,abs()函数是实现绝对值的方法。
第4〜6行cmp()函数,实现了对数值的比较,其函数返回值结果如下:
-
x > y时,函数返回结果为1;
-
x < y时,函数返回结果为-1;
-
x == y时,函数返回结果为0;
在Python中,函数名其实就是一个函数对象的引用,它能灵活地将函数名赋值给变量,此变量就有此函数的功能,这个被赋值的变量,我们通常称为”别名“。
这种”别名“不建议大家使用,因为它会破坏我们对程序的理解,但是得知道它。
8.2 自定义函数
在Python中,通常使用关键字def来定义一个函数,依次写出函数名、括号、括号中的参数和冒号,然后在缩进块中写函数体内容,最后可以使用return语句来返回相应的值,当然return也是可以省略的。
第3行,”def“为定义函数的关键字,”area_of_circle“为函数的名称,”r“为涵数的参数。
第4〜8行,为函数的功能描述,此部分可以省略,但为了养成好的编程习惯,建议大家根据引实例进行填写,这也是符合代码规范的要求。
第9〜10行,为函数体,实现了圆面积计算的功能。
第11行,为函数体,实现了函数结果的返回,是不是有返回值,根据你所写的函数而定。
第13行,函数的调用,函数体本身不会执行,只有调用它时才有效。
在Python中,函数可以根据自己的功能决定是否有返回值,如果有返回值,使用”return“语句来返回内容,如果没有返回值,可以不写”return“,但函数执行完毕后,还会有一个返回结果,那就是”None“。
当然,为了保持函数的完整性或在一些特殊用法上,在没有返回值的函数中可以使用”return”或”return None”返回,它所代表的是函数没有返回值。
8.3 函数的多值返回
在Python中,函数是可以返回多个值的,接下来看一个示例。
第11行,通过”return“语句实现了同时返回”vDebug“与”vRelease“。
第13行,通过变量”vD“与”vR“来接收函数返回的结果。
在其它程序语言中,通过返回值返回内容时,通常只能返回一个值,如果想返回多个,只能通过让人不能理解的指针,或自己去组织成一个新的数据结构反返回,而在Python中,就简单的多,那么,它是怎么返回的?我们再看个示例。
通过第13行,我们使用一个变量获得返回内容,在第14行进行了打印,在打印结果中可以看出,函数的多返回值实际上是返回的是一个tuple(元组)类型。
8.4 空函数
在Python中,有一个非常特殊的函数,那就是空函数。空函数是一个只定义了的函数,但没有做任何操作,定义一个空函数,通常使用关键字def,后面依次写出函数名、括号、括号中的参数和冒号,然后在缩进块中写”pass“做为函数体。
空函数的应用示例有很多,比如说想实现打印本机IP地址的功能函数,但是还没有想好怎么去做,所以把函数空出来,将来可以进行补充;再比如做一些大型项目时,系统架构师会将软件的实现方法与接口定义好,余下的工作就需要程序员按要求完成指定的函数体。在上图中第8行的”pass“语句什么也不做,只是起到一个占位的作用。”pass“还可以出现在其它语句中。
第5行的”pass“如果不写,语法就会出现错误。
8.5 函数的参数
先描述一下相关部门经常提到的一个高大上的术语”接口“。什么是接口呢,其实接口就可以理解为函数名,因为在团队项目开发中,经常会遇到相互功能的调用,而在正式编写代码之前,团队都会先约定每个人所负责的部分的函数名称及参数信息,这样就不会因为不统一,而造成代码对接不成功的问题。
第3〜10行,为整个函数的实现,此函数实现了对句子中单词的切分,并返回句子中的第一个单词。
第12行,在调用函数之前,定义了将要切分的句子。
第13行,实现了切分函数的调用,并且将字符串句子”str“传入函数。此时的”str“即为必备参数。”get_wors“函数,在实现时就一个参数,所以在13行的调用中,也要有一个参数才行,否则就会出现系统错误。函数的返回结果赋值给了变量”word“。
第14行,对得到的单词进行了印。
刚刚提到了必备参数,必备参数必须以正确的顺序传入函数,调用时与函数声明的数量必须相同。在上例中,我们只能获得到第一个单词,那么,想随意获得指定个数的单词怎么办?看下面的示例是如何做到的。
第3行,在原有的参数基础之上,添加了一个参数,用来返回指定单词的索引编号。
第10行,返回值返回函数传过来的索引值。
第13行,调用时,就可以根据单词的索引位置获得单词了。
接下来,我们再对其进行修改。
第3行,”def get_words(sentence, n = 0):“中的”n=0“是什么意思,其实它叫默认参数。
第13行,调用时,只传递一个参数即可,第二个参数如果不填写,即为函数默认值”0“,如果正常填写,即为实际填写的内容。
默认参数是函数在调用时,缺省参数的值没有传入,则被认为是默认参数。
第3〜8行,实现了对整型数值的求合的操作,但在第3行参数中的”nums“我们并不分析出是什么类型,但根据函数体的功能实现,可以猜出可能是”list“或”tuple“。
第10行,我们使用了list作为参数传入函数,并做了打印操作。
第11行,我们使用了tuple作为参数传入函数,并做了打印操作。
通过上例,我们可以看出,函数可以使用”list”或”tuple”做为参数,就是因为”list”或”tuple”可以作为参数,所以函数就得能够处理任意长度的参数。在函数调用时,用户可能传送一个空的”list”或”tuple”,也可能传送任意多个”list”或”tuple”元素,我们称这样的参数为可变参数。
可变参数(部分书籍称它为”不定长参数“)就是传入的参数个数是可变的。
第8行,实现了函数调用,只传递两个参数过去。
第3~6行,函数的实现部分,这里为了说明”关键字参数“,在第3行的第三个参数前面多个”**“符号,它是用来标识关键字参数,并在第6行,对其打印,在打印结果中”other:{}“我们可以看出,其实在第8行调用时,没有传参的第三个参数,实际传送过来的是一个dict(即字典)类型的内容。接下来我们看一个具体的应用。
第3〜6行,函数的实现部分。
第8行,实现了函数的调用,需要注意调用时的第3个参数与第4个参数(你也可以接照这样的格式加入第5个、第6个到第n个参数)。
我们可以根据打印结果看到我们传入和参数,在函数内部自动封装成一个dict。除了这种用法之外,还有一种用法以,我们看下面的示例。
通过例可以看出,我们可以定义一个dict,直接以参数传入函数。
到此我们就可了解到,在Python中,调用函数可使用4种参数类型,它们分别是”必备参数“、”默认参数“、”可变参数“与”关键字参数“。
评论(1)
默默的转走并加工应用