1. 程式人生 > 其它 >Python列舉型別的使用

Python列舉型別的使用

技術標籤:程式語言python

列舉型別是在Python3.4新增到Python的標準庫。

建立列舉

Python提供了兩種方法來建立列舉:

  • 基於class語法建立列舉
  • 基於Function API建立列舉

建立列舉首先要匯入Enum類

>>> from enum import Enum

基於class語法建立列舉

示例

'''
遇到問題沒人解答?小編建立了一個Python學習交流QQ群:778463939
尋找有志同道合的小夥伴,互幫互助,群裡還有不錯的視訊學習教程和PDF電子書!
'''
>>> from enum import Enum
>>
> class Color(Enum): ... red = 1 ... green = 2 ... blue = 3

示例定義以下內容:

  • 定義了Color的列舉型別。
  • 定義了列舉型別Color的列舉成員:Color.red,Color.green,Color.blue。
  • 給每一個列舉成員賦值,如Color.red的值為1。需要注意的是列舉成員的值可以指定為其他型別,沒有強制要求是整型。

列舉成員包含了兩個屬性:name和value

>>>Color.red.name
red
>>>Color.red.value
1

定義字串型別的值

'''
遇到問題沒人解答?小編建立了一個Python學習交流QQ群:778463939
尋找有志同道合的小夥伴,互幫互助,群裡還有不錯的視訊學習教程和PDF電子書!
'''
>>> from enum import Enum
>>> class Color(Enum):
...     red = 'r'
...     green = 'g'
...     blue = 'b'

基於Function API建立列舉

上面基於class建立列舉的示例用Function API可以改寫為

>>>from enum import Enum
>>
>Color = Enum('Color','red green blue') >>>list(Color) [<Color.red:1>,<Color.green:2>,<Color.blue:3>]

Enum函式第一個引數為列舉名。第二個引數為列舉成員列表。

第二個引數表示的列舉成員列表有三種方式:

  • 使用字串表示,各成員名使用空格隔開。成員的值從1開始自動遞增。
  • 使用元組表示,成員的值從1開始自動遞增。
  • 使用字典表示,字典可以指定列舉成員的值,其中字典的鍵位列舉成員名,值為列舉成員的值。

使用字典宣告示例

>>>from enum import Enum
>>>Color = Enum('Color',{'red':1,'green':2,'blue':4})

訪問列舉成員

訪問列舉成員有三種方式:

  • 使用點號(".")引用
  • 使用value獲取,值對應的列舉成員
  • 使用列舉成員名

按值訪問

>>>Color(1)
<Color.red:1>

按列舉名訪問

>>>Color['red']
<Color.red:1>

遍歷列舉

列舉支援對它的成員進行遍歷

list遍歷

>>>list(Color)
[<Color.red:1>,<Color.green:2>,<Color.blue:3>]

for遍歷

>>>for color in Color:
...  print(color)

列舉型別的比較

'''
遇到問題沒人解答?小編建立了一個Python學習交流QQ群:778463939
尋找有志同道合的小夥伴,互幫互助,群裡還有不錯的視訊學習教程和PDF電子書!
'''
>>> Color.red is Color.red
True
>>> Color.red is Color.blue
False
>>> Color.red is not Color.blue
True

注意列舉成員並非整型,是不能做大小比較,如

>>> Color.red < Color.blue
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unorderable types: Color() < Color()

只能做相等性比較

>>> Color.blue == Color.red
False
>>> Color.blue != Color.red
True
>>> Color.blue == Color.blue
True
>>> Color.blue == 2
False

定義列舉的方法

由於列舉型別也是一個class,所以也支援給列舉型別定義方法。

示例:

'''
遇到問題沒人解答?小編建立了一個Python學習交流QQ群:778463939
尋找有志同道合的小夥伴,互幫互助,群裡還有不錯的視訊學習教程和PDF電子書!
'''
class Mood(Enum):
  funky = 1
  happy = 3

  def describe(self):
    # self為列舉成員
    return self.name, self.value

  def __str__(self):
    return 'my custom str! {0}'.format(self.value)

  @classmethod
  def favorite_mood(cls):
    # cls為列舉型別
    return cls.happy

使用:

>>> Mood.favorite_mood()
<Mood.happy: 3>
>>> Mood.happy.describe()
('happy', 3)
>>> str(Mood.funky)
'my custom str! 1'

定義列舉的子類

定義列舉的子類需要滿足:父列舉沒有定義任何的列舉成員,此時才允許有子類。

>>> class MoreColor(Color):
...   pink = 17
...
TypeError: Cannot extend enumerations

這是由於Mood已定義了列舉成員,不允許擴充套件。