第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_name
  • module_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, 学习编写类,类将函数和数据整洁地封装了起来

results matching ""

    No results matching ""