一。参数
1.实参
2.形参
从形参的角度分类:
1)位置参数
2)默认参数
参数陷阱 def func(x,l = []): l.append(x) print(l) func('alex') func('wusir') # 输出结果: # ['alex'] # ['alex', 'wusir']
3)动态参数(*args ,**kwargs)
def func(*args): print(args) func(1,2,4) #输出结果:(1, 2, 4) def func(**kwargs): print(kwargs) func(x = 1,y = 'alex',z = [1,2,3,]) #输出结果:{'x': 1, 'y': 'alex', 'z': [1, 2, 3]} def func(a,b,*args,sex = '男',**kwargs): print(a) #1 print(b) #alex print(args) #('asd', [1, 2, 3, 4]) print(sex) #女 print(kwargs) #{'name': 'taibai', 'age': 24} func(1,'alex','asd',[1,2,3,4,],sex = '女',name = 'taibai',age = 24 ) # 魔法运算: def func(*args): print(args) li = [1,2,3] l2 = [4,5,6] func(li) #输出结果:([1, 2, 3],) func(*li) #输出结果:(1, 2, 3) func(*li,l2) #输出结果:(1, 2, 3, [4, 5, 6]) func(*li,*l2) #输出结果:(1, 2, 3, 4, 5, 6) def func(*args,**kwargs): print(args) print(kwargs) func(*[1,2,3],*{'name':'alex','age':18},**{'name2':'taibai','age2':24},name3 = 'wusir') # 输出结果: # (1, 2, 3, 'name', 'age') # {'name2': 'taibai', 'age2': 24, 'name3': 'wusir'}
二。名称空间(命名空间)
1)全局命名空间
2)局部命名空间
3)内置命名空间:存放了python解释器为我们提供的名字:input,print,str,list,tuple...它们都是我们熟悉的,拿过来就可以用的方法。
三种命名空间之间的加载与取值顺序:
加载顺序:内置命名空间(程序运行前加载)->全局命名空间(程序运行中:从上到下加载)->局部命名空间(程序运行中:调用时才加载)
取值顺序:
在局部调用:局部命名空间->全局命名空间->内置命名空间
在全局调用:全局命名空间->内置命名空间
综上所述,在找寻变量时,从小范围,一层一层到大范围去找寻。
三。作用域
作用域就是作用范围,按照生效范围可以分为全局作用域和局部作用域。
1)全局作用域:包含内置名称空间、全局名称空间,在整个文件的任意位置都能被引用、全局有效
2)局部作用域:局部名称空间,只能在局部范围内生效
globals和locals方法
name = 'wusir' def func(): name = 'alex' print(name) print(globals()) #全局作用域 print(locals()) #局部作用域 func() # 输出结果: # alex # {'__name__': '__main__', '__doc__': " def func(x,l = []): l.append(x) print(l) func('alex') func('wusir') 输出结果: ['alex'] ['alex', 'wusir'] def func(*args): print(args) func(1,2,4) #输出结果:(1, 2, 4) def func(**kwargs): print(kwargs) func(x = 1,y = 'alex',z = [1,2,3,]) #输出结果:{'x': 1, 'y': 'alex', 'z': [1, 2, 3]} def func(a,b,*args,sex = '男',**kwargs): print(a) #1 print(b) #alex print(args) #('asd', [1, 2, 3, 4]) print(sex) #女 print(kwargs) #{'name': 'taibai', 'age': 24} func(1,'alex','asd',[1,2,3,4,],sex = '女',name = 'taibai',age = 24 ) # 魔法运算: def func(*args): print(args) li = [1,2,3] l2 = [4,5,6] func(li) #输出结果:([1, 2, 3],) func(*li) #输出结果:(1, 2, 3) func(*li,l2) #输出结果:(1, 2, 3, [4, 5, 6]) func(*li,*l2) #输出结果:(1, 2, 3, 4, 5, 6) def func(*args,**kwargs): print(args) print(kwargs) func(*[1,2,3],*{'name':'alex','age':18},**{'name2':'taibai','age2':24},name3 = 'wusir') # 输出结果: # (1, 2, 3, 'name', 'age') # {'name2': 'taibai', 'age2': 24, 'name3': 'wusir'} ", '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000209D3A8A4E0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/python10/day10/02博客.py', '__cached__': None, 'name': 'wusir', 'func': <function func at 0x00000209D3B58B70>} # {'name': 'alex'}
3)global关键字,nonlocal关键字
globals:
1)声明一个全局变量。
2)在局部作用域想要对全局作用域的全局变量进行修改时,需要用到 global(限于字符串,数字)
ps:对可变数据类型(list,dict,set)可以直接引用不用通过global
nonlocal
1)不能修改全局变量。
2)在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,并且引用的哪层,从那层及以下此变量全部发生改 变。
def add_b(): b = 42 def do_global(): b = 10 print(b) def dd_nonlocal(): nonlocal b b = b + 20 print(b) dd_nonlocal() print(b) do_global() print(b) add_b() # 输出结果: 10 30 30 42
四。函数的嵌套
print(1) def fun2(): print(2) def fun3(): print(6) print(4) fun3() print(8) print(3) fun2() print(5) 输出结果: 1 3 2 4 6 8 5