一,枚举
from enum import Enum #引入枚举模块
class VIP(Enum): #python中枚举既是类,而且要继承父类Enum
YELLOW=1
GREEN=2
BLACK=3
RED=4
print(VIP.YELLOW) #得到的是枚举
print(VIP.YELLOW.value)
print(VIP.YELLOW.name) #得到的是str
结果:VIP.YELLOW #枚举类型 1 #枚举值 YELLOW#枚举的名字
二,枚举的重命名
from enum import Enum
class VIP(Enum):
YELLOW=1
YELLOW_ALIAS=2 #在枚举中,如果两个数值是相同的话,可以称为另一个的别名。
BLACK=3
RED=4
for v in VIP:
print(v) #此时当打印的时候,是不会打印出别名来的。
如果想要打印出别名的话
for v in VIP.__member__.items():
print(v) #此时可打印出枚举的所有相关项
如果上面的输出太多,也可以
for v in VIP.__member__:
print(v)
三,枚举类型转化
from enum import Enum
class VIP(Enum):
YELLOW=1
GREEN=2
BLACK=3
RED=4
a=1 #当我们得到一个值时怎么能得枚举类型。
print(VIP(a)) #直接把值放到枚举类中
结果为:VIP.YELLOW
四 枚举的继承
当在引入时不至有
from enum import Enum
还可以引入
from enum import IntEnum #当枚举类继承此(IntEnum)时,枚举类的值只能是数字类型
class VIP(IntEnum):
YELLOW=1
GREEN=2
BLACK=3
RED=4
注,当值有字符类型时会报错,但如果继承(Enum)时,则都可以.
五,限定枚举值不能相同
from enum import IntEnum,unique
@unique #装饰器 #限定枚举值不可以相同,会报错
class VIP(IntEnum):
YELLOW=1
GREEN=2
BLACK=3
RED=4
六 #闭包=函数+环境变量
def curve_pre():
a=25 #环境变量
def curve(x)
return a*x*x
return curve #函数curve_pre的返回值,为curve函数而不是curve函数的值
a=10
f=curve_pre() #调用函数cruve()之前应先调用函数curve_pre(),因为函数curve_pre的返回值为函数curve(),所以此时f=curve(x)
f(2) #此时等于curve(2) 但此时函数curve()中的a=25,而不是10
print(f(2))
print(f.__closure__) #环境变量被放置的地方
print(f.__closure__[0.]cell_contents) #打印出环境变量的值
七,问题解决 需求,走路,计算步数
origin=0 #初始化原点
def go(step) #step步数
global origin #定义origin为全局变量
new_pos=origin+step
origin=new_pos #此处如果对origin重新赋值时没有定义为全局变量,则会被认为是局部变量,而局部变量不是向上找origin=0,所以会被认为没有被定义
return new_pos
print(go(2))
print(go(6))
print(go(10))
八,闭包解决问题同上
origin=0
def factory(pos) #步数
def go(step) #行走步数
nonlocal pos #指定pos为非局部变量
new_pos=pos+step
pos=new_pos
return new_pos
return go #闭包特征返回函数go() 环境变量(记录上次的环境特殊)pos
tourist=factory(origin)
print(tourist(2))
print(tourist(5))
print(tourist(8))