0Pricing
Python Academy · Pelajaran

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))    # 27

partial 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))   # 10

reduce()

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) # 120

Membuat 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]))  # 9

Meratakan 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))  # True

singledispatch

@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"))  # HI

Pemeriksaan 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

  1. itertools: Iterator Tak Terbatas dan Terbatas
  2. itertools: Kombinatorika
  3. functools: partial dan reduce
  4. functools: lru_cache dan cached_property
← Kembali ke Python Academy