函数
执行特定任务以完成特定功能的一段代码
函数的意义
- 代码复用
- 异常实现细节
- 提高可维护性
- 提高可读性、便于调试
函数的创建调用
创建方法
def 函数名 ([入参]):
函数体
[return xxx]
调用方法
函数名([实际参数])
示例
def add(a, b):
return a + b
res = add(10, 20)
print(res) # 30
函数的参数传递
位置实参
根据形参的位置进行实参传递,位置对应
def add(a, b): # a,b为形参,在函数的定义处
return a + b
res = add(10, 20) # 10,20为实参,在函数的调用处
print(res) # 30
关键字实参
根据形参的名称进行实参传递
def add(a, b): # a,b为形参,在函数的定义处
return a + b
res = add(b=10, a=20) # 10,20为实参,在函数的调用处
print(res) # 30
函数调用时的参数转化
列表元素转化为位置实参时,使用 *
字典元素转化为关键字实参时,使用 **
def fun(a, b, c):
print('a =', a, end='\t')
print('b =', b, end='\t')
print('c =', c, end='\t')
lst = [1, 2, 3]
# fun(lst) # 报错
fun(*lst) # a = 1 b = 2 c = 3
print()
dic1 = {'a': 100, 'b': 200, 'c': 300}
fun(a=10, b=20, c=30) # a = 10 b = 20 c = 30
print()
fun(**dic1) # a = 100 b = 200 c = 300
函数调用对参数的影响
def fun_demo(a, b):
print('arg1:', a) # arg1: 11
print('arg2:', b) # arg2: [1, 2, 3]
a = 100
b.append(10)
print('arg1:', a) # arg1: 100
print('arg2:', b) # arg2: [1, 2, 3, 10]
n1 = 11
n2 = [1, 2, 3]
print('n1:', n1) # n1: 11
print('n2:', n2) # n2: [1, 2, 3]
fun_demo(n1, n2)
print('n1:', n1) # n1: 11
print('n2:', n2) # n2: [1, 2, 3, 10]
可变对象受函数内部修改操作的影响。
不可变对象不受函数体内操作的影响。
函数的参数定义
函数定义默认值参数
函数定义时,给形参设置默认值,只有与默认值不符的情况才需要传递实参。
def fun(a, b=10):
print(a, b)
fun(100) # 100 10
fun(100, 200) # 100 200
个数可变的位置参数
定义参数时,无法确定传递的位置实参个数时,使用可变位置参数。
- 使用 * 定义个数可变的位置形参
- 参数结果为一个元组
- 个数可变的位置形参只能有一个
def fun1(*args):
print(args)
fun1(10, 20, 30) # (10, 20, 30)
fun1(10) # (10,)
个数可变的关键字参数
定义参数时,无法确定传递的关键字实参个数时,使用可变关键字参数。
- 使用 ** 定义个数可变的关键字形参
- 参数结果为一个字典
- 个数可变的关键字形参只能有一个
def fun2(**args):
print(args)
fun2(a=10, b=20, c=30) # {'a': 10, 'b': 20, 'c': 30}
fun2(a=10) # {'a': 10}
个数可变的位置形参和关键字可变的同时存在时,位置形参要放在关键字形参之前。
强制使用关键字传参
函数定义时,形参参数之间加入 * ,之后的参数在函数调用时,只能采用关键字传参的方式。
def fun(a, b, *, c, d):
print('a =', a, end='\t')
print('b =', b, end='\t')
print('c =', c, end='\t')
print('d =', d, end='\t')
fun(a=10, b=20, c=30, d=40) # a = 10 b = 20 c = 30 d = 40
fun(10, 20, c=30, d=40) # a = 10 b = 20 c = 30 d = 40
# fun(10, 20, 30, 40) # TypeError: fun() takes 2 positional arguments but 4 were given
函数定义时的形参的顺序问题
def demo1(a, b, *, c, d, **args):
pass
def demo2(*args, **args2):
pass
def demo3(a, b=10, *args, **args2):
pass
函数的返回值
函数的返回值为多个时,返回结果为元组。
def fun1(num):
odd = []
even = []
for item in num:
if item % 2 == 0:
odd.append(item)
else:
even.append(item)
return odd, even
arr = [1, 2, 3, 4, 5, 6]
b = fun1(arr)
print(b) # ([2, 4, 6], [1, 3, 5])
函数没有返回值时,return可以省略。
函数的返回值为1个时,返回其类型。
函数是否需要返回值,视情况而定。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。