Python的高级语法和用法——枚举和闭包

Posted on 2018-02-22 21:02  卜算子  阅读(249)  评论(0)    收藏  举报

枚举 

 1 from enum import Enum
 2 
 3 class VIP(Enum):#在类的下面定义一组一组的常量
 4     YELLOW = 1  #建议枚举下标识符采用大写   
 5     GREEN = 2    #枚举的意义在于标签 并不在于数值
 6     BLACK = 3
 7     RED = 4
 8 #枚举的好处 可读性
 9 print(VIP.BLACK)#获取的是枚举类型
10 Result: VIP.BLACK    

字典表示方法:{‘yellow’:1,'green':2}   

类型一旦确定下来是不能被改变的

枚举的保护功能:禁止修改标签的值  避免出现重复的标签  

获取枚举标签相应的数值:print(VIP.BlACK.value)

获取枚举标签的名字:print(VIP.BlACK.name)  获取的是一个字符串

枚举的标签(同一个枚举类型下)是可以进行等值比较的  #不支持大小比较  

枚举标签可以进行身份比较(is)

相同标签的值可以一样

第二个标签可以看做是第一个标签的 别名

数值相等的标签 别名在遍历的时候不会被打印

 1 from enum import Enum
 2 
 3 class Enum()
 4     YELLOW = 1
 5     YELLOW_ALIAS = 1
 6     BLACK = 2
 7 for v in VIP():
 8     print(v)
 9 Result: VIP.YELLOW
10         VIP.BLACK
11 for v in VIP._members_.items():#实现别名遍历打印
12      print(v)
13 Result: ('YELLOW' , <VIP.YELLOW: 1>)
14         ('YELLOW_ALIAS' , <VIP.YELLOW: 1>)
15 for v in VIP._members_():
16     print(v)
17 Result:YELLOW
18        YELLOW_ALIAS
19        BLACK

采用数值来访问枚举类型(数值类型转换) :枚举类名(数值名)

强制要求枚举下标签为整型:for enum import IntEnum

1 #禁止枚举类下出现不同标签具有相同值
2 for enum import IntEnum,unique
3 
4 @unipue
5 class VIP(IntEnum):
6     YELLOW = 1
7     BLACK = 1
8 Result:#报错提示

枚举类型是单例模式 实例化没有任何意义

闭包

 1 #闭包 = 函数  + 环境变量   /   闭包 = curve + (a =25)  
 2 #函数可以作为参数和结果进行使用
 3 def curve_pre():
 4     a = 25#环境变量 一定要在函数curve的外部 不能定义为全局变量
 5     def curve(x):
 6         return a*x*x
 7     return curve
 8 a = 10#环境变量一旦被引用 不会受外部修改所影响
 9 f = curve_pre()
10 prin(f._closure_[0].cell_contnnts)#环境变量存放在f. _closure_内置中
11 print(f(2))
12 Result:25
13        100

闭包的意义:保存的是一个环境 把一个函数当时调用的现场保存起来 

 1 def  f1():
 2     a = 10
 3     def f2():
 4         a = 20#局部变量并不能影响环境变量
 5         print(a)
 6     print(a)
 7     f2()
 8     print(a)
 9 Result:10#此时f2并未执行 a还是等于10
10            20#此时执行时a赋值为20
11            10#执行f2时,内部的局部变量并不能影响环境变量
#上述代码没有闭包

注:a在函数内部作为一个变量被引用 而不是赋值 

global 关键字 声明变量是全局变量

nonlocal 关键字 声明变量不是本地局部变量

#闭包实现旅行者当前位置
origin = 0
def factory(pos):
    def go(step):
        nonlocal pos
        new_pos = pos + step
        pos = new_pos
        return new_pos
    return go
tourist = factory(origin)
print(tourist(2))    /  2    
print(tourist(3))    /  5
print(tourist(5))    /  10
print(tourist)    /  0
#所有的操作都局限在函数的内部 并没有改变全局变量