【0809 | Day 12】可变长参数/函数的对象/函数的嵌套/名称空间与作用域
可变长参数
一、形参
位置形参
默认形参
二、实参
位置实参
关键字实参
三、可变长参数之*
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
函数的对象
-
引用
-
作为函数的参数
-
作为函数的返回值
-
作为容器元素
函数的嵌套
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]
作用域关系:对于可变类型不适用,仅适用不可变类型。