1.函数
函数是组织好的,可以重复使用的,用来实现特定功能的代码片段
例如:input()和print()函数:

1.1 函数定义

注意:函数定义时的参数列表和返回值语句是可有可无的;函数必须先定义后调用(函数定义时,内部函数体并未执行,在调用时才会执行)
1.2 函数的参数与返回值

注意:
- 函数定义时如果有多个参数,过个参数间用逗号 (,)分隔;
- return 语句只有返回功能,而没有输出打印的功能,如果要输出,需要配合print()语句来实现
- 在调用函数时,传入实参时的顺序要和定义时的形参的数据保持一致
- round(数据,保留几位小数)
1.3 函数的说明文档
函数的说明文档是写在函数开头,用三个引号包裹的字符串,用于解释函数的功能,参数,返回值等信息,方便调用者清楚函数的具体作用及细节

使用 Ctrl + 鼠标点击函数 可以跳转到该函数的定义位置
1.4 函数的嵌套调用
函数的嵌套调用指的是在一个函数中,又调用了另外一个函数

函数调用遵循栈结构,最后被调用的函数最先返回 LIFO(后进先出)

2.函数的进阶
2.1 函数变量的作用域
变量的作用域指的是变量的作用范围(标识这个变量在哪里可以使用,在哪不可以使用)

变量的分类:
- 全局变量: 在函数之外定义的变量,称之为全局变量,在整个文件中(包括函数内)都可以使用(通常定义在函数的顶部)
- 局部变量: 在函数内部定义的变量,称之为局部变量,只能在该函数内部使用,外部无法访问(函数执行完毕后,会自动销毁其内部局部变量)
global 关键字:
global 关键字用于明确的告诉Python解释器,在函数中要使用全局变量,使得可以在函数内部修改全局变量的值

在基于 global 关键字声明全局变量时,要先声明,再使用

2.2 函数参数详解
2.2.1 函数传参方式
传参方式是指:在调用函数时,传递实参的方式

1.位置参数 :调用函数时根据函数定义时的位置来传递参数
要求:调用函数时参数顺序与定义函数时参数顺序完全一致

2.关键字参数: 调用函数时以函数定义时形参名称作为关键字,以 "键 = 值" 的形式来传递参数(不要求顺序)
要求:如果位置参数与关键字参数混用,关键字参数必须在位置参数之后(关键字参数之间没有顺序要求)

3. 位置参数 VS 关键字参数

2.2.2 默认参数
默认参数也称为缺省参数,用于在定义函数时,为参数提供默认值,调用函数时,可以不传递有默认值的参数

注意:
- 默认参数必须放在没有默认值的参数列表的后面,一个函数在定义时是可以设置多个默认参数的
- 函数调用时,如果为默认参数传递了值,则会修改默认的参数值;如果没有传递该参数,则直接使用默认值
2.2.3 不定长参数
不定长参数也叫可变参数,用于函数定义及调用时参数个数不确定(0个或多个)的场景
类型:
- 位置传递
- 关键字传递
1. 不定长参数------位置传递

注意:
- 传递的所有匹配的位置参数都会被 args 变量收集,这些参数会合并封装为一个元组, args 是元组类型(注意并不会封装关键字参数)
- args 只是约定俗成的变量名,并不是关键字,这里可以使用任何合法的变量名(如 *data)
2. 不定长参数------关键字传递

注意:
- 参数是以 "键 = 值" 形式传递的关键字参数, 这些 "键 = 值" 参数都会被 kwargs 接收,并封装为一个字典类型
- kwargs 只是约定俗成的变量名,并不是关键字,这里可以使用任何合法的变量名(如 **options)
3. 小结

当不定长位置参数和不定长关键字参数同时存在的情况下,要先定义不定长位置参数,再定义不定长关键字参数
2.2.4 参数的类型
- 普通参数:数字,布尔,字符串,列表,元组,集合,字典等
- 特殊参数:函数

2.3 匿名函数
命名函数:定义的函数都有名字
匿名函数:指的是没有名称的函数 ,需要通过 lambda 表达式来声明函数,可以简化简单函数的编写**(单行表达式)**

注意:
- 由于 lambda 表达式是一个单行表达式,因此只能用于一些简单函数的定义
- 由于 lambda 表达式定义的匿名函数没有名字,因此需要在定义时将函数赋值给一个变量,这个变量本质就是一个简易函数
- 匿名函数中可以返回结果,也可以不返回结果。返回结果时,不需要写 return ,表达式的运行结果就是要返回的结果
匿名函数的使用场景: 函数逻辑比较简单(单行表达式)且只在一个地方使用时,可以考虑使用匿名函数,简化书写(通常作为高阶函数的参数使用),如下所示:

小结:
