第14课 再识函数
一、变量的作用域
1、函数的作用域
1)全局变量在函数外部
>>> x = 2 # 全局变量 >>> def func(): x = 9 # 局部变量 print('this x is in the func:-->', x) # 执行结果 >>> func() this x is in the func:--> 9 >>> print('this x is out of func:-->', x) this x is out of func: -->2
2)局部变量:在函数内部,生命周期只有在函数内部里面
>>> def func(): x = 9 print('x为局部变量,只能在函数内部调用', x) >>> func() x为局部变量,只能在函数内部调用 9 >>> print('在函数外部调用局部变量x', x) Traceback (most recent call last): File "<pyshell#5>", line 1, in <module> print('在函数外部调用局部变量x', x) NameError: name 'x' is not defined
3)全局变量在函数内部可以被引用
4)在函数内部修改全局变量,使用global关键字
>>> def func(): global x # 使用global后,x为全局变量 x = 9 print('x为全局变量!') >>> func() x为全局变量! >>> print('打印全局变量x的值:', x) 打印全局变量x的值: 9
二、可缺省参数
1、必填参数:def func(a, b),其中a和b为必填参数,如果不填的话,程序将报错。
>>> def func(a, b): print(a, b) >>> func(68) # 参数缺一不可 Traceback (most recent call last): File "<pyshell#16>", line 1, in <module> func(68) TypeError: func() missing 1 required positional argument: 'b'
2、可缺省参数:def func(a, b = 0):
1)形参变量 = 值:b = 0 是默认参数;
就是不传这个值的时候,默认给的参数
如果传实际的实参,b = 实参
>>> def func(a, b = 0): print(a, b) >>> func(68) # 因为b是可缺省参数,有默认值0,所以这里可以给b的值,也可以缺省 68 0
2)传实参
>>> def func(a, b = 0): print(a, b) >>> func(68, 99) # 重新给b赋值 68 99
3)在一定程度上可以方便程序员调用---少给参数
4)可缺省参数定义的时候一定在必填参数后面,否则会报错
错误的写法
>>> def func(a = 0, b): print(a, b) SyntaxError: non-default argument follows default argument
正确的写法
>>> def func(a, b =0): print(a, b) >>> func(68, 99) 68 99
或者可以这样写
>>> def func(a = 1, b =2): print(a, b) >>> func(5, 6) 5 6
三、可变数量参数
1、数量可变
>>> def calc(numbers): total = 0 for n in numbers: total = total + n * n return total >>> print(calc([1,2,3,4,5,6])) # 括号里是一个列表 91
2、提升函数的兼容性---扩展性/通用性
>>> def calc(numbers): total = 0 for n in numbers: total = total + n * n return total >>> print(calc((1,2,3,4,5,6))) # 括号里是一个元组,因为numbers是一个参数,所以calc()里面也应该是一个参数;这里的(1,2,3,4,5,6)是一个元组,把元组当做一个参数 91
3、在形参变量前面加一个星号(*)---然后numbers就变成一个元组
def calc(*numbers):
print(type(*numbers))-----tuple元组
def calc(*numbers): print(type(numbers)) total = 0 for n in numbers: total = total + n * n return total print(calc(1,2,3,4,5,6,7,8,9)) # 注意,这里calc后面是一个括号,可以直接在calc里面写,而不用calc(())的形式。因为numbers是一个元组,calc()括号里面就是元组的元素 # 执行结果 <class 'tuple'> 285
4、如果传入的是一个元组或者列表-----在元组或列表名前面加*---或者称为解包
>>> tul = [1,2,3,5,7,9] >>> def calc(*numbers): total = 0 for n in numbers: total = total + n * n return total >>> print(calc(*tul)) # 解包 169
1)如果可变数量参数在默认参数之前,则默认参数只能使用默认值。因为可变数量参数是不固定的,除了关键字参数,后面的都会被可变数量参数引用
>>> def func(a, *numbers, c = 100): print(a) print(numbers) print(c) >>> >>> func(2,3,4,5,6,7) 2 (3, 4, 5, 6, 7) 100 # 只能引用默认值
2)这样写,可以不用引用默认值
>>> def func(a, b = 188, *numbers): print(a) print(b) print(numbers) >>> func(1,2,3,5,6,7,8,9) 1 2 # b引用新值2 (3, 5, 6, 7, 8, 9)
四、关键字可变数量参数
1、有关键字
2、可变数量
3、定义:**arg
1)print(type(arg))------<class 'dict'>
2)键值对
3)传入值:变量 = 值
>>> def func(a, b = 188, *numbers, **args): # **args--关键字可变数量参数 print(a) print(b) print(numbers) print(type(args)) print(args) >>> func(123,5678,9,10,12,156789, name = 'linda') 123 5678 (9, 10, 12, 156789) <class 'dict'> {'name': 'linda'} # 字典类型
4、如果传入的是字典:**dict1------关键字可变数量参数的解包
>>> dict1 = {'name': 'Tom', 'age': 18} >>> tup1 = (3,5,6,7,8,9) >>> def func(a, b = 123, *numbers, **args): print(a) print(b) print(numbers) print(args) >>> func(123, 111, *tup1, **dict1) # **args 关键字可变数量参数的解包 123 111 (3, 5, 6, 7, 8, 9) {'name': 'Tom', 'age': 18}
五、综合使用:必填参数、缺省参数、可变参数和关键字可变参数
def func(a, b, c =168, *arg, **kw): print(a) print(b) print(c) print(arg) print(kw) func(123, 5, 6, 7, 8, 9, 88, 899, name = 'Tom', age = 18) # 字典在这里赋值时,key不用加冒号。 # 执行结果 123 5 6 (7, 8, 9, 88, 899) {'name': 'Tom', 'age': 18}