python中的参数、全局变量及局部变量
1.位置参数、关键字参数、默认参数的使用
- 位置参数、关键字参数
1 def test(x,y,z): 2 print(x) 3 print(y) 4 print(z)
test(1,2,3) #位置参数,必须一一对应,缺一不行多一也不行
test(y=2,x=5,z=4) #关键字参数,无须一一对应,缺一不行多一也不行
*位置参数必须在关键字参数左边
# test(1,y=2,3)#报错
# test(1,3,y=2)#报错
# test(1,3,z=2,y=4)#报错
# test(z=2,1,3)#报错
# test(1,3,z=2)#True,一个参数不可多次赋值
- 默认参数
1 def test(x,type='sb'): 2 print(x) 3 print(type) 4 test('laowang') 5 #结果:laowang 6 # sb
2.参数组
- *列表、元组
1 def test(x,*args): 2 print(x) 3 print(args) 4 test(1) 5 #结果:1 6 # () 7 test(1,2,3,4,5) 8 #结果:1 9 # (2, 3, 4, 5) 10 test(1,{'name':'alex'}) 11 #结果:1 12 # ({'name': 'alex'},) 13 test(1,['x','y','z']) 14 #结果:1 15 # (['x', 'y', 'z'],) 16 '''*可把参数组遍历出来''' 17 test(1,*['x','y','z']) 18 #结果:1 19 # ('x', 'y', 'z') 20 test(1,*('x','y','z')) 21 #结果:1 22 # ('x', 'y', 'z')
- **字典
1 def test(x,**kwargs): 2 print(x) 3 print(kwargs) 4 test(1,y=2,z=3) 5 #结果:1 6 # {'y': 2, 'z': 3} 7 test(1,**{'a':4,'w':6}) 8 #结果:1 9 # {'a': 4, 'w': 6}
def test(x,*args,**kwargs): print(x) print(args,args[-1]) print(kwargs,kwargs.get('y')) test(1,1,2,1,1,11,1,x=1,y=2,z=3) #报错
还是前面说的,参数不可多次被赋值,最前面的位置参数1已经将形参中的x赋值了,后面又有一个位置参数x=1,想要再次将形参x赋值,所以会报错。
改正如下:
将位置参数删掉或者换一个不和形参冲突的
test(1,1,2,1,1,11,1,y=2,z=3) #结果:1 # (1, 2, 1, 1, 11, 1) 1 # {'y': 2, 'z': 3} 2
3.全局变量和局部变量
通常全局变量变量名大写,局部变量变量名小写
*******************************************************************global*******************************************************************
- 全局变量(不在函数内,顶格无缩进)
********************如果函数的内容无global关键字:全局变量只限访问,不能修改
1 name='dsy' 2 def change_name(): 3 name='太帅了' 4 change_name() 5 print(name) 6 #结果:dsy
********************如果函数的内容有global关键字:全局变量可以被修改
1 name='dsy' 2 def change_name(): 3 global name 4 name='太帅了' 5 change_name() 6 print(name) 7 #结果:太帅了
- 局部变量(不顶格,有缩进)
1 name='dsy' 2 def change_name(): 3 name='太帅了' 4 print(name) 5 change_name() 6 #结果:太帅了
1 name='dsy' 2 def change_name(): 3 print(name) 4 change_name() 5 #结果:dsy
在一个函数内执行某段程序,优先读取局部变量,如果没有局部变量,再读取全局变量,局部变量无法对全局变量进行覆盖、更改、替换。
*******************************************************************nonlocal*******************************************************************
1 name = "老段" 2 def laowang(): 3 name = "老陈" 4 def laoli(): 5 nonlocal name # nonlocal,指定上一级变量,如果没有就继续往上直到找到为止 6 name = "老李" 7 laoli() 8 print(name) 9 print(name) 10 laowang() 11 print(name) 12 #结果:老段 13 # 老李 14 # 老段
总结:在一个函数内打印一个变量,是由这一层向外一层一层的找变量名。
补充:在函数内对全局变量的引用是可以修改的
1 name = 'laowang' 2 male = {'age':14} 3 def test(): 4 def test1(): 5 name = 'laoli' 6 male['age'] = 99 7 return test1 8 res = test()() 9 print(name) #结果:laowang 10 print(male) #结果:{'age': 99}
打印顺序例子:
1 #执行顺序 2 name='老王' #1 3 def laozhang(): #2 4 name = "老张" #3.1 5 print(name) #3.2 第一次打印老张 6 def laoli(): #3.3 7 name = "老李" #3.4.1 8 print(name) #3.4.2 第二次打印老李 9 def laozhao(): #3.4.3 10 name = '老赵' #3.4.5.1 11 print(name) #3.4.5.2 第四次打印老赵 12 print(name) #3.4.4 第三次打印老李 13 laozhao() #3.4.5 14 laoli() #3.4 15 print(name) #3.5 第五次打印老张 16 laozhang() #3 17 '''结果:老张 18 老李 19 老李 20 老赵 21 老张'''