一、学习笔记 第8章 函数

1、定义函数


函数 是带名字的代码块,用于 完成具体的工作。要执行函数定义的特定任务,可 调用 该函数。


需要在程序中 多次执行同一项任务 时,无须反复编写完成该任务的代码,只需要调用执行该 任务的函数,让Python运行其中的代码即可。


学习如何编写主要任务是 显示信息的函数 ,以及旨在 处理数据并返回一个或一组值 的函数;最后,学习如何将函数存 储在称为 模块 的独立文件中,让 主程序文件组织 更为有序。



关键字def 来告诉Python,你要 定义一个函数。这是 函数定义 ,向Python指出了函数名,还可能在圆括号内指出函 数为完成任务需要什么样的信息。


文档字符串 (docstring) 的注释,描述了函数是做什么的。 文档字符串用三引号括起 ,Python使用它们来生成有关程序中函数的文档。



函数调用 让Python执行函数的代码。调用函数, 可依次指定函数名以及用圆括号括起的必要信息。



在函数 greet_user() 的定义中,变量 username 是一个 形参 (parameter),即函数完成工作所需的信息。在代码 greet_user('jesse') 中,值 'jesse' 是 一个 实参 (argument),即调用函数时传递给函数的信息。



2、传递实参



函数定义中可能包含多个形参,因此函数调用中也可能包含多个实参。向函数传递实参的方式很多:可使用 位置实参 ,这要求实参的顺序与形参的顺序相同;也可使 用 关键字实参 ,其中每个实参都由变量名和值组成;还可使用 列表和字典 。



最简单的关联方式是基于实参的顺序。这种关联方式称为 位置实参。 调用函数时,Python必须将函数调用中的每个实参都关联到函数定义中的一个形 参。



关键字实参 是传递给函数的名称值对。因为直接在实参中将名称和值关联起来,所 以向函数传递实参时不会混淆。关键 字实参让你无须考虑函数调用中的实参顺序,还清楚地指出了函数调用中各个值的用途。 【使用关键字实参时,务必准确指定函数定义中的形参名】



编写函数时,可给每个形参指定 默认值 。在调用函数中给形参提供了实参时, Python将使用指定的实参值;否则,将使用形参的默认值。因此,给形参指定默认 值后,可在函数调用中省略相应的实参。使用默认值可简化函数调用,还可清楚地 指出函数的典型用法。【 使用默认值时,必须先在形参列表中列出没有默认值的形参,再列出有 默认值的实参。这让Python依然能够正确地解读位置实参。】



使用哪种调用方式无关紧要, 只要函数调用能生成你期望的输出就行 。 使用对你来说最容易理解的调用方式即可。



3、返回值



函数并非总是直接显示输出,它还可以处理一些数据,并返回一个或一组值。函数返回的值称为 返回值 。在函数中,可使用 return语句 将值返回到调用函数的代码 行。返回值让你能够将程序的大部分繁重工作移到函数中去完成,从而简化主程 序。



Python将 非空字符串解读为True 。



函数可返回任何类型的值,包括列表和字典等较复杂的数据结构。



在函数定义中,新增了一个可选形参 age ,并将其默认值设置为特殊值 None (表示变量没有值)。可将 None 视为占位值 。在条件测试中, None 相当于 False 。 如果函数调用中包含形参 age 的值,这个值将被存储到字典中。在任何情况下,这 个函数都会存储人的姓名,但可进行修改,使其同时存储有关人的其他信息。



函数与while 循环 ,需要定义退出条件。请用户提供一系列输入时, 该在什么地方提供退出途径呢?要让用户能够尽可能容易地退出,因此每次提示用 户输入时,都应提供退出途径。每次提示用户输入时,都使用 break 语句提供退出 循环的简单途径。



4、传递列表



向函数传递列表很有用,其中包含的可能是名字、数或更复杂的对象(如字典)。将列表传递给函数后,函数就能直接访问其内容。 使用函数来提高处理列表的效率。



