Python的高级语法与用法 !

Python是一种易于学习又功能强大的编程语言。它不仅有简单有效的面向对象编程,还有高效的高级数据结构,就让我们一起来学习这部分的内容吧。

Python的原生类型中并不包含枚举类型,在Python3之前数据类型的表示方式有三种

模块中的全局变量

yellow =1
green = 2

字典

{‘yellow’:1,’green’:2}

类的对象

class TypeDiamond():
yellow = 1
green = 2

但是以上三种方法使用时存在缺点:

(1)变量的值是可变的

{‘yellow’:1,’green’:2}
a[‘yellow’]=3

(2)没有防止相同标签的功能

为了消除上述缺点,提供更好的解决方案, Python通过PEP435在3.4版本中添加了enum标准库,从而引入了枚举类型。

枚举类型可以看作是一种标签或是一系列常量的集合,通常用于表示某些特定的有限集合,比如星期、月份、状态等。

用一个具体实例说明枚举类型。QQ的VIP有黄钻、绿钻、黑钻和红钻,下面编写代码将VIP种类分别对应一个数值

from enum import Enum
class VIP(Enum):
YELLOW = 1
GREEN = 2
BLACK = 3
RED = 4

在上面代码中,我们将钻石的种类用大写字母表示,说明枚举类型中的变量是不可变的,其次不能出现相同的标签,否则就会出现

from enum import Enum
class VIP(Enum): #继承
YELLOW = 1
YELLOW = 1
GREEN = 2
BLACK = 3
RED = 4
print(VIP.YELLOW)

TypeError: Attempted to reuse key: ‘YELLOW’

上面例子可以说明枚举类型不可实例化,不可更改。

如果枚举类型的标签名不同,但值相同,会出现只打印第一个标签

from enum import Enum
class VIP(Enum): #继承
YELLOW = 1
GREEN = 1
BLACK = 3
RED = 4
print(VIP(1))

VIP.YELLOW

因此,我们把第二个具有相同值的标签称为第一个标签的别名。

枚举的操作

(1)获取数值

可以通过成员名来获取成员也可以通过成员值来获取成员

from enum import Enum
class VIP(Enum):
YELLOW = 1
GREEN = 2
BLACK = 3
RED = 4
print(VIP(1))
print(VIP[‘YELLOW’])

VIP.YELLOW
VIP.YELLOW

(2)获取标签的名字

具体方法如下面代码所示

from enum import Enum
class VIP(Enum):
YELLOW = 1
GREEN = 2
BLACK = 3
RED = 4
print(VIP.GREEN.name)
print(VIP.GREEN)
print(VIP[‘GREEN’])

GREEN
VIP.GREEN
VIP.GREEN
打印了三种不同的值,通过运用type()函数,可以直观地看出三种打印值属于不同的数据类型。

print(type(VIP.GREEN.name)) #字符串
print(type(VIP.GREEN)) #枚举名字
print(type(VIP[‘GREEN’])) #枚举的值

<class ‘str’>
<enum ‘VIP’>
<enum ‘VIP’>

第一个是字符串,第二个是枚举的名字,第三个是枚举的值。枚举的名字和枚举的值组成了枚举类型。

(3)枚举的遍历

from enum import Enum
class VIP(Enum):
YELLOW = 1
GREEN = 2
BLACK = 3
RED = 4
for v in VIP:
print(v)

VIP.YELLOW
VIP.GREEN
VIP.BLACK
VIP.RED

如果有值重复的成员,只能获取重复的第一个成员。

将重复的成员叫做别名,当需要将别名遍历出来时,用Python的特殊属性members_是一个将名称映射到成员的有序字典,通过它来完成遍历。

from enum import Enum
class VIP(Enum):
YELLOW = 1
YELLOW_ALIAS = 2
GREEN = 2
BLACK = 3
RED = 4
for v in VIP.members.items():
print(v)

(‘YELLOW’, <VIP.YELLOW: 1>)
(‘YELLOW_ALIAS’, <VIP.YELLOW_ALIAS: 2>)
(‘GREEN’, <VIP.YELLOW_ALIAS: 2>)
(‘BLACK’, <VIP.BLACK: 3>)
(‘RED’, <VIP.RED: 4>)

枚举比较

(1)枚举成员可以通过is同一性比较或==等值比较

from enum import Enum
class VIP(Enum):
YELLOW = 1
GREEN = 2
BLACK = 3
RED = 4
result = VIP.GREEN == VIP.BLACK
print(result)

False

from enum import Enum
class VIP(Enum):
YELLOW = 1
GREEN = 2
BLACK = 3
RED = 4
class VIP1(Enum):
YELLOW = 1
GREEN = 2
BLACK = 3
RED = 4
result3 = VIP.GREEN is VIP.GREEN
print(result3)

True

(2)枚举成员不能进行大小比较,不同类的枚举不能比较。

from enum import Enum
class VIP(Enum):
YELLOW = 1
GREEN = 2
BLACK = 3
RED = 4
result2 = VIP.GREEN > VIP.BLACK
print(result2)

‘>’ not supported between instances of ‘VIP’ and ‘VIP’

from enum import Enum
class VIP(Enum):
YELLOW = 1
GREEN = 2
BLACK = 3
RED = 4
class VIP1(Enum):
YELLOW = 1
GREEN = 2
BLACK = 3
RED = 4
result4 = VIP.GREEN == VIP1.GREEN
print(result4)

False

既然已经意识到和牛人的差距,那么应该加倍努力,不止每一个放假的日子。平凡人的不平凡,是为梦想费尽力气,是无视荆棘一路前行。

    原文作者:不谈风月_0eb8
    原文地址: https://www.jianshu.com/p/1237ef18b20a
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