函数的使用
将常用的代码以固定的格式封装(包装)成一个独立的模块,只要知道模块的名字就可以重复使用它,这个模块就叫做函数(Function)。函数的本质就是一段有特定功能、可以重复使用的代码,这段代码已经被提前编写好了,并且为其起一个“好听”的名字。内置函数,可以直接使用。自定义函数,将一段有规律的、可重复使用的代码定义成函数。
函数的使用大致分为 2 步,分别是定义函数和调用函数。
定义函数,也就是创建一个函数,可以理解为创建一个具有某些用途的工具。定义函数需要用 def 关键字实现:
def 函数名(参数列表):
//实现特定功能的多行代码
[return [返回值]] #可有可无
函数名:其实就是一个符合 Python 语法的标识符
参数列表:多个参数之间用逗号( , )分隔。无参数,也要留空的“()”,用 pass 语句作为占位符
[return [返回值] ]:整体作为函数的可选参参数,用于设置该函数的返回值。可有可无
调用函数也就是执行函数。压栈,函数调用本质就是将堆中的函数调用到栈中执行,这个过程被称为压栈,等函数执行完成,会立刻执行出栈(弹栈)。
[返回值] = 函数名([形参值])
返回值由return 语句完成,该返回值可以是任意类型。需要注意的是,return 语句在同一函数中可以出现多次,但只要有一个得到执行,就会直接结束函数的执行。
return [返回值]
返回值参数可以指定,也可以省略不写(将返回空值 None)。
函数的说明文档,本质就是一段字符串,只不过作为说明文档,字符串的放置位置是有讲究的,函数的说明文档通常位于函数内部、所有代码的最前面。
参数问题
函数参数的作用是传递数据给函数,令其对接收的数据做具体的操作处理。形式参数:在定义函数时,函数名后面括号中的参数就是形式参数。实际参数:在调用函数时,函数名后面括号中的参数称为实际参数,也就是函数的调用者给函数的参数。
实参和形参的区别,就如同剧本选主角,剧本中的角色相当于形参,而演角色的演员就相当于实参。
函数参数的传递方式可分为 2 种,分别为值传递和引用(地址)传递:
1、值传递:适用于实参类型为不可变类型(字符串、数字、元组);本质是传递数据值的拷贝,跟原先的那个值没有关系
2、引用(地址)传递:适用于实参类型为可变类型(列表,字典);本质是传递指针(地址),所以说实质操作的就是堆
区别是:函数参数进行值传递后,若形参的值发生改变,不会影响实参的值;而函数参数继续引用传递后,改变形参的值,实参的值也会一同改变。
默认参数,调用函数时如果不指定某个参数,Python 解释器会抛出异常。Python 允许为参数设置默认值,即在定义函数时,直接给形式参数指定一个默认值。
def 函数名(…,形参名,形参名=默认值):
代码块
注意:默认值的参数必须放在最后,否则会产生语法错误。传一个参数时默认第一个。
位置参数,也称必备参数,调用函数时传入实际参数的数量和位置都必须和定义函数时保持一致。(数量、位置)
可能因类型不同抛出 TypeError 异常或者导致运行结果和预期不符
关键字参数,指使用形式参数的名字来确定输入的参数值。通过此方式指定函数实参时,不再需要与形参的位置完全一致,只要将参数名写正确即可。
def dis_str(str1,str2):
print(“str1:”,str1)
print(“str2:”,str2)
#位置参数
dis_str(“http://python/”,“http://shell/”) #位置必须对应
#关键字参数
dis_str(“http://python/”,str2=“http://shell/”) #写一个参数名,但此时也要对应位置
dis_str(str2=“http://python/”,str1=“http://shell/”) #写两个参数名,可以不用对应位置
一个特殊的常量 None(N 必须大写)。和 False 不同,它不表示 0,也不表示空字符串,而表示没有值,也就是空值。空值并不代表空对象,即 None 和 []、“” 不同:属于 NoneType 类型。
>>> type(None)
<class ‘NoneType’>
不能再创建其它 NoneType 类型的变量(唯一的),但是可以将 None 赋值给任何变量。
作用域
作用域(Scope),就是变量的有效范围,就是变量可以在哪个范围以内使用。有些变量可以在整段代码的任意位置使用,有些变量只能在函数内部使用,有些变量只能在 for 循环内部使用。
局部变量:仅限于函数内部,出了函数就不能使用了
在函数体内定义局部变量
全局变量:既可以在各个函数的外部使用,也可以在各函数内部使用
定义全局变量的方式有以下 2 种:
1、在函数体外定义的变量,一定是全局变量
2、在函数体内定义全局变量。即使用 global 关键字对变量进行修饰后,该变量就会变为全局变量
特殊函数
globals() 函数为 Python 的内置函数,它可以返回一个包含全局范围内所有变量的字典
locals() 函数也是 Python 内置函数,通过调用该函数,我们可以得到一个包含当前作用域内所有变量的字典
vars() 函数也是 Python 内置函数,其功能是返回一个指定对象范围内所有变量组成的字典。如果无参数,vars() 和 locals() 的作用相同。
函数内部可以定义变量,产生了局部变量;同样函数内部定义函数,称为局部函数。默认局部函数只能在其所在函数的作用域内使用。
当局部函数定义的 变量遮蔽了全局函数定义的变量,用nonlocal 关键字解决。
闭包函数或者闭合函数,闭包中外部函数返回的不是一个具体的值,而是一个函数。一般情况下,返回的函数会赋值给一个变量,这个变量可以在后面被继续执行调用。
闭包比普通的函数多了一个 closure 属性,该属性记录着自由变量的地址。当闭包被调用时,系统就会根据该地址找到对应的自由变量,完成整体的函数调用。
lambda 表达式,又称匿名函数,常用来表示内部仅包含 1 行表达式的函数。如果一个函数的函数体仅有 1 行表达式,则该函数就可以用 lambda 表达式来代替。
name = lambda [list] : 表达式
适用于单行函数,或不需要多次复用的函数。