参数与名称空间

位置参数

位置形参:指的是定义函数时括号定义的参数,即变量名

​ 在定义函数时,按照从左到右的顺序依次定义的参数,称为位置形参

特性:位置形参必须被传值,多一个不行少一个也不行

位置实参:指的是在调用函数时括号内传入的值,即变量名

​ 在调用函数时,按照从左往右的顺序依次传入的值,称为位置实参

特点:与形参一一对应,顺序乱了,实参赋值也会乱

img

'''在调用函数时,实参的值会传给形参,这就是一个变量的赋值操作'''

默认形参和关键字实参

  1. 默认参数(形参):在定义函数时,就可以被赋值的参数,称为默认形参

  • 在定义阶段已经被赋值,意味着在调用阶段就可以不用传值
  • 默认参数必须跟在位置形参的后面,否则就会报错
  • 默认参数的值只在定义阶段被赋值一次就固定死了,定义之后改变没有影响
  • 默认参数的值应该设置成不可变类型

(1)、在定义阶段已经被赋值,意味着在调用阶段就可以不用传值

def foo(x,y,z=3):
    print(x,y,z)
 
foo(1,2)
 
#返回值
1 2 3

(2)、默认形参跟在位置形参的前面,报错

ef foo(y=1,x):
    pass
 
#报错
SyntaxError: non-default argument follows default argument

(3)、默认参数的值只在定义阶段被赋值一次就固定死了,定义之后改变没有影响

m=10
def func(x,y=m):
    print(x)
    print(y)
m=1111111
func(1)
 
#返回值
1
10

(4)、默认参数的值应该设置成不可变类型

#这种方式列表的值每次都会发生不可预料的变化,不建议这么做
def func(name,hobby,l=[]):
    l.append(hobby)
    print(name,l)
 
func('egon','read')
func('alex','play')
 
#返回值
egon ['read']
alex ['read', 'play']
 
#正确姿势
def func(name,hobby,l=None):
    if l is None:
        l=[]
    l.append(hobby)
    print(name,l)
 
func('egon','read')
func('alex','play')
 
#返回值
egon ['read']
alex ['play']
  1. 关键字实参:在调用函数时,按照key=value的形式定义的实参,称为关键字实参
特点:可以完全打乱顺序,但仍然能指名道姓的为指定的参数传值
def foo(x,y,z):
    print(x,y,z)
 
foo(x=1,y=2,z=3)
 
#返回值
1 2 3

可变长参数

可变长参数:指的是在调用函数时,传入的参数个数可以不固定
调用函数时,传值的方式无非两种,一种是位置实参,另一种是关键字实参,因此形参也必须得有两种解决方法,以此来分别接收溢出来的位置实参(*)与关键字实参(**)

形参之*

形参中的会溢出来的位置实参全部接收,然后存储元组的形式,然后把元组赋值给后的参数。需要注意的是:*后的参数名约定俗称成为args。

def sum_self(*args):
    res = 0
    for num in args:
        res += num
    return res


res = sum_self(1, 2, 3, 4)
print(res)
10

形参之**

形参中的会将溢出的关键字形参全部接收,然后存储字典的形式,然后把字典赋值给后的参数。需要注意的是:**后的参数名约定俗称为kwargs。

def func(**kwargw):
    print(kwargw)


func(a=5)
{'a': 5}

实参之*

实参中的*,会将后产生的值循环取出,打散成位置实参。以后但凡碰到实参中带 *的,它就是位置实参,应该马上打散成位置实参去看。

def func(x, y, z, *args):
    print(x, y, z, args)


func(1, *(1, 2), 3, 4)
1 1 2 (3, 4)
1
2
3
4
5
6

实参之**

实参中的**,会将后参数的值循环取出,打散成关键字实参。以后但凡碰到实参中带 * *的,它就是关键字实参,应该马上打散成关键字实参去看。

def func(x, y, z, **kwargs):
    print(x, y, z, kwargs)


func(1, 3, 4, **{'a': 1, 'b': 2})
1 3 4 {'a': 1, 'b': 2}

名称空间

名称空间就是用来存储变量名与数据值绑定关系的地方(我们也可以简单的理解为就是存储变量名的地方)
名称空间 存放名字 存货周期
内置名称空间 存放的是python解释器内置的名字 python解释器启动后产生,关闭后回收
全局名称空间 不是函数内定义,也不是内置的,剩下的都是全局名称空间的名字 执行python文件时产生,python文件运行完成后回收
局部名称空间 在调用函数时,运行函数体代码的过程中生产的函数内的名字 在调用函数时生产,在函数用完毕后回收

名字查找顺序

涉及到名字查找,要搞清楚自己在哪个空间

  1. 当我们在局部名称空间中的时候

    ​ 局部名称空间 >>> 全局名称空间 >>> 内置名称空间

  2. 当我们在全局名称空间中的时候

    ​ 全局名称空间 >>> 内置名称空间

    image-20221010194610556.png

    img

posted @ 2022-10-10 19:51  吴仁耀  阅读(52)  评论(0)    收藏  举报