بهترین زبان برنامه نویسی برای مهاجرت؛ کدام زبان آینده شغلی بهتری دارد؟
برنامهنویسی در سالهای اخیر به یکی از مطمئنترین مسیرهای مهاجرت کاری تبدیل شده است. شرکتهای فناوری در کشورهای مختلف با …
انواع enum (مخفف Enumeration) در پایتون یکی از ابزارهای مهم برای تعریف مجموعهای از مقادیر ثابت و یکتا با نامهای معنادار است که به خوانایی و سازماندهی بهتر کد کمک میکند. با استفاده از enum، میتوان از نامهای نمادین بهجای مقادیر دلخواه مانند اعداد یا رشتهها استفاده کرد و این باعث میشود کد نه تنها خواناتر باشد، بلکه از بروز خطاهای احتمالی ناشی از استفاده مقادیر نادرست نیز جلوگیری شود. در این مقاله، به بررسی مزایا، ویژگیها و کاربردهای مختلف enum در پایتون خواهیم پرداخت و با مثالهای کاربردی آن آشنا میشویم.
enumeration یا enum مجموعهای از نامهای نمادین مرتبط با مقادیر یکتا است که میتوان بر روی آنها پیمایش کرد تا اعضای اصلی آنها به ترتیب تعریف بازگردانده شوند. enumها روشی برای ایجاد کدهایی خواناتر فراهم میکنند، زیرا از نامهای معنادار بهجای مقادیر دلخواه استفاده میکنند.
- enumها میتوانند به صورت رشته (string) یا repr نمایش داده شوند.
- میتوان enumها را با استفاده از type بررسی کرد.
- از کلمهکلیدی "name" برای نمایش نام عضو enum استفاده میشود.
برخی از مزایای استفاده از enum عبارتند از:
- آسانی در نگهداری: enumها تعریف مقادیر نامی را متمرکز میکنند که این امر به راحتی بهروزرسانی یا گسترش مقادیر بر اساس نیازهای ما کمک میکند.
- خوانایی و خودمستندسازی: enumها به مقادیر نامهای معنادار میدهند و کد را خواناتر و خود توضیحتر میسازند.
- ایمنی نوع: enumها تا حدی ایمنی نوع را فراهم میکنند و اطمینان میدهند که فقط مقادیر معتبر استفاده میشوند.
- کاهش خطر خطا: enumها به جلوگیری از استفاده از مقادیر نادرست یا ناسازگار در کد کمک میکنند و خطر بروز اشکالات را کاهش میدهند.
کد زیر یک کلاس enumeration به نام `Season` را با چهار عضو: `SPRING`، `SUMMER`، `AUTUMN` و `WINTER` تعریف میکند. این کد ویژگیهای کلیدی enum مانند دسترسی به یک عضو enum، نام و مقدار آن را نمایش میدهد. همچنین نشان میدهد چگونه میتوان لیستی از تمام اعضای enum به دست آورد. خروجی نام، مقدار، نوع و لیستی از تمام اعضای enum `Season` را نشان میدهد.
from enum import Enum
class Season(Enum):
SPRING = 1
SUMMER = 2
AUTUMN = 3
WINTER = 4
print(Season.SPRING)
print(Season.SPRING.name)
print(Season.SPRING.value)
print(type(Season.SPRING))
print(repr(Season.SPRING))
print(list(Season))خروجی:
اعضای enum میتوانند به دو روش دسترسی پیدا کنند:
1. با مقدار: در این روش، مقدار عضو enum پاس داده میشود.
2. با نام: در این روش، نام عضو enum پاس داده میشود.
میتوان بهطور جداگانه نام یا مقدار یک عضو را با استفاده از کلمات کلیدی "name" یا "value" به دست آورد.
کد زیر کلاس `Season` را با چهار عضو تعریف میکند و نشان میدهد که چگونه میتوان اعضای enum را با مقدار و نام دسترسی پیدا کرد.
from enum import Enum
class Season(Enum):
SPRING = 1
SUMMER = 2
AUTUMN = 3
WINTER = 4
print("عضو enum مرتبط با مقدار ۲: ", Season(2).name)
print("عضو enum مرتبط با نام AUTUMN: ", Season['AUTUMN'].value)خروجی:
عضو enum مرتبط با مقدار ۲: SUMMER
عضو enum مرتبط با نام AUTUMN: ۳enumها قابل پیمایش هستند. میتوان از حلقه for برای نمایش همه اعضای کلاس enum استفاده کرد.
from enum import Enum
class Season(Enum):
SPRING = 1
SUMMER = 2
AUTUMN = 3
WINTER = 4
for season in (Season):
print(season.value, "-", season)خروجی:
1 - Season.SPRING
2 - Season.SUMMER
3 - Season.AUTUMN
4 - Season.WINTERدر این مثال نشان داده میشود که چگونه میتوان کلاس `Enum` را هش کرد و از آن در دیکشنریها یا مجموعهها استفاده کرد.
class Animal(enum.Enum):
dog = 1
cat = 2
lion = 3
di = {}
di[Animal.dog] = 'bark'
di[Animal.lion] = 'roar'
if di == {Animal.dog: 'bark', Animal.lion: 'roar'}:
print("Enum هش شده است")
else:
print("Enum هش نشده است")خروجی:
enumeration از دو نوع مقایسه پشتیبانی میکند:
1. مقایسه هویتی: با استفاده از کلمات کلیدی "is" و "is not" بررسی میشود.
2. مقایسه برابری: مقایسههای برابری با استفاده از `==` و `!=` نیز پشتیبانی میشود.
import enum
class Animal(enum.Enum):
dog = 1
cat = 2
lion = 3
if Animal.dog is Animal.cat:
print("Dog و Cat حیوانات یکسانی هستند")
else:
print("Dog و Cat حیوانات متفاوتی هستند")
if Animal.lion != Animal.cat:
print("Lion و Cat متفاوت هستند")
else:
print("Lion و Cat یکسان هستند")خروجی:
وقتی مجموعهای از مقادیر ثابت یا مقادیر منطقی مرتبط دارید، استفاده از enum را در نظر بگیرید. enumها راهی برای تعریف نامهای نمادین برای این مقادیر فراهم میکنند که کد شما را خواناتر، قابل نگهداریتر و کمتر دچار خطا میسازند. آنها میتوانند به جای اعداد یا رشتههای جادویی از نامهای معنادار استفاده کنند و از خطاهای احتمالی به دلیل اشتباهات تایپی یا مقادیر نادرست جلوگیری کنند.
در پایتون به طور کلی دو نوع enumeration وجود دارد:
1. enumهای تابعی (IntEnum): این enumها از `enum.IntEnum` به ارث میبرند. آنها مانند اعداد صحیح رفتار میکنند و امکان مقایسه و عملیات ریاضی را فراهم میکنند.
2. enumهای مبتنی بر کلاس (Enum): این enumها از `enum.Enum` به ارث میبرند. آنها انعطافپذیرتر هستند و میتوانند هر نوع مقداری را نگه دارند، نه فقط اعداد صحیح. همچنین از روشها و ویژگیهای سفارشی پشتیبانی میکنند.
enumها چندین مزیت نسبت به استفاده از کلاسهای معمولی برای تعریف ثابتها دارند:
- خوانایی: enumها نامهای معنادار به ثابتها میدهند و کد را خواناتر و خودمستند میکنند.
- ایمنی نوع: enumها تضمین میکنند که متغیرها فقط یکی از مقادیر از پیش تعریفشده را بپذیرند و خطر بروز خطاهای ناشی از ورودیهای نامعتبر را کاهش میدهند.
- فضای نام: enumها یک فضای نام برای ثابتهای مرتبط فراهم میکنند و از برخورد نامها جلوگیری میکنند و سازماندهی کد را بهبود میبخشند.
میتوانید اعضای enum را با استفاده از تابع `str()` یا با دسترسی به ویژگی `name` آنها به رشته تبدیل کنید.
python
import enum
class Color(enum.Enum):
RED = 1
GREEN = 2
BLUE = 3
# تبدیل عضو enum به رشته با استفاده از str()
red_color_str = str(Color.RED)
print(red_color_str) # خروجی: 'Color.RED'
# تبدیل عضو enum به رشته با استفاده از ویژگی name
green_color_name = Color.GREEN.name
print(green_color_name)
# خروجی: 'GREEN'
بله، شما میتوانید از enumها بهعنوان کلید در دیکشنریها در پایتون استفاده کنید. enumها قابل هش کردن هستند، به این معنی که میتوان از آنها بهعنوان کلید در دیکشنریها و بهعنوان عناصر در مجموعهها استفاده کرد.
python
import enum
class Weekday(enum.Enum):
MONDAY = 1
TUESDAY = 2
WEDNESDAY = 3
# استفاده از enum بهعنوان کلید در دیکشنری
schedule = {
Weekday.MONDAY: "جلسه",
Weekday.TUESDAY: "ارائه",
Weekday.WEDNESDAY: "آموزش"
}
print(schedule[Weekday.MONDAY])
# خروجی: 'جلسه'
نظرات 1
برای ارسال نظر وارد حساب کاربری شوید.
¶ من هنوز بلدش نبودم خیلی ممنون از مقالهتون
برای ارسال نظر وارد حساب کاربری شوید.