网站建设资讯

NEWS

网站建设资讯

python枚举函数取值 python 枚举值

干货 - 一文搞定Python 枚举

enum 是一组绑定到唯一常数值的符号名称,并且具备可迭代性和可比较性的特性。我们可以使用 enum 创建具有良好定义的标识符,而不是直接使用魔法字符串或整数,也便于开发工程师的代码维护。

创新互联公司长期为1000+客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为班戈企业提供专业的成都网站制作、成都做网站、外贸营销网站建设班戈网站改版等技术服务。拥有十年丰富建站经验和众多成功案例,为您定制开发。

我们可以使用 class 语法创建一个枚举类型,方便我们进行读写,另外,根据函数 API 的描述定义,我们可以创建一个 enum 的子类,如下:

enum 自带属性 name 和 value ,日常工作中使用最多的也是这两个属性,我们打印看看结果:

枚举支持迭代和遍历顺序。举个例子:

打印结果:

可以看出,遍历的每一个 status 是一个独立的枚举成员,拥有 name 和 value 属性。

另外,我们也可以使用如下形式来进行枚举遍历:

上 面我们创建的枚举类中, value 值是可以重复的,如果我们不想枚举类中的值重复可以是用装饰器 @unique ,举例如下:

我们运行后,报如下异常:

我们查看源代码,发现加入此装饰器的枚举类型, unique 方法会将其 __members__.items() 进行遍历,追加到 duplicates 列表中,如果发现列表不为空,则抛出如上异常信息。

此功能用于我们在使用枚举时,只在意枚举的标识符的含义而不在意值的情况下,但是如果需要与字符串或整数混合使用就要额外注意。下面贴上官方的示例:

可以发现,使用 auto() 得到的是整数自增型,如果我们需要别的方式,只需要在我们的枚举类中,重写 _generate_next_value_ 方法。

枚举对象可以进行比较,但是不能进行值比较,如果需要进行值比较则需要枚举对象继承 IntEnum 对象,举个例子:

上 面的测试例子当中,我们创建了两个继承类型不一样的枚举类,可以看到继承了 IntEnum 的 Season 可以进行值的比较,而继承了 Enum 的 Part 则不能进行值比较,并且 IntEnum 类型与 Enum 类型也不能进行比较,即使属性和值一样。

枚举中可以定义枚举类自身特有的方法,也可以复写一些已经在基类中定义好的方法,比如: __init__ , __str__ , __repr__ , __hash__ , __format__ 等。举个例子:

上面我们定义了一个枚举类,其中 value 是一个枚举类型,我们可以定义 __init__ 方法去对应元组中的值,我们也复写了 __str__ 方法。

打印方法看看效果:

从输出结果看,我们自定义和复写的方法都已经成功的应用到了 Mood 类中。

不同于 java 中的枚举类, python 中的枚举类是可以被继承的,但是被继承的枚举类规定其不能定义任何成员,但可以定义抽象方法。举例如下:

测试用例可以完美运行,我们可以发现:第一个方法中,抛出了 TypeError 的异常;第二个测试方法中, MoreColor 继承了 Color , Color 继承了 Shade , 并且我们可以通过子类调用父类中的方法。

主要介绍了 enum 模块的基础知识,包含枚举的创建、枚举成员和属性的访问、枚举方法的创建、枚举的继承等。其中新版中的 _ignore_ 、 _order_ 、 _missing_ 等可以学习官网的例子,另外 enum 的子类 IntEnum 、 IntFlag 等也是我们比较常用的枚举基类,本文中简单的介绍了 IntEnum , 而 IntFlag 相比与 IntEnum 多了 , |, ^, ~ 的操作,其他的子类大家感兴趣也可以了解。

python 怎么通过枚举的值

从C系语言过来用Python,好不容易适应了写代码不打花括号,突然有一天发现它居然木有枚举……于是stackoverflow了一把,发现神人的枚举(enum)实现到处都是,于是汉化总结过来。

如果是新版Python用户(Python 3.4 with PEP 435):

from enum import Enum

Animal = Enum('Animal', 'ant bee cat dog')

or

class Animals(Enum):

ant = 1

bee = 2

cat = 3

dog = 4

旧版Python用户可以充分发挥动态语言的优越性来构造枚举,有简单的:

def enum(**enums):

return type('Enum', (), enums)

Numbers = enum(ONE=1, TWO=2, THREE='three')

# Numbers.ONE == 1, Numbers.TWO == 2 and Numbers.THREE == 'three'

有复杂的:

def enum(*sequential, **named):

enums = dict(zip(sequential, range(len(sequential))), **named)

return type('Enum', (), enums)

Numbers = enum('ZERO', 'ONE', 'TWO')

# Numbers.ZERO == 0 and Numbers.ONE == 1

有带值到名称映射的:

def enum(*sequential, **named):

enums = dict(zip(sequential, range(len(sequential))), **named)

reverse = dict((value, key) for key, value in enums.iteritems())

enums['reverse_mapping'] = reverse

return type('Enum', (), enums)

# Numbers.reverse_mapping['three'] == 'THREE'

有用set实现的:

class Enum(set):

def __getattr__(self, name):

if name in self:

return name

raise AttributeError

Animals = Enum(["DOG", "CAT", "HORSE"])

print Animals.DOG

有用range实现的:

dog, cat, rabbit = range(3)

# or

class Stationary:

(Pen, Pencil, Eraser) = range(0, 3)

print Stationary.Pen

有用tuple实现的:

class Enum(tuple): __getattr__ = tuple.index

State = Enum(['Unclaimed', 'Claimed'])

print State.Claimed

有用namedtuple实现的:

from collections import namedtuple

def enum(*keys):

return namedtuple('Enum', keys)(*keys)

MyEnum = enum('FOO', 'BAR', 'BAZ')

# 带字符数字映射的,像C/C++

def enum(*keys):

return namedtuple('Enum', keys)(*range(len(keys)))

# 带字典映射的,可以映射出各种类型,不局限于数字

def enum(**kwargs):

return namedtuple('Enum', kwargs.keys())(*kwargs.values())

如何按行枚举 python enumerate

enumerate()说明

enumerate()是python的内置函数

enumerate在字典上是枚举、列举的意思

对于一个可迭代的(iterable)/可遍历的对象(如列表、字符串),enumerate将其组成一个索引序列,利用它可以同时获得索引和值

enumerate多用于在for循环中得到计数

例如对于一个seq,得到:

(0, seq[0]), (1, seq[1]), (2, seq[2])

1

1

enumerate()返回的是一个enumerate对象,例如:

enumerate()使用

如果对一个列表,既要遍历索引又要遍历元素时,首先可以这样写:

list1 = ["这", "是", "一个", "测试"]

for i in range (len(list1)):

print i ,list1[i]123123

上述方法有些累赘,利用enumerate()会更加直接和优美:

list1 = ["这", "是", "一个", "测试"]

for index, item in enumerate(list1):

print index, item

0 这

1 是

2 一个

3 测试1234567812345678

enumerate还可以接收第二个参数,用于指定索引起始值,如:

list1 = ["这", "是", "一个", "测试"]

for index, item in enumerate(list1, 1):

print index, item

1 这

2 是

3 一个

4 测试1234567812345678

补充

如果要统计文件的行数,可以这样写:

count = len(open(filepath, 'r').readlines())11

这种方法简单,但是可能比较慢,当文件比较大时甚至不能工作。

可以利用enumerate():

count = -1

for index, line in enumerate(open(filepath,'r')):

count += 1


名称栏目:python枚举函数取值 python 枚举值
文章路径:http://njwzjz.com/article/hjicos.html