1、函数对象
比如说定义一个对象
def func(): #func = 内存地址
pass
print(func) #结果<function func at 0x00000226A64DB160>
func() #函数名()是函数的调用
func #就是一个变量名
2、函数的嵌套定义
def outter(): def warpper(): pass pass
3、名称空间与作用域
名称空间两大点
(1)名字的访问顺序:LEGB
L:代表当前所在的位置,函数内所在的位置
E:外层函数和全局之间的位置
G:全局
B:内置
(2)名称空间的嵌套定义关系是函数定义阶段扫描语法生成的,与调用位置无关
全局作用域:内置名称空间、全局名称空间
特点:全局存活,全局有效
局部作用域:局部名称空间
特点:临时存活,局部有效
global关键字:用在局部,修改全局的不可变类型的值
ps:难道就不能修改可变类型的值吗?
可变类型直接改就ok了。不用globa关键字
废话少说,上号!
案例1 dic = {'username':None} def login(): #dic = 123 #结果:开头是啥样,结果就啥样 dic['username'] = 'likk' login() print(dic) #结果{'username': None}
案例2 x = 100 def login(): global x x = 200 login() peint(x) #结果是200 你不信CTRL+V!!
关键字nonlocal def f1(): x = 100 def f2(): #global x #结果:开始x等于多少,现在也等于多少 x=100 nonlocal x x = 200 f2() print(x) f1()
两个案例的结果再一起发布一下,别再说我懒啦!
案例1 {'username': None} 案例2 200
*与**
*在形参中:会接收溢出的位置实参,然后将其存成元组,然后赋值给紧跟其后的变量名
**在形参中:**会接收溢出的关键字实参,然后将其存成字典,然后赋值给紧跟其后的变量名
*在实参中:*后跟的必须是一个可以被for循环遍历的类型,*会将实参打散成位置实参
**在实参中:**后跟的必须是一个字典,**会将实参打散成关键字实参
b话少说,上号!
dic = {'x':1,'y':2,'k':'lik'} def index(*args,**kwargs): print(*args) print(**kwargs) def outter(*args,**kwargs): index(*args,**kwargs) outter((1,2,3,4,5),dic)
结果
(1, 2, 3, 4, 5) {'x': 1, 'y': 2, 'k': 'lik'}