ویژگی تصویر

معرفی کتابخانه operator در پایتون

  /  پایتون   /  کتابخانه 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, submap، 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ها، عملیات دسته‌ای و برنامه‌نویسی تابعی، این توابع به‌عنوان جایگزینی مناسب برای لامبداها عمل می‌کنند.

برای یادگیری بیشتر به مستندات رسمی پایتون مراجعه کنید و در موقعیت‌های واقعی کدنویسی، بین خوانایی و بهینه‌سازی تعادل برقرار کنید.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: