首页 > 其他分享 >形参与实参 和 名称空间

形参与实参 和 名称空间

时间:2023-03-07 18:34:52浏览次数:35  
标签:函数 形参 参与 名称 func print 实参 def

1.形参与实参的介绍

形参:在定义函数阶段定义的参数称之为形式参数(相当于变量名)
def func(x,y): #x=1  y=2
    print(x,y)
实参:在调用函数阶段传入的值,(相当于变量名)
func(1,2)

形参与实参的关系:
1.在调用阶段,实参(变量值)会绑定给形参(变量名)
2.这种绑定关系只能在函数体内使用
3.实参与形参的绑定关系在函数调用时生效,函数调用结束后解除绑定关系

2.形参与实参的具体使用

2.1 位置参数:按照从左到右的顺序依次定义的参数称之为位置参数
位置形参:按照从左到右的顺序直接定义的‘变量名’
                特点:必须被传值,多一个不行少一个不行
def func(x,y):
    print(x,y)
位置实参:按照从左到右的顺序依次传入的值
                特点:按照顺序与形参一一对应
func(1,2)  #x=1,y=2

 

2.2关键字参数
关键字实参:在函数调用阶段,按照key=value的形式传入值
        特点:指名道姓给某个形参传值,可完全不按照顺序
def func(x,y):
    print(x,y)   #func(y=2,x=1)

混合使用,强调:
1.位置实参必须放在关键字实参前  #func(1,y=2)
2.不能为同一个形参重复传值  #func(1,y=2,x=3  报错
2.3默认参数
默认形参:在定义函数阶段,就已经被赋值的形参
       特点:在定义阶段就已经被赋值,意味着在调用阶段可以不用为其赋值
def func(x,y=3):    #func(x=1)  x=1,y=3
        print(x,y)    #func(x=1,y=444)   x=1,y=444

位置形参与默认形参混用,强调:
1.位置形参必须在默认形参的左边
def func(y=2,x):
             pass
2.默认参数的值是在函数定义阶段被赋值的,准确的说被赋予的是值的内存地址
示范1:
m =2
def func(x,y=m):  #y=2的内存地址
    print(x,y)
m=33333
func(1)   #1  2
示范2:
m =[11,]
def func(x,y=m):  #y指向列表m的内存地址,列表是可变类型
    print(x,y)            值变内存地址不变
m.append(33)
func(1)      #1,[11,33]
3.虽然默认值可以指定任意类型的数据类型,但是不推荐使用可变类型
#函数定义遵循:函数的调用只跟函数本身有关系,不受外界代码的影响  
def func(x,y,l=None):
        if l is None:
            l = []
        l.append(x)
        l.append(y)
    print(l)
new_l = [11,22]
func(1,2,new_l)   #[11,22,1,2]
2.4 可变长度的参数(*与**的用法)
可变长度指在调用函数时,传入的值(实参)的个数不固定
实参是用来为形参赋值的,所以对应着,针对溢出的实参必须有对应的形参来接收
2.4.1可变长度的位置参数
1,*形参名:用来接收溢出的位置实参,
溢出的位置实参会被*保存成元组的格式然后赋值紧跟其后的形参名
                       *后可以跟任意名字,但是约定俗称为args 
def func(x,y,*args):
        print(x,y,args)
func(1,2,3,4,5,6)   #1  2  (3,4,5,6)
2.*可以用在实参中,实参中带*(*后面能被for循环就可以),先将*后的值打散成位置实参
def func(x,y,z):
    print(x,y,z)
func(*[11,22,33])  #func(11,22,33)
3.形参与实参中都在*
def func(x,y,*args):  
        print(x,y,args)
func(1,2,*[3,4,5])  # 1 2 (3,4,5)
2.4.2可变长度的关键字参数
1.**形参名:用来接收溢出的关键字实参,
**会将溢出的关键字实参保存成字典格式,然后赋值给紧跟其后的形参名
                **后可以跟任意名字,但是月额定俗称为kwargs
def func(x,y,**kwargs):
        print(x,y,kwargs)
func(1,y=2,a=3,b=4,)   #1  2  {a=3,b=4}
2.**可以用在实参中,实参中带**(**后跟着只能是字典),先将**后的值打散成位置实参
def func(x,y):
    print(x,y)
func(**{'x'=1,'y'=2})  #1  2
3.形参与实参中都在**
def func(x,y,**kwargs):
    print(x,y,kwargs)
func(**{'x'=1,'y'=2,'a'=3,'b'=4})  #1 2 {'a'=3,'b'=4}


混用*与**
*args必须在**kwargs之前

 

名称空间:

1.内置的名称空间: 在python解释器中存在的

2. 全局名称空间:在py文件中,定个写的代码都在全局名称空间中

name = 'kevin'
    if  True:
        a = 1
    while True:
        x = 10

3.局部名称空间: 只要在函数中出现都是局部的           #在函数体代码执行完产生的数据

存活周期
    # 内置的:伴随python解释器的启动/关闭而产生/回收
    # 全局的:伴随python文件的开始执行/执行完毕而产生/回收
    # 局部的:伴随函数的调用/结束而临时产生/回收

名字的查找顺序:

# 首先先确定你所在的位置
1. 如果在局部中:
    局部  >>>  全局 >>> 内置
2. 如果在全局中:
    全局 >>> 内置

 

函数的补充:

global与nonlocal 的使用

1. global:
   	局部修改全局的'不可变类型'的时候要使用global关键字声明
2. nonlocal
	内部的局部修改外部的局部的不可变类型的时候,需要使用nonlocal关键字声明 

函数对象(函数名)

1. 函数名可以当成变量赋值给别的变量
2. 函数名可以当成函数的实参
3. 函数名可以当成函数的返回值(如果全局想用局部的名字,return 出来)
4. 函数名可以做容器类型的元素值

def index():
    def func():
        pass
    return func
res=index() # func的内存地址
res()  # func()

'''函数名本质上就是函数的内存地址!!!!'''

 

标签:函数,形参,参与,名称,func,print,实参,def
From: https://www.cnblogs.com/whxx/p/17189111.html

相关文章