函数是可重复使用、实现特定功能的代码段。
定义函数时不会执行函数,函数调用时才会执行。
定义函数
使用def语句定义函数,括号里可定义参数,
函数体内缩进,至少有一句语句代码,若没有可用pass占位。可以有return语句,
函数体内第一句语句之前可以注释函数说明(help(函数名)可查看函数说明)。
def 函数名():
语句 ...
def 函数名(参数):
""" 函数说明 """
语句 ...
return 表达式
# 空函数:pass占位,否则报错
def 函数名():
pass
return语句
- 没有return语句,默认返回None(即没有返回值)。执行完最后一个语句后,退出函数。
- 有return语句,返回值为表达式结果,多个返回值可用元组。执行了return语句,退出函数。
- 只有return,没有表达式,返回None。执行了return语句,退出函数。
参数 【函数可以有参数,也可以没有参数,按需要定义】
定义函数时 (形参) | 函数调用时 (实参) | |
必需参数 | 没有默认值。也称位置参数。 | 必须有该参数。可用其定义的关键字指定 |
可选参数 | 有默认值。也称默认参数。 一定在必需参数后面 | 若有该参数,用其定义的关键字指定。 若没有,将使用默认值。 |
不定长参数 | *args(args可自定义) 表示位置参数 | 多个未命名的变量参数。 在函数体内以元组形式呈现 |
不定长参数 | **kwargs(kwargs可自定义) 表示关键字参数 | 多个命名的变量参数(或者**字典名)。 在函数体内以字典形式呈现 |
函数调用时,多个必需参数,需注意:(注:用关键字指定的参数,也称关键字参数)
1、必需参数,与定义时的位置保持一致,且一定在关键字参数之前;
2、若必需参数使用关键字指定,定义在其后面的所有参数一定也用关键字指定;
3、只要是关键字参数(不论定义时是必需还是可选),它们之间的位置可以任意,但一定在必需参数(没有用关键字指定)的后面。
调用函数 【必须有圆括号】
函数名( )
函数名(参数1, 参数2, ...)
函数作用域
LEGB规则:(Local -> Enclosed -> Global -> Built in)
查找变量/"名称"时的规则,先在函数或类的方法内部,然后嵌套函数,再模块的全局变量,最后在Python内置模块, 没有则报错“NameError”。
嵌套函数中,若在内层函数修改并使用外层函数的变量,内层函数内使用nonlocal先声明:nonlocal 变量名。
若在函数内修改并使用全局变量,函数体内使用global先声明:global 全局变量。
使用 nonlocal、global 需注意,避免影响其他使用该变量的代码执行结果。
标准函数
abs、round、int、float、str、print、input等。
print 【标准输出函数。将其参数打印在控制台。】
打印时多个参数默认中间空格隔开,可用sep关键字参数修改分隔字符。
默认打印结束会使用换行,可用end关键字参数修改结束字符。
没有参数,为换行。
input 【标准输入函数。等待用户通过键盘输入文本。】
有一个可选参数,用于提示用户输入。返回字符串。
递归函数
1、执行函数的过程中,调用自身函数;
2、必须有终止条件,避免无限递归,陷入死循环;
3、若规模很大,运行效率不高,可用尾递归优化一般递归;
4、尾递归:特殊的递归函数。最后一步没有任何其他运算,只是调用自身函数。
Python解释器不支持尾递归优化,可以通过其他方式手动实现。
# 递归,简单样式
def 函数名(参数):
if 终止条件:
return 表达式
else:
return 函数名(新参数)
# 函数调用
函数名(参数)
嵌套函数
1、函数内有另一个函数;
2、一般的嵌套函数,内层函数需要在外层函数中调用;
3、闭包是特殊的嵌套函数:
- 外层函数返回的是内层函数名(无括号);
- 内层函数可使用外层函数的参数和变量;
- 外层函数调用后得到返回的内层函数再调用(即执行内层函数);
- 可用于编写惰性求值或延迟求值的代码,也可用于在一系列函数调用中保持某个状态。
# 闭包,简单样式
def 函数名1():
def 函数名2():
语句...
return 函数名2
# 函数调用
变量名 = 函数名1() # 获得返回的内层函数
变量名() # 执行内层函数
高阶函数
1、函数的参数接收变量,也接收另一个函数(无括号);
2、可以把接收的函数作为结果值返回;
3、常用高阶函数:
参数 | 返回 | 说明 | |
map | 函数、可迭代对象 | 可迭代对象 | 每个元素依次调用函数进行处理 |
functools.reduce | 函数、可迭代对象 | 值 | 每个元素依次调用函数进行累积计算 |
filter | 函数(返回布尔类型)、可迭代对象 | 可迭代对象 | 每个元素依次调用函数进行判断,筛选出符合条件的元素 |
sorted | 可迭代对象、key函数、reverse(布尔类型) | 可迭代对象 | 每个元素依次调用函数,根据key函数结果进行排序 |
匿名函数:lambda
1、语法:lambda 参数 : 表达式
2、没有函数名;只有一个表达式;没有return语句,但有返回值(即表达式的结果)
3、可以多个参数,lambda 参数1, 参数2 : 表达式
也可以没有参数,lambda : 表达式
也可以是默认参数,lambda 参数=值: 表达式
也可以不定长参数,lambda *args, **kwargs: 表达式
4、使用:与高阶函数配合使用、赋值给变量(作为普通函数使用)
若需要赋值,建议使用 def 定义函数 而不是lambda。
# 与高阶函数配合使用。例如:map
list(map(lambda x:x**2, [3,4,5,3,6])) # 返回:[9, 16, 25, 9, 36]
# 赋值给变量(作为普通函数使用)
square = lambda x:x**2
square(3) # 返回:9
[square(x) for x in [3,4,5,3,6]] # 返回:[9, 16, 25, 9, 36]