将列表传递给函数后,函数就可对其进行修改。在函数中对这个列表所做的任何修 改都是永久性的,这让你能够高效地处理大量数据。 (如果要保留原始列表,也可以利用切片为列表创建副本)



每个函数都应只负责一项具体的工作。 总是可以在一个函数中调用另一个函数,这有助于将复杂的任务划分 成一系列步骤。



5、传递任意数量的实参



传递任意数量的实参 :有时候,预先不知道函数需要接受多少个实参,好在Python允许函数从调用语句中收集任意数量的实参。形参名 * toppings 中的 星号 让Python创建一个名为 toppings 的空元组,并将收 到的所有值都封装到这个元组中。



结合使用位置实参和任意数量实参 :如果要让函数接受不同类型的实参,必须在函数定义中将接纳任意数量实参的形参放在最后。Python先匹配位置实参和关键字实参,再将余下的实参都收集到最后一个形参中。 【你经常会看到通用形参名*args ,它也收集任意数量的位置实参。】



使用任意数量的关键字实参 :同时允许根据需要提供任意数量的名称值对。形参 ** user_info 中的 两个星号 让Python创建一个名为 user_info 的空字典,并将收到的所有名称值对都放到这个字典中。在这个函数中,可以像访 问其他字典那样访问 user_info 中的名称值对。【 你经常会看到形参名 **kwargs ,它用于收集任意数量的关键字实参。】



6、将函数存储在模块中



使用函数的优点之一是可将代码块与主程序分离。通过给函数指定描述性名称,可让主程序容易理解得多。你还可以更进一步, 将函数存储在称为模块的独立文件中 ,再将模块 导入 到主程序中。 import 语句允许在当前运行的程序文件中使用模块中的代码 。



要让函数是可导入的,得先创建模块。 模块是扩展名为.py的文件 ,包含要导入到程序中的代码。



导入整个模块 :要调用被导入模块中的函数, 可指定被导入模块的名称和函数名 ,并用句点分隔。(如: pizza.make_pizza(16, 'pepperoni'))



导入特定的函数 :导入模块中的特定函数,这种导入方法的语法如下:



from module_name import function_name



通过用逗号分隔函数名,可根据需要从模块中导入任意数量的函数:



from module_name import function_0, function_1, function_2


使用as 给函数指定别名 :如果要导入函数的名称可能与程序中现有的名称冲突,或者函数的名称太长,可指定简短而独一无二的别名 :函数的另一个名称,类似于外号。要给函数取这种特殊 外号,需要在导入它时指定。


from module_name import function_name as fn



导入模块中的所有函数 : 使用星号( * )运算符可让Python导入模块中的所有函数:



from module_name import *



7、函数编写指南

  • 应给函数指定描述性名称,且只在其中使用小写字母和下划线。描述性名称可帮助你和别人明白代码想要做什么。给模块命名时也应遵循上述约定。
  • 每个函数都应包含简要地阐述其功能的注释。该注释应紧跟在函数定义后面,并采用文档字符串格式。文档良好的函数让其他程序员只需阅读文档字符串中的描述就能够使用它。他们完全可以相信代码如描述的那样运行,并且只要知道函数的名称、需要的实参以及返回值的类型,就能在自己的程序中使用它。
  • 给形参指定默认值时,等号两边不要有空格。
  • 如果程序或模块包含多个函数,可使用两个空行将相邻的函数分开,这样将更容易知道前一个函数在什么地方结束,下一个函数从什么地方开始。
  • 所有import 语句都应放在文件开头。唯一例外的情形是,在文件开头使用了注释来描述整个程序。


书本分享:链接:https://pan.baidu.com/s/182Vuwu9tNLPUBDxbkjt9Dg
提取码:5gky(zlibrary 下载)

Day 8

(学习中的小菜鸟,感谢指出不足,但是请轻喷,谢谢♥)