枚举类型:
枚举类型是python3添加的,python2是没有的。
from enum import Enum
class VIP(Enum):
yellow = 1 green = 2 black = 3 red = 4 pass
想创建一个枚举类,就需要继承Enum
print(VIP.green)
打印的时候还是原来的名字,感觉这样并没有意义,但是枚举的意义就在于定义名字,代表什么数字其实是不太在乎的。
如果存在两个名字不同,但是后面的数字相同的枚举:
class VIP(Enum):
yellow = 1 green = 2 black = 2 red = 4 pass print(VIP.green)
这样输出还是一样,但是如果遍历:
for v in VIP:
print(v)
可以看到输出的并没有black,其实如果两个名字的ID是相同的吗,那么只有第一个相同的名字会被显示,其他都会作为别名,如果想显示就要需要用到其他的遍历方法。
for v in VIP.__members__.items():
print(v)
这样既可。
其实枚举也可以通过后面的ID拿到名字:
print(VIP(2))
枚举类有几种:
第一种就是刚刚的Enum,如果想要求后面的数字就是固定的,那么可以使用
IntEnum
这样就是要求后面就是一定是一个数字了。
闭包:
闭包 = 函数 + 环境变量
环境变量是具有保存线程的功能
def cure(): a = 25 def cure2(x): return a * x * x return cure2 f = cure() print(f(2))
这其实就是一个闭包。返回参数是函数,a就是环境变量,调用了原环境里面的a = 25
def cure(): a = 25 def cure2(x): return a * x * x return cure2 f = cure() a = 10 print(f(2))这样的结果其实也是100,虽然a = 25是局部变量,但是刚刚说了包括了函数和环境变量。所以这个a = 25也包进来了,只有找不到当前环境的变量才有可能去寻找全局变量。
如果把a = 25放到了外面或者cure2里面,就不叫闭包了,因为返回的就没有环境了。
有一个比较易错的例子:
def f1(): a = 20 def f2(): a = 10 return a print(a) return f2 a = f1() print(a.__closure__)
这里的输出:
这里并没有形成闭包,因为f2函数里面的a = 10已经被认为是一个局部变量了,局部变量并没有引用外包的变量,所以没有达成引用环境变量的情况。