Fork me on GitHub

python3枚举与闭包

枚举

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

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

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

获取枚举标签相应的数值

1
print(VIP.BlACK.value)

获取枚举标签的名字

1
print(VIP.BlACK.name)  获取的是一个字符串

枚举的比较运算

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

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

  • 相同标签的值可以一样

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

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

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

枚举转换

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

1
枚举类名(数值名)

强制要求枚举下标签为整型

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

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

闭包

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

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

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#闭包实现旅行者当前位置
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
#所有的操作都局限在函数的内部 并没有改变全局变量
-------------本文结束 感谢您的阅读-------------
  • 本文标题: python3枚举与闭包
  • 本文作者: 吴军旗
  • 本文链接: http://fanqieto.top/2018/07/19/python3枚举与闭包/
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请保留原文链接及作者!
    • 欢迎搜索及关注:番茄技术小栈,所有文章都将同步在公众号上!
坚持原创技术分享,您的支持将鼓励我继续创作!