Lambda seperti lambda item: item["harga"] tampak praktis, tetapi pola ini muncul begitu sering sampai Python menyediakan versi resminya: module operator. Module ini berisi function yang memetakan setiap operator Python — pengambilan item, atribut, hingga penjumlahan — menjadi objek first-class yang bisa dikirim sebagai argumen. Melanjutkan materi function sebagai warga kelas satu pada Chapter Higher-Order Functions, kita bedah tiga pembangkit kuncinya.

itemgetter untuk sorted dan max #

Function itemgetter() membangun pengambil elemen berdasarkan index atau key. Pola paling umum: menjadi argumen key pada sorted():

python
from operator import itemgetter

produk = [
    {"nama": "laptop", "harga": 15000000},
    {"nama": "mouse", "harga": 150000},
    {"nama": "monitor", "harga": 2500000},
]

for item in sorted(produk, key=itemgetter("harga")):
    print(item["nama"], item["harga"])

Output yang Dihasilkan:

text
mouse 150000
monitor 2500000
laptop 15000000

Pemanggilan itemgetter("harga") mengembalikan callable yang membaca item["harga"] untuk setiap dictionary — persis seperti lambda, tetapi lebih cepat dan langsung terbaca niatnya. Function ini juga menerima beberapa key sekaligus untuk pengurutan bertingkat:

python
from operator import itemgetter

siswa = [("Budi", 85), ("Siti", 92), ("Andi", 85)]
print(sorted(siswa, key=itemgetter(1, 0)))

Output yang Dihasilkan:

text
[('Andi', 85), ('Budi', 85), ('Siti', 92)]

Argumen itemgetter(1, 0) artinya urutkan berdasarkan elemen kedua (nilai), lalu elemen pertama (nama) sebagai pemecah seri. Hasilnya Andi dan Budi yang sama-sama bernilai 85 terurut berdasarkan nama.

attrgetter dan methodcaller #

Versi untuk object adalah attrgetter(): mengambil nilai atribut berdasarkan nama. Method methodcaller() memanggil method berdasarkan nama string-nya:

python
from operator import attrgetter


class Transaksi:
    def __init__(self, id_pesanan, total):
        self.id_pesanan = id_pesanan
        self.total = total

    def __repr__(self):
        return f"Transaksi({self.id_pesanan!r}, {self.total})"


riwayat = [Transaksi("TRX-3", 500000), Transaksi("TRX-1", 250000)]
for transaksi in sorted(riwayat, key=attrgetter("total")):
    print(transaksi)

Output yang Dihasilkan:

text
Transaksi('TRX-1', 250000)
Transaksi('TRX-3', 500000)

Penggunaan attrgetter("total") setara dengan lambda t: t.total, dan bisa menjelaskan atribut bertingkat seperti attrgetter("pelanggan.nama"). Berikut peran methodcaller():

python
from operator import methodcaller

nama = ["budi", "siti", "andi"]
print(list(map(methodcaller("upper"), nama)))

Output yang Dihasilkan:

text
['BUDI', 'SITI', 'ANDI']

Pemanggilan methodcaller("upper") menghasilkan callable yang menjalankan .upper() pada argumennya — berguna saat API seperti map() atau sorted(key=...) hanya menerima function tanpa argumen tambahan.

Fungsi Operator sebagai Argumen #

Module operator juga mengekspos operator aritmetika sebagai function biasa: add, sub, mul, truediv, hingga mod. Kombinasi klasiknya bersama reduce():

python
from functools import reduce
from operator import add, mul

print(reduce(add, [100, 50, 25], 0))
print(reduce(mul, range(1, 6), 1))

Output yang Dihasilkan:

text
175
120

Baris pertama menjumlahkan [100, 50, 25] menjadi 175, dan baris kedua mengalikan 1 × 2 × 3 × 4 × 5 menjadi 120 — pengganti lambda lambda a, b: a * b yang kita pakai pada Chapter functools.

operator vs lambda #

Kapan memilih mana? Tabel berikut merangkum tiga padanan langsungnya:

KebutuhanDengan lambdaDengan operator
Ambil item dictionarylambda p: p["harga"]itemgetter("harga")
Ambil atribut objectlambda t: t.totalattrgetter("total")
Jumlahkan dua nilailambda a, b: a + badd

Dua pertimbangan memihak operator. Pertama, kinerja: function operator diimplementasikan dalam C sehingga menghindari overhead pemanggilan lambda yang ditulis dalam Python. Kedua, keterbacaan: nama itemgetter("harga") menyatakan niat secara langsung, sementara lambda memaksa pembaca mem-parse isi fungsinya.

Dengan tiga function pembangkit kunci ini, hampir semua argumen key= dalam kode kita bisa dibebaskan dari lambda pendek — kode menjadi lebih ringkas dan niatnya lebih terlihat sekali baca.