functools: partial dan reduce
Buat fungsi khusus dengan partial dan lipat sequence menggunakan reduce.
functools: partial dan reduce adalah pelajaran Python Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Python Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Python Academy mencakup 4 pelajaran total.
Gambaran Umum functools
functools adalah modul pustaka standar yang berisi fungsi tingkat tinggi yang mengoperasikan fungsi lain atau mengembalikan fungsi lain.
import functools
# partial, reduce, lru_cache, wraps, cached_property ...
print(dir(functools))partial()
functools.partial(func, *args, **kw) membuat objek yang dapat dipanggil dengan beberapa argumen yang telah diisi sebelumnya.
import functools
def power(base, exp):
return base ** exp
square = functools.partial(power, exp=2)
cube = functools.partial(power, exp=3)
print(square(4)) # 16
print(cube(3)) # 27partial dengan Metode
Gunakan partial untuk menyesuaikan metode dengan parameter tetap agar dapat digunakan sebagai fungsi panggilan balik atau penangan peristiwa.
import functools, logging
logger = logging.getLogger("app")
log_error = functools.partial(logger.log, logging.ERROR)
log_error("Something went wrong")partial vs lambda
partial lebih disarankan daripada lambda untuk mengisi argumen sebelumnya karena dapat diserialisasi, memiliki representasi yang baik, dan mempertahankan string dokumentasi.
import functools
mul = lambda x, y: x * y
double_lambda = lambda x: mul(x, 2) # lambda approach
double_partial = functools.partial(mul, y=2) # partial approach
print(double_partial(5)) # 10reduce()
functools.reduce(func, iterable, initial) melipat objek yang dapat diiterasi dari kiri ke kanan menggunakan fungsi biner.
import functools, operator
total = functools.reduce(operator.add, [1,2,3,4,5])
print(total) # 15
product = functools.reduce(operator.mul, [1,2,3,4,5], 1)
print(product) # 120Membuat max() dengan reduce
Ilustrasikan reduce dengan mengimplementasikan ulang max():
import functools
def my_max(seq):
return functools.reduce(lambda a, b: a if a > b else b, seq)
print(my_max([3, 1, 4, 1, 5, 9])) # 9Meratakan Daftar Bersarang
Gunakan reduce bersama operator.iconcat untuk meratakan satu tingkat struktur bersarang.
import functools, operator
nested = [[1,2],[3,4],[5]]
flat = functools.reduce(operator.iconcat, nested, [])
print(flat) # [1, 2, 3, 4, 5]partial untuk Membuat URL
Pola praktis partial: tetapkan URL dasar lalu buat pembantu permintaan khusus.
import functools, urllib.request
def fetch(base, path):
url = base.rstrip("/") + "/" + path.lstrip("/")
with urllib.request.urlopen(url) as r:
return r.read()
github = functools.partial(fetch, "https://api.github.com")
# github("/users/octocat")wraps(): Mempertahankan Metadata
Saat menulis decorator, gunakan @functools.wraps(wrapped) agar pembungkus mempertahankan nama dan string dokumentasi fungsi asli.
import functools
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kw):
return func(*args, **kw)
return wrapper
@decorator
def greet(name):
"""Say hello."""
return f"Hello, {name}"
print(greet.__name__) # greet
print(greet.__doc__) # Say hello.total_ordering
@functools.total_ordering melengkapi metode perbandingan yang hilang ketika Anda mendefinisikan __eq__ dan salah satu dari __lt__/__le__/__gt__/__ge__.
import functools
@functools.total_ordering
class Version:
def __init__(self, major, minor):
self.v = (major, minor)
def __eq__(self, o): return self.v == o.v
def __lt__(self, o): return self.v < o.v
print(Version(1,2) >= Version(1,1)) # Truesingledispatch
@functools.singledispatch membuat fungsi yang meneruskan eksekusi ke implementasi berbeda berdasarkan tipe argumen pertama.
import functools
@functools.singledispatch
def process(arg):
raise NotImplementedError(type(arg))
@process.register(int)
def _(n): return n * 2
@process.register(str)
def _(s): return s.upper()
print(process(5)) # 10
print(process("hi")) # HIPemeriksaan Cepat
Apa yang dibuat oleh functools.partial(pow, 2)?
Ringkasan
partial mengisi argumen fungsi sebelumnya; reduce melipat urutan dengan fungsi biner; wraps mempertahankan metadata decorator; total_ordering melengkapi metode perbandingan; singledispatch meneruskan eksekusi berdasarkan tipe.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “functools: partial dan reduce” gratis?
Ya — teks lengkap “functools: partial dan reduce” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Python Academy, upgrade ke CoddyKit PRO. Kursus Python Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “functools: partial dan reduce”?
Buat fungsi khusus dengan partial dan lipat sequence menggunakan reduce. Kamu berlatih Python Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Python Academy?
Tidak diperlukan pengalaman sebelumnya. Python Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “functools: partial dan reduce” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Python Academy ini?
Ya. Setiap pelajaran Python Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- itertools: Iterator Tak Terbatas dan Terbatas
- itertools: Kombinatorika
- functools: partial dan reduce
- functools: lru_cache dan cached_property