第8章 函数
8.1 定义函数

8.1.1 向函数传递信息:

8.1.2 实参和形参:
变量
username是一个形参- 形参: 函数完成其工作所需的一项信息。
值
jesse是一个实参。- 实参:调用函数时传递给函数的信息。

8.2 传递实参
鉴于函数定义中可能包含多个形参,因此函数调用也可能包含多个实参。
向函数传递实参的方式很多:
- 位置实参
- 关键字实参
- 列表 or 字典
8.2.1 位置实参:
调用函数时,python必须将函数调用中的每个实参都关联到函数定义中的每一个形参。
最简单的关联方式是 基于实参的顺序 ———— 位置实参
位置实参的顺序很重要,如果实参的顺序不正确,结果可能会出乎意料。
在函数中,可根据需要使用任意数量的位置实参,python将按顺序将函数调用中的实参关联到函数定义中相应的形参。
自己用的最多的就是 位置实参,上一次在突然想在一个函数定义中多插入一个变量的时候,就有疑惑:会不会赋值的时候 顺序上出错,这个疑惑现在解决了。 要按顺序!!!
8.2.2 关键字实参:

关键字实参让你无需考虑函数调用中的实参顺序,还清楚地指出了函数调用中各个值的用途。
关键字实参的顺序无关紧要。
8.2.3 默认值:
在定义函数时,可给每个形参指定默认值。
在调用函数中给形参提供了实参时,python将使用指定的实参值。
否则,将使用形参的默认值。
在形参指定默认值后,可在函数调用中省略相应的实参。
使用默认值可简化函数调用,还可清楚地指出函数的典型用法。

8.2.4 等效的函数调用

8.2.5 避免实参错误
注意报错信息
8.3 返回值
函数并非总是直接显示输出的,相反,它可以处理一些数据,并返回一个或一组值。
函数返回的值被称为返回值
返回值让你能够将程序的大部分繁重工作移到函数中去完成,从而简化主程序。
8.3.1 返回简单值:

调用返回值的函数时,需要提供一个变量,用于存储返回的值。
8.3.2 让实参变成可选的:
有时候,需要让实参变成可选的,这样使用函数的人就只需在必要时才提供额外的信息。
可使用默认值让实参变成可选的。

可选值让函数能够处理各种不同的情形,确保函数调用尽可能简单。
8.3.3 返回字典:
函数可返回任何类型的值,包括列表和字典等较复杂的数据结构。

8.3.4 结合使用函数和while循环:


8.4 传递列表

向函数传递列表
一般我都是向函数传递单个参数,还没怎么试过向函数传递一个较复杂的数据结构
8.4.1 在函数中修改列表:
相比于没有使用函数的版本,有函数的版本更容易拓展和维护。
每个函数都应只负责一项具体的工作。
可以在一个函数中调用另一个函数,有助于将复杂的任务划分成一系列的步骤。
8.4.2 禁止函数修改列表:
可向函数传递列表的副本而不是原件。
这样函数所做的任何修改都只影响副本,而丝毫不影响原件。
- 将列表的副本传递给函数
function_name(list_name[:])- 切片表示法[:]创建列表的副本
虽然向函数传递列表的副本可保留原始列表的内容,但除非有充分的理由需要传递副本,否则还是应该将原始列表传递给函数,因为让函数使用现成列表可避免花时间和内存创建副本,从而提高效率,在处理大型列表时尤其如此。
8.5 传递任意数量的实参
有时候,你预先不知道函数需要接受多少个实参
python允许函数从调用语句中接受任意数量的实参

8.5.1 结合使用位置实参和任意数量实参:
如果要让函数接受不同类型的实参,必须在函数定义中将接纳任意数量实参的形参放在最后。
python先匹配位置实参和关键字实参,再将余下的实参都收集到最后一个形参中。

8.5.2 使用任意数量的关键字实参

