TOP

python-day10

一. 动态传参

  形参:

    1. 位置参数

    2. 默认值

    3. 动态传参

      1 *args: 动态接受位置参数

      2 **kwargs: 动态接收关键字参数

      顺序: 位置,*args, 默认值,**kwargs

      

      *,**:

        def func(*args,**kwargs): 无敌传参

          pass

        *,** 在形参位置: 聚合

          在实参位置: 打散

  实参:

    1. 位置参数

    2. 关键字参数

    3. 混合参数

  

 1 # def fun(a,b): #位置参数
 2 #     print(a,b)
 3 # fun(1,2)
 4 
 5 # def fun(a,b): #关键字参数
 6 #     print(a,b)
 7 # fun(b=2,a=2)
 8 
 9 # def fun(a,b,c):#混合参数
10 #     print(a,b,c)
11 # fun(1,c=3,b=2)
12 
13 # def chi(*args):
14 #     print(args)
15 # # chi(args = 123) X X X
16 # chi()
17 # chi('10','11','12','13')
18 #
19 # def func(*args):
20 #     print(args)
21 # func('111111111111111')
22 
23 # def func(**kwargs):
24 #     print(kwargs)
25 # func(a = 1,b = 2)
26 
27 # def func(**kwargs):
28 #     print(kwargs)
29 # func(abc= 123,hui = 6)
30 
31 
32 # def func(*args,**kwargs):
33 #     print(args,kwargs)
34 # func('a','b',a = 1,b = 2)
35 # -------------------------------------------------
36 
37 # 动态传参
38 # *表示动态传参,可以接受所有的位置参数
39 # 传参的时候自动的把实参打包成元组 交给形参
40 
41 # def chi(*args):
42 #     print(args)
43 # chi()
44 # # chi(good_food = '胡辣汤') #关键字参数  #  一个星'*'不能穿关键字参数
45 # chi(1,2,3,4,5,6,7,8,9,0)#接受所有的位置参数
46 # ------------------------------------------------------------
47 #  **  表示接收关键字的动态传参
48 #接收到的内容放在字典里
49 # def chi(**food):
50 #     print(food)
51 # chi(good_food = '哈哈',junk_food='呵呵',drink = '吼吼')
52 # 顺序  位置>*args>默认值参数>**kwargs
53 # --------------------------
54 # lst = [1,2,3,4,5,6,7,8,9]
55 # def chi(*food):
56 #     print(food)
57 # chi(*lst)#把一个列表或者元组或者字符串.打散成参数. 传递给形参
58 
59 
60 # dic={'a':1,'b':2,'c':3}
61 # def da(**kwargs):#动/态传参,接收关键字参数
62     # print(kwargs)
63 # da(张无忌= dic['a'])
64 # da(**dic)#把字典打算成关键字参数
65 
66 #*,**:在参数:聚合,  实参:打散
View Code

 

二. 名称空间和作用域

  名称空间: 保存名字用的

    变量,函数,类

  1. 内置名称空间:python自己,print,input,len

  2. 全局名称空间: 你写的代码从上到下

  3. 全局名称空间: 函数,类,方法,其他模块,对象

  作用域

    全局作用域

      内置+全局

    局部作用域

      局部名称空间

    从局部找全局可以,但是从全局找局部是不可以的

    globals() 查看全局作用域中的名字

    locals() 查看当前作用域中的名字

  

 1 #在我们程序运行的时候, 首先 加载的并不是我们的代码
 2 # 先加载的是内置的一些东西
 3 
 4 #先加载print等其他
 5 # a = 10
 6 # def chi():
 7 #     a = 20
 8 #     print(a)
 9 # print(a)
10 # chi()
11 # print(a)
12 
13 # def chi():
14     # p = 30
15     # print(locals())#{'p': 30} locals()可以查看当前局部作用域中的内容
16     # print(p)
17 # chi()
18 # print(locals())#查看当前作用域中的名字
19 # print(globals())
20 # a = 10 #全局/
21 # b = 20
22 # print(globals())#查看全局作用域中(内置+全局)的内容
View Code

 

三. 函数的嵌套(难点)

  每一层都会产生独自的名称空间

  

 1 # 一个套一个
 2 # def outer():
 3 #     print('我是outer')
 4 #     #在函数内部声明的函数,只能在函数内部访问
 5 #     def inner():
 6 #         print('我是inner')
 7 #     inner()
 8 #     print('我是outer_end')
 9 # outer()
10 
11 # def fun2():
12 #     print(222)
13 #     def fun3():
14 #         print(666)
15 #     print(444)
16 #     fun3()
17 #     print(888)
18 # print(333)
19 # fun2()
20 # print(555)
View Code

 

四.nonlocal  global

  global: 在局部引入全局的内容,  可以生化一个变量为全局变量

  noblocal: 在局部, 引入上一层名称空间中的变量,如果没有,继续上一层.......上...上一层,没有报错

 

 1 # a = 10
 2 # def func():
 3 #     a = 20#并没有改变全局变量,创建了一个自己的变量
 4 #     #全局变量在局部,可以用,但是,不能改
 5 #     a = a+10
 6 #     print(a)
 7 # func()
 8 # print(a)
 9 
10 # a = 10
11 # def func():
12 #     global a #从全局把变量引进来
13 #     a = a+10
14 #     print(a)
15 # func()
16 # print(a)
17 
18 # def func():
19 #     global a #可以创建(升华)一个局部变量为全局变量
20 #     a = 30
21 # func()
22 # print(a)
23 
24 #  nonlocal 在局部, 引入上一层名称空间中的名字. 如果上一层没有, 继续上一层 .....
25 # def outer():
26 #     a = 10
27 #     def inner():
28 #         nonlocal a
29 #         a = 20
30 #         print(a)
31 #     print(a)  # 10
32 #     inner()   # 20
33 #     print(a)  # 20
34 # outer()
35 
36 # ***
37 a = 1
38 def fun_1():
39     a = 2
40     def fun_2():
41         nonlocal a
42         a = 3
43         def fun_3():
44             a = 4
45             print(a)
46         print(a)
47         fun_3()
48         print(a)
49     print(a)
50     fun_2()
51     print(a)
52 print(a)
53 fun_1()
54 print(a)
55 # 1234331
View Code

 

补充:

  一.形参的接收顺序   

    1 位置>*args>默认参数>**kwargs

  二.

  命名空间:我们的变量在储存的时候就是储存在这片空间中
  全局命名空间: 我们直接在py文件中,函数外声明的变量都属于全局命名空间
  局部命名空间: 在函数中声明的变量会放在局部命名空间
    内置命名空间: 存放python解释器为我们提供的名字,list,tuple,str,int这些都是内置命名空间
  三.
    全局作用域: 全局命名空间 + 内置命名空间
    局部作用域: 局部命名空间
  四.名称空间的加载顺序,取值顺序
    加载顺序:1内置命名空间  2全局命名空间  3局部命名空间(函数被执行的时候)
    取值顺序: 1局部命名空间 2全局命名空间  3内置命名空间
  五:
    global表示不再使用局部作用域的内容了,而改用全局作用域中的变量
    nonlocal表示在局部作用域中,调用父级命名空间中的变量
    
  
posted on 2018-10-30 19:43  hui_T  阅读(159)  评论(0编辑  收藏  举报