کتابخانه operator در پایتون
ماژول operator در پایتون مجموعهای از توابع پیشساخته را فراهم میکند که معادلِ عملگرهای سطح زبان (مثل +، -, []، . و غیره) بهصورت تابع هستند. این توابع هنگام برنامهنویسی تابعی، زمانی که نیاز به پاس دادن عملگر بهعنوان آرگومان داریم، یا برای افزایش خوانایی و کارایی بهجای لامبداها بسیار مفیدند.
چرا از operator استفاده کنیم؟
- خوانایی بهتر نسبت به لامبداهای کوتاه: operator.add بهجای lambda x, y: x + y
- در برخی موارد سریعتر از لامبدا (پیادهسازی C-محور)
- توابع کمکی مفید مثل itemgetter، attrgetter و methodcaller برای ساختن کلید مرتبسازی یا فراخوانی متد
- پشتیبانی از نسخههای in-place (iadd, imul) برای عملیاتهایی که __iadd__ را فرا میخوانند
توابع پرتکرار و کاربرد آنها
- add, sub, mul, truediv, floordiv, mod, pow — معادل عملگرهای ریاضی
- neg, pos, abs — عملگرهای یکتایی (abs تابع builtin است ولی توابع مشابه در operator هم وجود دارد)
- getitem, setitem, delitem — کار با ایندکسها
- attrgetter, itemgetter, methodcaller — استخراج صفتها، عناصر و فراخوانی متدها برای استفاده بهعنوان key یا callback
- lt, le, eq, ne, gt, ge, is_, is_not, contains, truth — مقایسه و تستها
- iadd, isub, imul, … — نسخههای in-place عملگرها
مثال 1 — استفاده ساده با map و reduce
from operator import add, mul
from functools import reduce
data = [1, 2, 3, 4]
sum_all = reduce(add, data) # جمع عناصر
product = reduce(mul, data, 1) # ضرب عناصر
print(sum_all) # 10
print(product) # 24در این مثال بهجای نوشتن lambda برای جمع یا ضرب از توابع آماده operator استفاده شده که خواناتر است و مستقیماً معادل عملگر + و * هستند. reduce با add لیست را جمع میکند و با mul حاصلضرب را محاسبه میکند.
مثال 2 — مرتبسازی لیستی از دیکشنریها با itemgetter
from operator import itemgetter
rows = [
{'name': 'Ali', 'age': 30},
{'name': 'Sara', 'age': 25},
{'name': 'Mina', 'age': 28},
]
sorted_by_age = sorted(rows, key=itemgetter('age'))
print(sorted_by_age)در اینجا itemgetter(‘age’) تابعی میسازد که برای هر آیتم مقدار کلید ‘age’ را بازمیگرداند و آن را بهعنوان کلید مرتبسازی به sorted میدهیم. کوتاهتر و سریعتر از lambda x: x[‘age’] است و وقتی نیاز به چند فیلد باشد، itemgetter میتواند tuple بازگرداند (مثلاً itemgetter(‘age’,’name’)).
مثال 3 — مرتبسازی یا استخراج صفتهای تو در تو با attrgetter
from operator import attrgetter
class Person:
def __init__(self, name, city):
self.name = name
self.address = type('A', (), {'city': city})()
people = [
Person('Ali', 'Tehran'),
Person('Sara', 'Shiraz'),
Person('Mina', 'Isfahan'),
]
# مرتبسازی بر اساس اسامی شهر (آدرس تو در تو)
sorted_by_city = sorted(people, key=attrgetter('address.city'))
print([p.name for p in sorted_by_city])attrgetter بهخصوص برای دسترسی به صفات تو در تو مفید است؛ ‘address.city’ بهصورت مستقیم مقدار شهر را استخراج میکند. این روش هم از نظر خوانایی بهتر است و هم در بسیاری از موارد سریعتر از معادل لامبدا عمل میکند.
مثال 4 — فراخوانی متد روی اشیا با methodcaller
from operator import methodcaller
names = ['alice', 'BOB', 'Charlie']
upper = list(map(methodcaller('upper'), names))
print(upper) # ['ALICE', 'BOB', 'CHARLIE']methodcaller(‘upper’) تابعی میسازد که روی هر آیتم متد upper را اجرا میکند. این الگو زمانی که بخواهید متدهای با پارامتر هم فراخوانی کنید مفید است، مثلاً methodcaller(‘replace’, ‘a’, ‘b’).
مثال 5 — getitem، setitem و delitem
from operator import getitem, setitem
lst = [10, 20, 30]
print(getitem(lst, 1)) # 20
setitem(lst, 1, 99)
print(lst) # [10, 99, 30]getitem و setitem معادل عملگرهای index و assignment با ایندکس هستند. این توابع زمانی مفیدند که بخواهید رفتارهای ایندکسگذاری را برنامهای انجام دهید یا به عنوان callback به ساختارهای higher-order تابعی پاس دهید.
مقایسه سرعت: operator در برابر lambda
در بسیاری از سناریوها توابع operator پیادهسازیشده در C میتوانند کمی سریعتر از معادل لامبدا باشند، خصوصاً وقتی در حلقهها یا پردازشهای حجیم استفاده میشوند. با این حال تفاوت همیشه قابلتوجه نیست؛ مهمتر خوانایی و مقصود کد است.
| تابع operator | کاربرد متداول |
|---|---|
| add, mul, sub | map، reduce، عملیات ریاضی |
| itemgetter | کلید مرتبسازی برای دیکشنریها/تاپلها |
| attrgetter | دسترسی به صفتها، مخصوصاً تو در تو |
| methodcaller | فراخوانی متد روی مجموعهای از اشیا |
| is_, is_not, contains | مقایسه هویت و عضویت در حالات تابعی |
نکات پیشرفته و ترفندها
- itemgetter میتواند چندین کلید بگیرد و tuple بازگرداند؛ این برای مرتبسازی چند معیاره مفید است.
- attrgetter با ورودیهایی مثل ‘a.b’ توانایی استخراج زنجیرهای صفات را دارد؛ اگر صفت میانی نباشد، AttributeError تولید میشود.
- methodcaller برای متدهایی با آرگومان مفید است: methodcaller(‘replace’, ‘a’, ‘A’)
- نسخههای in-place مانند iadd ممکن است اشیاء را بدون ساختن شیء جدید تغییر دهند که به حافظه و کارایی کمک میکند.
جمعبندی
ماژول operator یک ابزار قدرتمند و کاربردی برای زمانی است که نقش عملگرها را بهصورت توابع نیاز دارید. استفاده از itemgetter، attrgetter و methodcaller خوانایی و در بسیاری موارد سرعت کد را بهبود میبخشد. در طراحی APIها، عملیات دستهای و برنامهنویسی تابعی، این توابع بهعنوان جایگزینی مناسب برای لامبداها عمل میکنند.
برای یادگیری بیشتر به مستندات رسمی پایتون مراجعه کنید و در موقعیتهای واقعی کدنویسی، بین خوانایی و بهینهسازی تعادل برقرار کنید.
آیا این مطلب برای شما مفید بود ؟




