Python enum vs từ điển

Bài đăng này sẽ khám phá mô-đun Python enum, một công cụ mạnh mẽ để xử lý các tập dữ liệu không thay đổi

Đây không chỉ là phần không thể thiếu để phát triển phần mềm tổng quát mà còn là thứ bạn sẽ thấy thường thấy trong các trò chơi – biến nó thành một kỹ năng và nền tảng quan trọng để học bất kể mục tiêu mã hóa cá nhân của bạn là gì.

Hãy đi sâu vào và khám phá chủ đề hấp dẫn này về cách sử dụng enum trong Python

Điều kiện tiên quyết. Người đọc phải có kiến ​​thức làm việc về ngôn ngữ lập trình Python. Làm quen với cách viết các lớp cũng sẽ hữu ích vì các enum Python được triển khai dưới dạng các lớp Python.

Mục lục

  • Python Enum là gì?
  • Ví dụ đơn giản
    • In ra các thành viên của Python enum
    • Đảm bảo tính duy nhất
    • Cách khác để tạo Enum
  • Lặp lại các phần tử
    • cho vòng lặp
    • Thuộc tính __members__
  • băm
  • Giá trị tự động
  • Bảng liệt kê có nguồn gốc
    • Lá cờ
    • IntEnum
    • cờ quốc tế
  • Đặt hàng tùy chỉnh
  • Tài liệu tham khảo / Đọc thêm
  • Sự kết luận

Python Enum là gì?

Hãy thảo luận về Python enum là gì. Viết tắt của kiểu liệt kê, tính năng ngôn ngữ này xác định một tập hợp các tên được liên kết với các giá trị không đổi như số, chuỗi, v.v. Các enum Python rất hữu ích để biểu diễn dữ liệu đại diện cho một tập hợp trạng thái hữu hạn, chẳng hạn như ngày trong tuần, tháng trong năm, v.v.

Chúng đã được thêm vào Python 3. 4 qua PEP 435. Tuy nhiên, nó có sẵn tất cả các cách trở lại 2. 4 qua pypy. Như vậy, bạn có thể mong đợi chúng trở thành một yếu tố chính khi bạn khám phá lập trình Python

Python enum vs từ điển
Python enum vs từ điển

Ví dụ đơn giản

Chúng tôi định nghĩa một lớp enum đơn giản (i. e. một lớp bắt nguồn từ Enum) chứa các tháng trong năm. Mỗi tháng (tôi. e. thành viên enum) được gán một hằng số duy nhất

from enum import Enum, unique, Flag

class Months(Enum) :
    JANUARY=1
    FEBRUARY=2
    MARCH =  3
    APRIL=4
    MAY=5
    JUNE=6
    JULY=7
    AUGUST=8
    SEPTEMBER=9
    OCTOBER=10
    NOVEMBER=11
    DECEMBER=12

In ra các thành viên của Python enum

Có một số cách chúng ta có thể làm điều này

