1 定义
一段代码的封装,实现代码的复用。
2 返回值
个数:0或n个
类型:不限
# a,b为两个数值数据,返回它们从大到小排列的结果
def maxmin(a,b):
if a>b:
return a,b
else:
return b,a
执行big,small = maxmin(2,4) 后,big=4,small=2。
3 参数
3.1 类型
1. 有限位:位置/关键字参数
2. 任意位:位置/关键字参数
默认为有限位置参数。
⚠注意:
①位置参数一定排在关键字参数前;
②有限位参数一定排在无限位参数前。
3.2 默认值
可以为函数中的参数设置默认值。
def func(a=1,b):
pass
3.3 位置参数(有限位)
def func(a,b):
print(a,b)
func(1,2)
⚠注意:若函数没有设置默认值,实参和形参需要一一对应;若有设置默认值,则可以缺省。
例子如下:
def func(a,b=1):
pass
func(2)
⚠注意:形参和实参从左往右对应,因此下面这样的做法是错误的:
def func(a=1,b):
pass
func(2)
数值2被传给a,b没有值,报错。
3.4 关键字参数(有限位)
以“key=value”的方式传参。
def func(a,b,c):
pass
func(1,b=2,c=3)
此时来看一下下面这个例子,犯了什么错呢?
def func(a,b,c):
pass
func(a=1,2)
错1:调用时,关键字参数用在了位置参数前。不要忘记,位置参数一定排在关键字参数前。
错2:没有给c传值。由于c没有默认值,所以在调用时必须传值。
3.5 任意位参数
任意位参数在函数定义中用星号表示,排在参数表的最后。
1. 任意位位置参数:用一个星表示,使用元组接收
2. 任意位关键字参数:用两个星表示,使用字典接收
# 任意位位置参数
def func1(a, *pa):
pass
# 任意位关键字参数
def func2(a, **pa):
pass
这两种参数可以单用,也可以混用。但混用时,要注意位置参数一定排在关键字参数前:
def func3(a, *pa1, **pa2):
pass
3.6 归纳一下
关于参数的顺序,请记住以下这个例子:
def func(a, b, c=2, *pa1, **pa2):
print(a, b, c, pa1, pa2)
func(2,b=1,d=5,e=8)
>> 输出:2 1 2 () {'d': 5, 'e': 8}
4 作用域
4.1 可变对象和不可变对象
- 可变对象:字典、序列
- 不可变对象:数值、元组、字符串
※改变数值类型时,会新开辟一个数据单元来存储新的值
在Python中,传入函数的是对象的引用。函数不能通过引用来改变不可变对象的值,但会通过引用改变可便对象的值。
若不想让函数改变可变对象的值,请传入对象的拷贝。
仅拷贝父对象:copy.copy
拷贝父对象和子对象:copy.deepcopy
4.2 作用域
- 全局名字空间
- 局部名字空间
- 内置名字空间
在某个局部作用域内,若有局部变量与全局变量重名,则优先使用局部变量。
可以用global关键字定义全局变量。
4.3 获取局部变量和全局变量
- 获取局部变量:locals()
获取全局变量:globals()※虽然教程上说可以获取,但实验发现并不是
上述函数以字典的形式返回参数名和参数值。借3.6的例子来说:
def func(a, b, c=2, *pa1, **pa2):
print(locals())
print(a, b, c, pa1, pa2)
func(2,b=1,d=5,e=8)
其中locals()的返回值如下:
{'a': 2, 'b': 1, 'c': 2, 'pa1': (), 'pa2': {'d': 5, 'e': 8}}
可以使用“[ ]”取到参数的值,如locals()['a']。请注意,locals()返回的是对象的拷贝,不能企图通过返回值修改原对象。