【0809 | Day 12】可变长参数/函数的对象/函数的嵌套/名称空间与作用域 可变长参数 函数的对象 函数的嵌套 名称空间与作用域 global nonlocal 可变类型

一、形参

位置形参

默认形参

二、实参

位置实参

关键字实参

三、可变长参数之*

def func(name,pwd,*args):
    print('name:',name,'pwd:',pwd)
    print(args)
    return 1
​
res = func('nick',12345,18,180,18000)
print(res)
​
#name: nick pwd: 12345
#(18, 180, 18000)
#1

四、可变长参数之**

def func(name,pwd,**kwargs):
    print('name:',name,'pwd:',pwd)
    print(kwargs)
    return 1
​
res = func('nick',12345,age = 18,height = 180,wage = 18000)
print(res)
​
name: nick pwd: 12345
{'age': 18, 'height': 180, 'wage': 18000}
1

五、*tuple的应用

def func(name,pwd,x,y,z):
    print('name:',name,'pwd:',pwd)
    print(x,y,z)
    return 1
​
tuple = (1,2,3)
res = func('nick',12345,*tuple)  #将tuple打散成位置实参传给位置形参
print(res)
​
name: nick pwd: 12345
1 2 3
1

六、**dict的应用

def func(name,pwd,x,y,z):
    print('name:',name,'pwd:',pwd)
    print(x,y,z)  #x, y, z必须和字典的key一一对应,若dict = {'a': 4,'b': 5,'c': 6},则print(a,b,c)
    return 1
​
dict = {'x':4,'y':5,'z':6}
res = func('nick',12345,**dict)  #将dict打散成关键字实参传给位置形参
print(res)
​
name: nick pwd: 12345
4 5 6
1

七、关于参数的应用

#例一
def func(x, y, f = 0, *args, **kwargs):
    print(f'f=',f)
    print(args)
    print(kwargs)
    return x + y
res = func(1, 2, 3, a = 4, b = 5, c=6)  #一一对应,此时默认形参f = 0接受位置实参3,args可以不接收值
print(res)
​
f= 3
()
{'a': 4, 'b': 5, 'c': 6}
3#例二
def func(x, y, f = 0, *args, **kwargs):
    print(f'f=',f)
    print(args)
    print(kwargs)
    return x + y
res = func(1, 2, a = 4, b = 5, c=6)   #一一对应,此时默认形参f = 0没有对应接收值,默认为0,args可以不接收值
print(res)
​
f= 0
()
{'a': 4, 'b': 5, 'c': 6}
3#例三
def func(x, y, f = 0, *args, **kwargs):
    print(f'f=',f)
    print(args)
    print(kwargs)
    return x + y
res = func(1, y = 2, a = 4, b = 5, c=6)    #关键字实参y = 2会自己找关键字y,1是位置实参一一对应
# res = func(y = 2, 1, a = 4, b = 5, c=6)  #一一对应,关键字实参一定要放在位置实参的后面,否则y=2赋给y,1对应的也是y,则会报错
print(res)
​
f= 0
()
{'a': 4, 'b': 5, 'c': 6}
3

 

函数的对象

  1. 引用

  2. 作为函数的参数

  3. 作为函数的返回值

  4. 作为容器元素

函数的嵌套

def f1():
    def f2():
        pass
f1()

 

名称空间与作用域

名称空间

内置名称空间

Python解释器启动的时候生成,如len/int/dict

全局名称空间

文件执行的时候生成

局部名称空间

函数调用的时候生成

执行顺序

内置 ---> 全局 --->局部

查找顺序

当前位置 --->局部 --->全局 --->内置

# 查找顺序:当前位置-->局部-->全局-->内置
x = 1
def f1():
    x = 2
    print(x)  #当前位置 结果: 2
f1()
​
x = 1
print(x)  #全局 结果: 1
def f1():
    x = 2
f1()
​
x = 1
def f1():
    x = 2
f1()
print(x) #全局 结果:1
​
x = 1
def f1():
    print(x) #局部没有x的值,去全局查找 结果:1
f1()

作用域

产生作用的范围

全局作用域

全局+内置名称空间中的变量

x = 1
def f1():
    x = 3
f1()
print(x)  
​
# 1    
x = 1 和 x = 3 两个x之间毫无关系   
 

局部作用域

局部名称空间的变量,不同的函数具有不同的作用域

def f1():
    x = 1
    def f2():
        x = 3
    print(x)
f1()
​
# 1
x = 1 和 x = 3的两个x毫无关系

注意:全局作用域和局部作用域互不干涉。

global

x = 1
def f1():
    global x  #声明x为全局x
    x = 3
f1()   
print(x)

nonlocal

针对嵌套局部函数

def f1():
    x = 1
    def f2():
        nonlocal x  #取代x = 1 
        x = 3
    print()
f1()
​
#3

可变类型

lt = [1,2,3]
​
def f1():
    lt.append(4)
    
f1()
print(lt)
​
#[1,2,3,4]

作用域关系:对于可变类型不适用,仅适用不可变类型。