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():
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:
mouse 150000
monitor 2500000
laptop 15000000Pemanggilan 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:
from operator import itemgetter
siswa = [("Budi", 85), ("Siti", 92), ("Andi", 85)]
print(sorted(siswa, key=itemgetter(1, 0)))Output yang Dihasilkan:
[('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:
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:
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():
from operator import methodcaller
nama = ["budi", "siti", "andi"]
print(list(map(methodcaller("upper"), nama)))Output yang Dihasilkan:
['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():
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:
175
120Baris 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:
| Kebutuhan | Dengan lambda | Dengan operator |
|---|---|---|
| Ambil item dictionary | lambda p: p["harga"] | itemgetter("harga") |
| Ambil atribut object | lambda t: t.total | attrgetter("total") |
| Jumlahkan dua nilai | lambda a, b: a + b | add |
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.