急救箱-python | 函数

本文详细介绍了Python函数参数的定义、返回值、参数类型(位置、关键字、默认值、任意位参数)、作用域(可变与不可变对象、全局与局部变量)以及如何获取局部和全局变量。强调了参数顺序的重要性,并通过实例解析了参数传递的规则以及作用域内的变量查找优先级。同时,探讨了如何避免函数对可变对象的意外修改,并提供了拷贝对象的方法。
摘要由CSDN通过智能技术生成

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=4small=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()返回的是对象的拷贝,不能企图通过返回值修改原对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值