# by numerical index
print (Months(7)
Months.JULY

# item index
print (Months['JULY'])
Months.JULY

# by name
print (Months.JULY)
Months.JULY

# by name
print (Months.JULY.name)
JULY

# by value
print (Months.JULY.value)
JULY

Đảm bảo tính duy nhất

Thêm một trình trang trí @unique vào lớp, đảm bảo rằng các phần tử trùng lặp không tồn tại trong Python enum

from enum import Enum, unique, Flag

>> @unique
.. class Months(Enum) :
..     JANUARY=1
..     JANUARY=1
..     FEBRUARY=2
..     MARCH =  3
..     APRIL=4
..     MAY=5
..     JUNE=6
..     JULY=7
..     AUGUST=8
..     SEPTEMBER=9
..     OCTOBER=10
..     NOVEMBER=11
..     DECEMBER=12
.. 
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
  File "<stdin>", line 4, in Months
  File "/home/raghavan/anaconda3/lib/python3.8/enum.py", line 112, in __setitem__
    raise TypeError('Attempted to reuse key: %r' % key)
TypeError: Attempted to reuse key: 'JANUARY'

TypeError xảy ra khi trình thông dịch Python cố tạo Python enum này

Cách khác để tạo Enum

Lớp Python Enum có thể gọi được và API chức năng sau có thể được gọi để tạo nó

>> quarter1= Enum('Q1', [('January', 1), ('February', 2), ('March', 3)])
>> print (quarter1(3))
Q1.March

# can also be written as
>> quarter1= Enum('Q1', ('January February March'))
>> print (quarter1)
<enum 'Q1'>

# item access
>>> quarter1['January']
<Q1.January: 1>

>>> Quarter1.March
<Q1.March: 3>

>>> Quarter1.March.value
3

Python enum vs từ điển
Python enum vs từ điển

Lặp lại các phần tử

cho vòng lặp

Có thể sử dụng vòng lặp for đơn giản để in ra các phần tử.

# simple for loop
for month in (Months) :
    print (month)

Months.JANUARY
Months.FEBRUARY
Months.MARCH
Months.APRIL
Months.MAY
Months.JUNE
Months.JULY
Months.AUGUST
Months.SEPTEMBER
Months.OCTOBER
Months.NOVEMBER
Months.DECEMBER

Thuộc tính __members__ attribute

__members__ là thuộc tính cấp lớp chỉ đọc cung cấp ánh xạ từ tên đến thành viên. Nó có thể được lặp đi lặp lại để tạo ra một đầu ra tương tự như trên

# iteration over elements
for name, member in Months.__members__.items():
    print (name, member)

JANUARY Months.JANUARY
FEBRUARY Months.FEBRUARY
MARCH Months.MARCH
APRIL Months.APRIL
MAY Months.MAY
JUNE Months.JUNE
JULY Months.JULY
AUGUST Months.AUGUST
SEPTEMBER Months.SEPTEMBER
OCTOBER Months.OCTOBER
NOVEMBER Months.NOVEMBER
DECEMBER Months.DECEMBER

băm

Python enums có thể được sử dụng làm khóa từ điển như sau

>> months = {}
>> months[Months.JULY] = 'Many Birthdays'
>> months[Months.JANUARY] = 'First Month of the Year'

>> print (months[Months(7)])
Many Birthdays

Giá trị tự động

Các giá trị tương ứng với tên có thể được điền tự động bằng cách sử dụng auto() như minh họa bên dưới.

# member values using auto
from enum import auto
class Quarter(Enum):
    Q1 = auto()
    Q2 = auto()
    Q3 = auto()
    Q4 = auto()


for qtr in Quarter:
    print (qtr.value)

# Output
1
2
3
4

Các giá trị, theo mặc định, là số. Tuy nhiên, chúng có thể được chuyển đổi thành các giá trị chuỗi bằng cách ghi đè _generate_next_value_ trong lớp

________số 8

Python enum vs từ điển
Python enum vs từ điển

Bảng liệt kê có nguồn gốc

Lá cờ

Flag khá giống với Enum ngoại trừ nó có hỗ trợ cho các hoạt động bitwise (. , &, ^, ~). Các toán tử này có thể được sử dụng để kết hợp nhiều phần tử enum Python thành một mặt nạ

Lớp Hành tinh có nguồn gốc từ Flag và chứa 8 hành tinh hiện được Liên minh Thiên văn Quốc tế công nhận. Các giá trị của các phần tử được yêu cầu là bội số của hai trong khi các kết hợp không cần tuân theo hạn chế đó

class Planets(Flag):
    MERCURY = 1
    VENUS   = 2
    EARTH   = 4
    MARS    = 8
    SATURN  = 10
    URANUS  = 12
    NEPTUNE = 14

my_planet = {
              Planets.MERCURY: "Red Planet",
              Planets.EARTH:   "People !!!!!",
              Planets.MARS:    "Martians !!!!"
            }

# bitwise OR mask => Mercury / Earth.
mercury_earth = Planets.MERCURY|Planets.EARTH

# we check which planets in the given dictionary are
# MARS or EARTH by doing a Bitwise AND with the mask above.

for planet_name in myplanet.keys() :
    found = bool(planet_name & mercury_earth)
    print ("Found:" + str(planet_name) + ":" + str(found))

# Output

Found:Planets.MERCURY:True
Found:Planets.EARTH:True
Found:Planets.MARS:False
  1. Lớp Hành tinh bắt nguồn từ Cờ . Nó chứa tên và giá trị của 8 hành tinh.
  2. Từ điển my_planet chứa tên liệt kê của Sao Thủy, Trái đất và Sao Hỏa làm khóa.
  3. Tạo mặt nạ bit bằng cách HOẶC -ing Các hành tinh. MERCURY và các hành tinh. TRÁI ĐẤT .
  4. Lặp lại các tên hành tinh trong từ điển và thực hiện Hiểu một chút VÀ giữa tên hành tinh và mặt nạ được tạo ở Bước 3. Chuyển đổi giá trị kết quả thành giá trị boolean .
  5. Thao tác bit & sẽ trả về True khi khóa phần tử khớp với Planet. THỦY NGÂN hoặc các hành tinh. TRÁI ĐẤTSai đối với bất kỳ hành tinh nào khác. Đầu ra phản ánh điều này.

IntEnum

IntEnum là một Python enum dẫn xuất cũng bắt nguồn từ int. Do đó, nó hỗ trợ các hoạt động int. Nó cung cấp các phép so sánh có thứ tự mà lớp Python Enum không cung cấp

# by numerical index
print (Months(7)
Months.JULY

# item index
print (Months['JULY'])
Months.JULY

# by name
print (Months.JULY)
Months.JULY

# by name
print (Months.JULY.name)
JULY

# by value
print (Months.JULY.value)
JULY
0
  1. Kế thừa quý từ Enum
  2. Hãy thử so sánh số “<” giữa Quý. Quý 1 và Quý. quý 2. Nó không thành công với TypeError
  3. Xác định lại Khu phố bằng cách kế thừa Khu phố từ IntEnum,
  4. So sánh tương tự bây giờ thành công
  5. Chúng tôi cũng có thể sắp xếp các thành viên của IntEnum
  6. Cuối cùng, chúng ta có thể thực hiện các thao tác số nguyên trên thành viên IntEnum

cờ quốc tế

Biến thể này của enum là một lớp con của int. Các thành viên của Python enum này là ints. Các giá trị này có thể được kết hợp bằng cách sử dụng toán tử bitwise và kết quả cũng là thành viên IntFlag. Bất kỳ nhà khai thác nào khác được sử dụng trên các thành viên đều có thể xóa chúng khỏi tư cách thành viên IntFlag

# by numerical index
print (Months(7)
Months.JULY

# item index
print (Months['JULY'])
Months.JULY

# by name
print (Months.JULY)
Months.JULY

# by name
print (Months.JULY.name)
JULY

# by value
print (Months.JULY.value)
JULY
1
  1. Chúng tôi kế thừa DaysOfWeek từ IntFlag. Nó chứa các ngày trong tuần với tư cách là thành viên
  2. Chúng tôi tạo mặt nạ cuối tuần (week_end) bằng bitwise-ORing Thứ Bảy và Chủ nhật
  3. Chúng tôi bitwise-VÀ mặt nạ này với Thứ Hai cung cấp cho chúng tôi giá trị Sai một cách chính xác
  4. Chúng tôi bitwise-VÀ mặt nạ này với Chủ nhật mang lại cho chúng tôi một giá trị True

Python enum vs từ điển
Python enum vs từ điển

Đặt hàng tùy chỉnh

Cả IntEnum và IntFlag đều cho phép chúng tôi sắp xếp thứ tự tùy chỉnh của các thành viên khi thứ tự tự nhiên không giúp được gì

IntEnum

# by numerical index
print (Months(7)
Months.JULY

# item index
print (Months['JULY'])
Months.JULY

# by name
print (Months.JULY)
Months.JULY

# by name
print (Months.JULY.name)
JULY

# by value
print (Months.JULY.value)
JULY
2
  1. Chuỗi XANH không thể được tạo theo thứ tự bảng chữ cái nhỏ hơn chuỗi XANH
  2. Tuy nhiên, việc xác định chúng là thành viên của IntEnum giúp điều này trở nên khả thi

Tài liệu tham khảo / Đọc thêm

Chúng tôi đã đề cập đến những điều cơ bản, nhưng bây giờ là lúc để bạn tự mình khám phá Python enums. Kiểm tra một số liên kết bên dưới để bắt đầu, với enums hoặc với các chủ đề lập trình Python khác

  • Tài liệu chính thức của Python về Enums
  • Zenva – Python Mini-Degree
  • GeekForGeek – Python Enums
  • FD Coding – Tại sao bạn nên sử dụng nhiều enum hơn trong Python
  • John Lekberg – Sử dụng kiểu liệt kê trong Python

Sự kết luận

Python enums cực kỳ hữu ích trong việc quản lý dữ liệu có một tập hợp trạng thái hữu hạn. Chúng cũng hữu ích trong việc áp đặt thứ tự tùy chỉnh trên dữ liệu. Như đã thảo luận, có 3 biến thể của Python Enum i. e. IntEnum, IntFlag và Cờ. Flag và IntFlag có thể được sử dụng để kết hợp các trạng thái bằng toán tử bitwise, trong khi IntEnum và IntFlag hữu ích cho việc so sánh và sắp xếp số

Tuy nhiên, bạn đi đâu với kiến ​​​​thức mới tìm thấy này là tùy thuộc vào bạn. Có lẽ bạn quan tâm đến việc tạo một chương trình lịch phù hợp với bộ phần mềm kinh doanh. Hoặc, có thể bạn quan tâm đến việc tạo trò chơi và sử dụng phép liệt kê trong Python cho các hiệu ứng trạng thái khác nhau. Việc sử dụng ở đây là vô hạn, nhưng chúng tôi hy vọng bạn đã có một số thông tin mới theo ý của mình và có thể sử dụng Python enum để mang lại lợi ích và thành công cho bạn

Sự khác biệt giữa enum và từ điển là gì?

Tóm tắt. enums dùng để liệt kê những thứ để bạn có thể sử dụng để xác định chúng sau này. Từ điển được sử dụng để lưu trữ các giá trị (đối tượng hoặc biến) dựa trên khóa .

Có phải enum là từ điển trong Python không?

Enum là một lớp trong python để tạo kiểu liệt kê , là một tập hợp các tên tượng trưng (thành viên) được liên kết với các giá trị không đổi, duy nhất. Các thành viên của một phép liệt kê có thể được so sánh bằng các anme tượng trưng này và bản thân phép liệt kê có thể được lặp đi lặp lại.

Là enum tương tự như từ điển?

Python Enum vs Dictionary Enum được sử dụng để tạo một tập hợp các hằng số liên quan. Từ điển được sử dụng để lưu trữ các giá trị dữ liệu trong khóa. cặp giá trị. Enum giống với mảng hơn . Từ điển không cho phép trùng lặp.

Tôi có nên sử dụng enums trong Python không?

Python enums hữu ích để biểu thị dữ liệu đại diện cho một tập hợp trạng thái hữu hạn chẳng hạn như ngày trong tuần, tháng trong năm, v.v. Chúng đã được thêm vào Python 3. 4 qua PEP 435. Tuy nhiên, nó có sẵn tất cả các cách trở lại 2. 4 qua pypy. Như vậy, bạn có thể mong đợi chúng trở thành một yếu tố chính khi bạn khám phá lập trình Python.