python笔记day15-函数参数补充、名称空间 作用域

函数参数补充

命名关键字参数(了解)

在定义函数是,*海购定义的参数,成为命名关键字参数

#命名官字子实参必须按照key=value的形式为其传值
def func(x,y,*args,a,b):#其中a和b称之为命名关键字参数
    print(x,y)
    print(a,b)
func(1,2,a=1111,b=2222)
#可以有默认值
def func(x,y,*args,a=1111,b):#其中a和b称之为命名关键字参数
    #不是默认形参不会报错
    print(x,y)
    print(a,b)
func(1,2,b=2222)
    

1 2
1111 2222
1 2
1111 2222

组合使用

位置形参+默认形参+*args、+默认关键字+**kargs
几乎没有应用场景

def func(x,y=111,*args,z,**kargs):
    print(x)
    print(y)
    print(args)
    print(z)
    print(kargs)
def func(x,y,z,a,b,c):
    print(x,y,z,a,b,c)
func(1,*[2,3],**{'b':555,'c':666},a=444)

1 2 3 444 555 666

1.名称空间nameapce

  • 栈区存放的变量名划分
    有名称空间后就可以在栈区中存放相同的名字

1.1内置名称空间

存放的名字:存放的python解释器内置的名字
存活周期:python解释器启动产生,关闭销毁

1.2全局名称空间

存放的名字:运行顶级代码产生的名字,不是函数内定义的也不是内置的
存活周期:python文件执行产生,运行完销毁

def func():#其中func是顶级 a,b是函数内局部
    a=111
    b=222
class fOO:#FOO是顶级,内部是局部
    pass

1.3局部名称空间

存放的名字:在调用函数时,运行函数体代码过程中产生的函数内的名字
存货周期:调用时存活,第哦啊用完毕后则销毁

1.4 名称空间加载顺序

内置名称空间》全局名称空间》局部名称空间
销毁顺序
局部》全局》内置

def func(a,b):
    pass
func(1,1)#调用一次创建销毁一次名称空间
func(2,2)

1.5 名字查找优先级

从当前所在空间向上一层一层查找
如果当前在全局-则从全局开始找-找不到找内置-再找不到报错

input=333
def func():
    input=444
    print(input)
func()
print(input)
a=[1,]
444
333
#示范
def func():
    print(x)
x=111
func()
#示范2:名称空间嵌套关系是以函数定义阶段为准,与调用位置无关
x=1
def func():
    print(x)
def foo():
    x=222
    func()
foo()
111
1
#示范3 函数嵌套定义
input=111
def f1():
    input=222
    def f2():
        input=333
        print(input)
    f2()
f1()

#示范4 定义阶段为准
x=111
def func():
    print(x)#报错-识别成局部x 但运行前还没有定义 所以报错
    x=222
func()
333



---------------------------------------------------------------------------

UnboundLocalError                         Traceback (most recent call last)

Cell In[30], line 16
     14     print(x)#报错-识别成局部x 但运行前还没有定义 所以报错
     15     x=222
---> 16 func()


Cell In[30], line 14, in func()
     13 def func():
---> 14     print(x)#报错-识别成局部x 但运行前还没有定义 所以报错
     15     x=222


UnboundLocalError: cannot access local variable 'x' where it is not associated with a value

作用域 作用范围

全局作用域
1.全局存活:内置名称空间、全局名称空间
2.全局有效:被所有函数共享
局部作用域:局部名称空间的名字
1.临时存活
2.局部有效:函数内有效
内置 全局 作用在全局
局部名称空间 作用在局部

def foo():
    x=111
    print(x)
def bar():
    y=222
    print(y)
foo()
bar()
#LEGB
#Basic
#Global
def f1():
    #e
    def f2():
        #e
        def f3():
            #local
            pass

global 和nonglobal

x=111
def func():
    x=222
    print(x)
func()
print(x)

x=111
def func():
    global x#指定x为全局 不可变类型
    x=222
    print(x)
func()
print(x)
222
111
222
222
#可变类型
l=[111,222]
def func():
    l.append(2)
    print(l)#当前local没有从global找到这个可变类型
func()
print(l)
[111, 222, 2]
[111, 222, 2]

nonlocal 了解

x=0
def f1():
    x=11
    def f2():
        global x#修改成全局
        x=22
    f2()
    print(x)
f1()
print(x)

x=0
def f1():
    x=11
    def f2():
        nonlocal x#修改函数外层函数的不可变类型 
        #向外层找直到找到 没有则报错
        x=22
    f2()
    print(x)
f1()
print(x)
11
22
22
0
#可变类型
def f1():
    x=[]
    def f2():
        x.append(11111)
    f2()
    print('f1内的x',x)

f1()
f1内的x [11111]
posted @ 2025-03-18 21:50  anozzz  阅读(23)  评论(0)    收藏  举报