Python day 10 函数的进阶

  从形参角度,昨天我们讲了位置传参要按顺序一一对应,默认传参,默认参数在位置参数后面,今天接着昨天说的还有动态参数。

  今天我们主要讲动态参数 *args  **kwargs 

        形参角度最终顺序:位置参数,*args,默认参数,**kwargs

*args  动态参数,万能参数。接受的就是实参对应的所有位置参数,并将其放在元组中。形参对应顺序:  位置参数,*args,默认参数

**kwargs 动态传参,他将所有的关键字参数(无意义的)放到一个字典中。

1 def func(a,b,c,**kwargs):
2     print(kwargs)
3 func(1,2,r=4,b1=5,c1=6,c=7)
View Code
1 def func(a,b,c,d,*args,e='男‘,**kwargs):
2     print(a)
3     print(b)
4     print(c)
5     print(d) 
6     print(args)
7     print(e)
8     print(kwargs)
9 func(1,2,3,4,5,6,7,v=3,m=7,h=9,e='女‘)
View Code

*的魔法运用

在函数的调用执行时,
*可迭代对象,代表打散(list,tuple,str,dict(键))将元素一一添加到args。
**字典,代表打散,将所有键值对放到一个kwargs字典里。
在函数定义时, *args,**kwargs代表的是聚合。
 1 def func(*args):
 2     print(args)
 3 l1 = [1,2,30]
 4 l2 = [1,2,33,21,45,66]
 5 tu = (1,2,3)
 6 func(1,2,30,1,2,33,21,45,66)
 7 func(*'qweqrfdsaf')
 8 func(*{'name':'alex',"age":12})
 9 func(*l1,*l2)
10 
11 
12 
13 def func(*args):
14     print(args)
15 func(1,2,3,10,20,80)
16 
17 def func(**kwargs):
18     print(kwargs)
19 
20 dic1 = {'name1':'alex','age1':46}
21 dic2 = {'name':'老男孩','age':56}
22 func(**dic1,**dic2)
*的魔法运用

 

名称空间(命名空间),临时名称空间,内置名称空间。
全局名称空间,名称空间,命名空间,全局命名空间。
局部命名空间,临时名称空间,临时命名空间,局部名称空间,。
内置名称空间,所有的内置函数等存储的空间。
加载顺序:
内置名称空间 ---> 全局名称空间--->(函数执行时)局部名称空间。
取值顺序:
函数执行时:局部名称空间 -->全局名称空间 -->内置名称空间
 1 a = 4
 2 b = 3
 3 c = [1,2,3,4]
 4 c1 = {'name':'alex'}
 5 
 6 def func1():
 7     name = '老男孩'
 8     print(name)
 9 func1()
10 当执行函数的时候,他会在内存中开辟一个临时名称空间,存放函数体内的所有变量与值的关系,
11 随着函数的执行完毕,临时空间自动关闭。
12 input(),print(),len 内置函数
13 
14 name = '老男孩'
15 def func1():
16     name = 'taibai'
17     print(name)
18 func1()
19 def my_len(argv):
20     return 666
21 print(len([12,3,]))
22 a = 2
23 print(a)
24 def func1():
25     age = 11
26     print(age)
View Code

函数的嵌套

函数什么时候执行? 函数调用的时候执行。
代码从上至下依次执行, 调用函数:函数里面从上至下依次执行。
 1  函数什么时候执行? 函数调用的时候执行。
 2 # 代码从上至下依次执行, 调用函数:函数里面从上至下依次执行。
 3 # print(111)
 4 # def func1():
 5 #     print(333)
 6 #
 7 # def func2():
 8 #     print(444)
 9 #
10 # def func3():
11 #     print(555)
12 #     func2()
13 #
14 # func1()
15 # print(222)
16 # 111 333 222
17 
18 # print(111)
19 # def func1():
20 #     print(333)
21 #     func2()
22 #     print(666)
23 #
24 # def func2():
25 #     print(444)
26 #
27 # def func3():
28 #     print(555)
29 #
30 # func1()
31 # print(222)
32 # 111 333 444 666 222
33 
34 
35 # print(111)
36 # def func1():
37 #     print(333)
38 #     func2()
39 #     print(666)
40 #
41 # def func2():
42 #     print(444)
43 #     func3()
44 #
45 # def func3():
46 #     print(555)
47 #
48 # func1()
49 # print(222)
50 # 111 333 444 555 666 222
51 
52 # a = 2
53 # b = 3
54 # def func1():
55 #     c = 5
56 #     d = 6
57 #     print(globals())  # 全局变量放在一个字典中
58 #     return locals()  # {'c': 5, 'd': 6}
59 # print(func1())
60 
61 # print(globals())  # 全局名称空间:所有变量
62 # print(locals())  # 局部名称空间:所有变量
View Code
locals(),golbals()
locals()全局名称空间:所有变量放在一个列表
golbals()局部名称空间:所有变量放在一个列表
 1 a = 2
 2 b = 3
 3 def func1():
 4     c = 5
 5     d = 6
 6     print(globals())  # 全局变量放在一个字典中
 7     return locals()  # {'c': 5, 'd': 6}
 8 print(func1())
 9 
10 # print(globals())  # 全局名称空间:所有变量
11 # print(locals())  # 局部名称空间:所有变量
View Code

关键字 global    nonlocal

global
1,在局部空间内,声明一个全局变量
2,在局部空间内改变一个全局变量
nonlocal
1,不能修改全局变量。
2、在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,并且引用的哪层,从那层及以下此变量全部发生改变。
 1 # global
 2 # 1,在局部空间内,声明一个全局变量
 3 # def func1():
 4 #     global name
 5 #     name = '老男孩'
 6 #     print(name)
 7 # func1()
 8 # print(name)
 9 # 2,在局部空间内改变一个全局变量
10 # a = 4
11 # def func1():
12 #     global a
13 #     a = 5
14 #     print(a)
15 # func1()
16 # print(a)
17 
18 # nonlocal
19 # 1,不能修改全局变量。
20 
21 # a = 4
22 # def func1():
23 #     # nonlocal a
24 #     a = 5
25 #     print(a)
26 # func1()
27 # print(a)
28 # 在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,
29 # 并且引用的哪层,从那层及以下此变量全部发生改变。
30 # a = 4
31 # def func1():
32 #     b = 6
33 #     def func2():
34 #         b = 666
35 #         print(b) #666
36 #     func2()
37 #     print(b) # 6
38 
39 # func1()
40 #
41 b = 4
42 def func1():
43     global b
44     b = 6
45     def func2():
46         # nonlocal b
47         b = 666
48         print(b) #
49 
50     print(b)
51     func2()
52     print(b) #
53 print(b)
54 func1()
55 print(b)
View Code

 

 


 1 # global
 2 # 1,在局部空间内,声明一个全局变量
 3 # def func1():
 4 #     global name
 5 #     name = '老男孩'
 6 #     print(name)
 7 # func1()
 8 # print(name)
 9 # 2,在局部空间内改变一个全局变量
10 # a = 4
11 # def func1():
12 #     global a
13 #     a = 5
14 #     print(a)
15 # func1()
16 # print(a)
17 
18 # nonlocal
19 # 1,不能修改全局变量。
20 
21 # a = 4
22 # def func1():
23 #     # nonlocal a
24 #     a = 5
25 #     print(a)
26 # func1()
27 # print(a)
28 # 在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,
29 # 并且引用的哪层,从那层及以下此变量全部发生改变。
30 # a = 4
31 # def func1():
32 #     b = 6
33 #     def func2():
34 #         b = 666
35 #         print(b) #666
36 #     func2()
37 #     print(b) # 6
38 
39 # func1()
40 #
41 b = 4
42 def func1():
43     global b
44     b = 6
45     def func2():
46         # nonlocal b
47         b = 666
48         print(b) #
49 
50     print(b)
51     func2()
52     print(b) #
53 print(b)
54 func1()
55 print(b)
View Code

 

posted @ 2018-03-29 20:41  大白1#  阅读(52)  评论(0)    收藏  举报