ماژول operator در پایتون مجموعهای از توابع کارآمد را صادر میکند که با عملگرهای ذاتی پایتون مطابقت دارند. برای مثال، operator.add(x, y) دقیقاً معادل عبارت x + y است. استفاده از این ماژول باعث میشود کد شما سریعتر، خواناتر و در برنامه نویسی تابعی (Functional Programming) قابل استفادهتر باشد.
در این مقاله، این ماژول را در دو سطح مقدماتی و پیشرفته بررسی میکنیم.
سطح مقدماتی (Beginner Level)
در سطح مقدماتی، یاد میگیریم که چگونه عملگرهای استاندارد ریاضی، مقایسهای و منطقی را با استفاده از توابع ماژول operator جایگزین کنیم. این کار مخصوصاً زمانی مفید است که نیاز دارید یک تابع را به عنوان آرگومان به توابعی مثل map() یا reduce() پاس دهید و نمیخواهید از lambda استفاده کنید.
۱. عملگرهای ریاضی (Arithmetic Operators)
این توابع جایگزین عملگرهایی مثل +, -, *, /, //, % و ** هستند.
مثال اول: استفاده پایه
در این مثال نحوه عملکرد توابع جمع، تفریق و توان را میبینیم.
مثال دوم: استفاده در محاسبات لیستی
فرض کنید میخواهیم حاصلضرب تمام اعداد یک لیست را محاسبه کنیم. به جای نوشتن حلقه یا استفاده از lambda، میتوانیم از operator.mul استفاده کنیم.
۲. عملگرهای مقایسهای (Comparison Operators)
این توابع معادل <, <=, ==, !=, >= و > هستند. نامگذاری آنها به صورت lt, le, eq, ne, ge, gt است.
مثال اول: بررسی تساوی و بزرگتری
مثال دوم: فیلتر کردن دادهها
میتوانیم از این عملگرها برای فیلتر کردن لیستها استفاده کنیم.
۳. عملگرهای منطقی و دنبالهای (Logical & Sequence)
شامل not_ (نقیض)، truth (بررسی درستی)، concat (الحاق لیستها یا رشتهها) و contains (بررسی وجود عضو) میشود.
مثال اول: کار با دنبالهها (Sequences)
مثال دوم: عملگرهای منطقی (Logical)
سطح پیشرفته (Professional Level)
در سطح حرفهای، ماژول operator ابزارهای قدرتمندی برای درونکاوی اشیاء (Introspection)، بهینهسازی عملکرد (Performance Optimization) و انجام عملیات درجا (In-place) ارائه میدهد. ابزارهای itemgetter، attrgetter و methodcaller از مهمترین بخشهای این ماژول هستند که جایگزین سریعتری برای توابع lambda محسوب میشوند.
۱. ابزارهای دسترسی: itemgetter
این ابزار تابعی را برمیگرداند که یک آیتم را از عملوند خود با استفاده از متد __getitem__ استخراج میکند. این روش بسیار سریعتر از استفاده از lambda x: x[i] برای مرتبسازی است.
مثال اول: مرتبسازی لیست تاپلها
مثال دوم: استخراج چندگانه
itemgetter میتواند چندین مقدار را همزمان استخراج کند.
۲. ابزارهای دسترسی: attrgetter
مشابه itemgetter است اما برای دسترسی به ویژگیهای (Attributes) یک کلاس یا آبجکت استفاده میشود.
مثال اول: مرتبسازی اشیاء کلاس
مثال دوم: دسترسی تو در تو
attrgetter از دسترسی نقطهای (dot notation) پشتیبانی میکند.
# Static Example (Snippet only)
# فرض کنید obj یک شیء پیچیده است که داخلش شیء دیگری دارد
# attrgetter('address.city') مقدار obj.address.city را برمیگرداند
f = operator.attrgetter('address.city')
city = f(user_object)
۳. فراخوانی متد: methodcaller
این ابزار تابعی تولید میکند که متد خاصی را روی شیء داده شده صدا میزند.
مثال اول: تمیز کردن رشتهها
مثال دوم: ارسال آرگومان به متد
میتوانیم آرگومانهای متد را نیز تعیین کنیم.
۴. عملگرهای درجا (In-place Operators)
پایتون علاوه بر عملگرهای استاندارد، عملگرهای درجا (مانند += یا *=) نیز دارد. در ماژول operator اینها با پیشوند i مشخص میشوند (مثل iadd). تفاوت مهم آنها در برخورد با انواع داده تغییرپذیر (Mutable) و تغییرناپذیر (Immutable) است.
مثال اول: رفتار با لیست (Mutable)
وقتی iadd روی لیست استفاده میشود، همان لیست اصلی تغییر میکند (مشابه extend).
مثال دوم: رفتار با عدد (Immutable)
برای اعداد و رشتهها، iadd شیء جدیدی برمیگرداند و شیء اصلی تغییر نمیکند.
۵. نگاشت به Magic Methods
هر تابع در ماژول operator مستقیماً به متد جادویی (Magic Method) متناظر در کلاسها نگاشت میشود. درک این موضوع برای نوشتن کلاسهای سفارشی که با این ماژول سازگار باشند ضروری است.
مثال اول: کلاس سفارشی
# Static code: تعریف کلاسی که با operator.add کار میکند
class Box:
def __init__(self, items):
self.items = items
def __add__(self, other):
# وقتی operator.add(box1, box2) صدا زده شود، این اجرا میشود
return Box(self.items + other.items)