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         老张'''    

 

 

posted @ 2018-05-28 19:17  Asolitary  阅读(645)  评论(0编辑  收藏  举报