函数
- 定义:函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
- 为什么需要函数:
- 复用代码;
- 隐藏实现细节;
- 提高可维护性;
- 提高可读性,便于调试;
函数的创建
- 语法格式:
def 函数名(形式参数): 函数体
- 函数代码块以def关键词开头,后接函数标识符名称和圆括号();
- 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数;
- 默认情况下,参数值和参数名称是按函数声明中定义的顺序匹配起来的;
- 函数的第一行语句可以选择性地使用文档字符串,用于存放函数说明;
- 函数内容以冒号:起始,并且缩进;
- 函数体中的return[表达式]用于结束函数,选择性地返回一个值给调用方,不带表达式的return相当于返回None;
函数的调用
- 语法格式:
变量=函数名(位置参数)
- 在调用列表时使用*在列表名前,可将列表中每个元素都转换为位置参数;
- 在调用字典时使用*在字典名前,可将字典中每个键值对都转换为关键字参数;
- 声明函数时,参数中星号*可以单独出现;如果单独出现星号*后的参数必须用关键字参数传入。
- 举例
def f(a,b,*,c): return a+b+c f(1,2,c=3) //正常运行,返回值为6 f(1,2,3) //报错
- 举例
参数类型
- 必需参数;
- 须以正确的顺序传入函数。调用时的数量必须和声明时的一样;
- 在调用函数时,不传参数就会报错;
- 关键字参数
- 关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值;
- 使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值;
- 默认参数
- 在编写函数时对关键字赋值,如果调用时没有重新赋值,那么函数将以编写时的值进行操作;
- 举例:
此时调用函数时如果不传入新的参数,则输出:def printinfo(name="Lee",age=24): "打印任何传入的信息" print("姓名:",name) print("年龄:",age) return
姓名:Lee 年龄:24
- 不定长参数
- 此类函数能处理比当初声明时更多的参数;
- 不定长位置参数同时只能存在一个;
- 当定义函数内有两种不定长参数存在时,位置参数(元组)在前,关键字参数(字典)在后;
- 语法格式:
- 生成元组:
- 是位置实参:形式为值;
def functionname([formal_args,] *var_args_tuple ): "函数说明" function_suite return [expression]
- 加了星号*的参数会以元组(tuple)的形式导入,存放所有未命名的变量参数。
- 举例
输出结果为:def printinfo( arg1, *vartuple ): "打印任何传入的参数" print ("输出: ") print (arg1) print (vartuple) # 调用printinfo 函数 printinfo( 70, 60, 50 )
70 (60, 50)
- 也可不对元组传输变量,在此情况下,该元组为空元组;
- 生成字典:
- 是关键字实参:形式为键值对;
- 与生成元组类似,加了两个星号**的参数会以字典的形式导入;
- 生成元组:
匿名函数
- 使用lambda来创建;
- 所谓匿名,即不再使用def语句这样标准的形式定义一个函数;
- lambda函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数;
- lambda函数不等同于C或C++的内联函数;
- 语法格式:
lambda [arg1 [,arg2,.....argn]]:expression
- 举例:
输出结果为:15x = lambda a : a + 10 print(x(5))
- 举例:
递归函数
- 定义:一个函数在函数体内调用了该函数本身,这个函数就称为递归函数。
- 组成部分
- 递归调用;
- 递归终止条件;
- 调用过程
- 每递归调用一次函数都会在栈内存分配一个栈帧;
- 每执行完一次函数,都会释放相应空间;
- 优缺点
- 优点:思路和代码简单;
- 缺点:占用内存多,效率低下;