形参**user_info中的两个星号让python创建一个名为user_info的空字典,并将收到的所有键值对都封装到这个字典中。
8.6 将函数存储在模块中
函数的优点之一:
- 将代码块与主程序分离
通过给函数指定描述性名称,可让主程序容易理解得多。
还可以将函数存储在独立的文件中,可隐藏程序代码的细节,将重点放在程序的高层逻辑上。
- 能让你在众多不同的程序中重用函数。
- 可与其他程序员共享这些文件而不是整个程序。
8.6.1 导入整个模块:
要让函数是可导入的,得先创建模块。
模块是拓展名为.py的文件。
导入整个模块:
import module_namemodule_name.function_name()使用其中的一个函数
8.6.2 导入特定的函数:
导入特定的函数:
from module_name import function_name
导入任意数量的函数:
from module_name import function_0,function_1,function_2- 若使用这种语法,调用函数时就无需使用句点。
- 由于我们在
import语句中显式地导入了函数make_pizza(),因此调用它时只需指定其名称。
8.6.3 使用as给函数指定别名:
如果要导入的函数的名称可能与程序中现有的名称冲突,或者函数的名字太长,可指定简短而独一无二的别名——函数的另一个名称,类似于外号。
指定别名的通用语法:
from module_name import function_name as fn
8.6.4 使用as给模块指定别名:
给模块指定别名的通用语法如下:
import module_name as mn
好处:
- 让代码更简洁
- 让你专注于描述性的函数名
- 函数名明确地指出了函数的功能,对理解代码而言,它们比模块名更重要。
8.6.5 导入模块中的所有函数:
导入模块中的所有函数的通用语法:
from module_name import *由于导入了每个函数,可通过名称来调用每个函数,而无需使用句点表示法
- 使用并非自己编写的大型模块时,最好不要采用这种导入方法
- 如果模块中有函数的名称与你的项目中使用的名称相同,可能导致意想不到的结果。
- python可能遇到多个名称相同的函数或变量,进而覆盖函数,而不是分别导入所有的函数。
最佳的做法:
- 只导入你需要使用的函数
- 导入整个模块并使用句点表示法
8.7 函数编写指南
编写函数时,需要牢记几个细节。
- 给函数指定描述性名称
- 只使用小写字母和下划线
- 包含简要地阐述其功能的注释
- 注释应紧跟函数定义后面,并采用文档字符串格式
8.8 小结
- 如何编写函数
- 如何传递实参,让函数能够访问完成其工作所需的信息
- 如何使用位置实参和关键字实参
- 如何接受任意数量的实参
- 显示输出的函数和返回值的函数
- 如何将函数同列表、字典、if语句和while循环结合起来使用
- 如何将函数存在被称为模块的独立文件中,让程序文件更简单、更易于理解
函数的编写指南,遵循这些指南可让程序始终结构良好,并对你和其他人来说易于阅读
程序员的目标之一是:编写简单的代码来完成任务,而函数有助于你实现这样的目标。
- 它们让你编写好代码块并确定其能够正确运行后,就可置之不理
- 确定函数能够正确地完成其工作后,你就可以接着投身于下一个编码任务
函数提高代码的复用性
- 需要运行函数中的代码时,只需编写一行函数调用代码,就可让函数完成其工作
- 需要修改函数的行为时,只需修改一个代码块,而所做的修改将影响调用这个函数的每个地方
良好的函数名概述了程序各个部分的作用
- 使用函数让程序更容易阅读
函数让代码更容易测试和调试
- 每个函数都完成一项具体的工作,测试和维护起来将容易得多
- 你可编写分别调用每个函数的程序,并测试每个函数是否在它可能遇到的各种情形下都能正确地运行。
确实函数让代码更容易调试和测试,之前在一个写了很多行的代码时,想测试一下其中的数据库操作函数能不能正常使用的时候,我只需要调用该函数,给里面传几个参数,而不需要整个文件运行一次。
Then, 学习编写类,类将函数和数据整洁地封装了起来