- 函数的本质是接收一些参数,对参数进行特定规则的处理,最终输出一些结果。
python中的函数能够帮助用户快速完成程序化的工作,灵活地组合运用函数则能够完成多样化的任务。
python的函数支持接收一系列参数,并对系列参数在函数体中进行加工,最终返回一些结果
下面是对python中函数的概括性阐述,其中用到的代码参考了书籍《Python编程:从入门到实践》的第七章内容。
1.自定义一个函数
使用python的关键字 ‘def’ 可以快速创建一个函数
def greet_user():
'''简单的问候语'''
print('hello')
注意观察自定义函数的语法格式、冒号、缩进以及文档注释的写法。
2.向函数传递信息
函数一般都用来处理特定的任务,这就需要接收特定地信息。让我们为上面的greet_user函数设置一个接收信息的参数username
def greet_user(username):
'''简单的问候语'''
print('hello ' + username.title + ' !')
如此这般,greet_user函数便成为一个必须接收username参数的向用户问好的函数了,它对参数的加工很简单,只是让其转换为首字母大写的字符串格式。
3.形参与实参
为了更好地解释函数中的参数,这里用形参和实参的概念加以区分。
形参:指函数定义时,将要接收参数值并带入函数体中进行加工的变量,它们在函数定义时已经存在,
譬如greet_user函数中的username。
实参:指调用函数时,向形参赋值的对应参数值,即实际的参数值。
4.实参的传递
传递参数非常重要,不传或者错传参数都会让函数无法运行。一般传递参数有位置传递和关键字传递两种方法。
位置传递:调用函数时,按照定义函数时的形参位置顺序,向顺序中传递对应实参
关键字传递:调用函数时,使用赋值语句,为每个形参赋值实参
实参传递的两种方法可以混用,但混用时,位置传递要在关键字传递之前,否则就会看见
“SyntaxError: positional argument follows keyword argument”
5.默认值
出于任务需要,有的形参可能需要重复指定,那么我们可以为其设定默认值,这样就不用为其手动传入实参了。当一个形参有默认值时,若不为其传递实参,则函数使用默认值进行加工。
def describe_pet(pet_name, animal_type = 'dog'):
'''显示宠物的信息'''
print('i have a ' + animal_type + '.' ')
print('my ' + animal_type + ''s name is ' + pet_name + '.')
比如上面这个函数,如果给大部分的宠物狗用户使用,则他们就不必再重复指定animal_type参数值了。
6.返回值
一个参数在调用之后,其输出结果会默认从内存中释放掉,如果我们想要保留加工的结果,则需要为其指定返回值,并进行储存。
使用return语句在函数最后指定一个值,并且记得在调用函数时对其进行变量赋值,这样它就会在函数调用行返回你为它赋值的变量。
7.可选的实参
有时候,函数可以接收无限个实参,这类实参给或者不给也不影响函数的正常运行。可选的实参也有两种接收方式,它们用 * 和 ** 进行了区分。
当一个函数语句中,某个形参前有一个*,那么该形参将会是一个元组类型,它可以接收无限个实参,按照实参的被传递顺序进行储存。
当某个形参前有两个 **时,那么该形参将会是一个字典类型,它也可以接收无限个实参,不过接收的实参需要采用关键字传递方式,满足字典键值对格式的需要。
需要注意的是:
1。传递可选实参时,要注意。面对第一种元组接收类型,可选实参要放在必须实参的后面,这样可选实参才能够被正确抓取。同时,实参应当全采用位置传递方法,否则,就会出现位置传递在关键字传递之后的错误。
2.面对第二种字典接收类型时,关键字传递是必要的。必须实参和可选实参在使用关键字传递方法时没有位置顺序要求。
再注意的是,带有默认值的形参和 ** 代表的形参不同,前者是必须要有,后者是可有可无,它们会影响到函数体的编写内容
3.如果能用 ** 接收可选实参,就不要用 * 接收可选实参。
回顾
函数是调用python第三方库时必须要用到的方法,理解函数尤为重要。
总得来说,函数就是接收一些信息,对其进行加工,最后输出一些内容的可被重复调用的片段代码块,它们可以被放在其他模块中以供自己和他人调用。
更重要的,函数体内完成任务的思想方法才是一个函数的核心,如何编写一个高效、实用的函数体来完成工序会是难点,会耗费大量的时间去验证工作的正常运行和逻辑关系是否融洽。
此外,函数使用过程中也有一些标准化的内容,譬如变量命名规范,函数提示文档的撰写等,这些约定俗成的规定让广泛学习和相互借鉴变得更加方便。
最后,函数的使用非常灵活,可以一个函数套用一个函数,再套用一个函数等,这取决于编程者的思想。