python高级语法和用法(十九)

时间:2023-01-30 19:59:33

枚举类型:

枚举类型是python3添加的,python2是没有的。

from enum import Enum
class VIP(Enum):
    yellow = 1  green = 2  black = 3  red = 4  pass

想创建一个枚举类,就需要继承Enum

print(VIP.green)

python高级语法和用法(十九)

打印的时候还是原来的名字,感觉这样并没有意义,但是枚举的意义就在于定义名字,代表什么数字其实是不太在乎的。

如果存在两个名字不同,但是后面的数字相同的枚举:

class VIP(Enum):
    yellow = 1  green = 2  black = 2  red = 4  pass print(VIP.green)

这样输出还是一样,但是如果遍历:

for v in VIP:
    print(v)

python高级语法和用法(十九)可以看到输出的并没有black,其实如果两个名字的ID是相同的吗,那么只有第一个相同的名字会被显示,其他都会作为别名,如果想显示就要需要用到其他的遍历方法。

for v in VIP.__members__.items():
    print(v)

python高级语法和用法(十九)

这样既可。


其实枚举也可以通过后面的ID拿到名字:

print(VIP(2))

python高级语法和用法(十九)


枚举类有几种:

第一种就是刚刚的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__)

这里的输出:

python高级语法和用法(十九)

 这里并没有形成闭包,因为f2函数里面的a = 10已经被认为是一个局部变量了,局部变量并没有引用外包的变量,所以没有达成引用环境变量的情况。