枚举
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 #所有的操作都局限在函数的内部 并没有改变全局变量
浙公网安备 33010602011771号