文章总览图
函数是带名字的代码块,用于完成具体的工作。要执行函数定义的任务,可调用该函数。
要执行函数定义的特定任务,可调用该函数。需要在程序中多次执行同一项任务时,无需反复编写完成该任务的代码,而只需调用执行该任务的函数,让Python运行其中的代码。
一,定义函数
1.关键字def告诉Python要定义一个函数,这是函数定义。向Python指出了函数名,还可能在括号内指出函数为完成其任务需要什么样的信息。函数名为greet_user(),它不需要任何信息就能完成其工作,因此括号是空的(即便如此,括号也必不可少)。最后,定义以冒号结尾。
输出:
紧跟在def greet_user():后面的所有缩进构成函数体。文档字符串用三引号括起,描述了函数是做什么的。
函数调用让Python执行函数的代码。要调用函数,可依次执行函数名以及用括号括起的必要信息。
2.向函数传递信息
在函数定义def greet_user()的括号内添加username。通过在这里添加username,就可以让函数接受你给username指定的任何值。这个函数要求你调用它时给username指定一个值。调用greet_user()时,可将一个名字传递给它。
输出:
代码greet_user('jesse')调用函数greet_user(),并向它提供执行print语句所需的信息。
输出:
根据需要调用函数greet_user()任意次,调用时无论传入什么样的名字,都会生成相应的输出。
3.实参和形参
在函数greet_user()的定义中,变量username是一个形参,函数完成其工作所需的一项信息。在代码greet_user('jesse')中,值'jesse'是一个实参。实参是调用函数时传递给函数的信息。调用函数时,要让函数使用的信息放在括号内。在greet_user('jesse')中,将实参'jesse'传递给了函数greet_user(),这个值被存储在形参username中。
输出:
二,传递实参
函数定义中可能包含多个形参,因此函数调用中也可能包含多个实参。向函数传递实参的方式很多,可使用位置实参,这要求实参的顺序与形参的顺序相同。也可使用关键字实参,其中每个实参都由变量名和值组成;还可以使用列表和字典。
1.位置实参
调用函数时,Python必须将函数调用中的每个实参都关联到函数定义中的一个形参。最简单的关联方式时基于实参的顺序。这种关联方式称为位置实参。
输出:
2.调用函数多次
根据需要使用任意数量的位置实参,Python将按顺序将函数调用中的实参关联到函数定义中相应的形参。
输出:
3.位置实参的顺序很重要
函数调用中实参的顺序与函数定义中形参的顺序一致。
4.关键字实参
关键字实参是传递给函数的名称-值对。直接在实参中将名称和值关联起来。关键字实参无需考虑函数调用中的实参顺序,还清楚地指出了函数调用中各个值的用途。
输出:
使用关键字实参时,务必准确地指定函数定义中的形参名。
5.默认值
编写函数时,可给每个形参指定默认值。在调用函数中给形参提供了实参时,Python将使用指定的实参值,否则将使用形参的默认值。给形参指定默认值后,可在函数调用中省略相应的实参。使用默认值可简化函数调用,还可清楚地指出函数的典型用法。
输出:
由于显示地给animal_type提供了实参,因此Python将忽略这个形参的默认值。
输出:
使用默认值时,在形参列表中必须先列出没有默认值的形参,再列出有默认值的形参。这让Python依然能够正确地解读位置实参。
6.等效的函数调用
可混合使用位置实参,关键字实参和默认值,通常有多种等效的函数调用方式。
输出:
7.避免实参错误
输出:
三,返回值
函数并非总是直接显示输出,它可处理一些数据,并返回一个或一组值。函数返回的值被称为返回值。
在函数中,可使用return语句将值返回到调用函数的代码行。返回值将程序的大部分工作移到函数中完成,从而简化主程序。
1.返回简单值
输出:
2.让实参变成可选的
让实参变成可选的,这样使用函数的人就只需在必要时才提供额外的信息。使用默认值来让实参变成可选的。
输出:
3.返回字典
函数可返回任何类型的值,包括列表和字典等比较复杂的数据结构。
输出:
4.结合使用函数和while循环
输出:
四,传递列表
向函数传递列表很有用,这种列表包含的可能是名字、数字或更复杂的对象(如字典)。将列表传递给函数后,函数就能直接访问其内容。
输出:
1.在函数中修改列表
将列表传递给函数后,函数就可对其进行修改。在函数中对这个列表所做的任何修改都是永久性的,这让你能够高效地处理大量的数据。
输出:
2.禁止函数修改列表
将列表的副本传递给函数。切片表示法[:]创建列表的副本。
五,传递任意数量的实参
1.不知道函数要接受多少个实参,Python允许函数从调用语句中收集任意数量的实参。
形参名*toppings中的星号让Python创建一个名为toppings的空元组,并将收到的所有值都封装到这个元组中。
输出:
对列表进行遍历。
输出:
2.结合使用位置实参和任意数量实参
让函数接受不同类型的实参,必须在函数定义中将接纳任意数量实参的形参放最后。Python先匹配位置实参和关键字实参,再将余下的实参都收集到最后一个形参中。
输出:
3.使用任意数量的关键字实参
将函数编写成能够接受任意数量的键-值对,调用语句提供了多少就接受多少。
形参**user_info中的两个星号让Python创建一个名为user_info的空字典,并将收到的所有名称-值对都封装到这个字典中。
输出:
编写函数时,可以以各种方式混合使用位置实参,关键字实参和任意数量的实参。
六,将函数存储在模块中
将函数存储在被称为模块的独立文件中,再将模块导入到主程序中。import语句允许在当前运行的程序文件中使用模块中的代码。
将函数存储在独立文件中后,可与其它程序员共享这些文件而不是整个程序。知道如何导入函数还能让我们使用其它程序员编写的函数库。
1.导入整个模块
让函数是可导入的,得先创建模块。模块是扩展名为.py的文件,包含要导入到程序中的代码。
making_pizzas.py的文件导入刚创建的模块,再调用make_pizza()两次。
输出:
2.导入特定的函数
调用函数时,无需使用句点。由于我们在import语句中显示地导入了函数make_pizza(),因此调用它时只需指定其名称。
输出:
3.使用as给函数指定别名
导入的函数名称可能与程序中现有的名称冲突,或者函数名称太长,可指定简短的别名。
关键字as将函数重命名为我们提供的别名。
输出:
4.使用as给模块指定别名
更轻松地调用模块中的函数。
输出:
5.导入模块中的所有函数
使用星号*运算符可让Python导入模块中的所有函数。
输出:
import语句中的星号让Python将模块pizza中的每个函数都复制到这个程序文件中。由于导入了每个函数,可通过名称来调用每个函数,而无需使用句点表示法。
当使用并非自己编写的大型模块时,最好不要采用这种导入方法。如果模块中有函数的名称与你的项目中使用的名称相同,可能导致意想不到的结果。Python遇到多个名称相同的函数或变量,进而覆盖函数,而不是分别导入所有的函数。
要么只导入需要使用的函数,要么导入整个模块并使用句点表示法。
七,函数编写规范
给模块、函数指定描述性名称,且只在其中使用小写字母和下划线。给形参、实参指定默认值时,等号两边不要有空格。
如果形参很多,导致函数定义长度超过79字符,可在函数定义中输入左括号后按回车,并在下一行按2次Tab键,从而将形参列表和只缩进一层的函数体区分开来。
如果程序或模块包含多个函数,可使用两个空行将相邻的函数分开。
所有的import语句都放在文件开头,唯一例外的是,在文件开头使用了注释。