0Pricing
DSA Interview Prep · Pelajaran

Fungsi, Closure, dan Lambda

Definisikan fungsi pembantu yang dapat digunakan kembali, gunakan argumen bawaan, dan terapkan ekspresi lambda untuk pengurutan serta pola fungsional dalam soal wawancara.

Fungsi, Closure, dan Lambda adalah pelajaran DSA Interview Prep gratis di CoddyKit. Ini adalah pelajaran 4 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 DSA Interview Prep, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus DSA Interview Prep mencakup 4 pelajaran total.

Mendefinisikan Fungsi dalam Python

Fungsi bersifat kelas-utama dalam Python: Anda dapat meneruskan, mengembalikan, dan menyimpannya. Fungsi pembantu dengan nama yang baik membuat kode wawancara mudah dibaca. Tangani kasus tepi terlebih dahulu.

def is_palindrome(s: str) -> bool:
    '''Return True if s reads the same forwards and backwards.'''
    s = s.lower()
    return s == s[::-1]

print(is_palindrome('Racecar'))  # True
print(is_palindrome('hello'))    # False

# Functions as values
checks = [is_palindrome]
print(checks[0]('level'))  # True

Argumen Bawaan dan Kata Kunci

Nilai bawaan memungkinkan pemanggil melewati argumen. Namun, jangan pernah menggunakan nilai bawaan yang dapat berubah seperti daftar—semua pemanggil akan menggunakannya bersama. Perbaikannya: gunakan None sebagai nilai bawaan dan buat daftar di dalam fungsi. Lihat kodenya.

# WRONG: shared mutable default
def bad_append(val, lst=[]):
    lst.append(val)
    return lst

print(bad_append(1))  # [1]
print(bad_append(2))  # [1, 2]  surprise!

# CORRECT: use None sentinel
def good_append(val, lst=None):
    if lst is None:
        lst = []
    lst.append(val)
    return lst

print(good_append(1))  # [1]
print(good_append(2))  # [2]

*args dan **kwargs

*args mengumpulkan argumen posisi tambahan ke dalam tupel; **kwargs mengumpulkan argumen kata kunci tambahan ke dalam dict. Tanda * juga membongkar urutan saat Anda memanggil fungsi.

def total(*args):
    return sum(args)

print(total(1, 2, 3))     # 6
print(total(1, 2, 3, 4))  # 10

# Unpack a list as positional args
point = [3, 7]
print(max(*point))   # 7

# **kwargs
def greet(**kwargs):
    name = kwargs.get('name', 'World')
    return f'Hello, {name}!'

print(greet(name='Alice'))  # Hello, Alice!

Ekspresi Lambda

lambda adalah fungsi kecil satu baris: lambda params: expression. Sangat cocok sebagai key cepat dalam sorted atau max. Untuk sesuatu yang lebih besar, def dengan nama akan lebih mudah dibaca.

# Lambda as sort key
pairs = [(1, 3), (2, 1), (3, 2)]
sorted_by_second = sorted(pairs, key=lambda p: p[1])
print(sorted_by_second)  # [(2,1),(3,2),(1,3)]

# Lambda with map
double = list(map(lambda n: n * 2, [1, 2, 3]))
print(double)  # [2, 4, 6]

# Named function is clearer for complex logic
def sort_key(p):
    return (p[1], -p[0])  # secondary sort
print(sorted(pairs, key=sort_key))

Fungsi Bersarang dan Closure

Closure adalah fungsi yang mengingat variabel dari fungsi di sekitarnya. Definisikan pembantu di dalam fungsi lain, lalu pembantu tersebut dapat menggunakan variabel luar—berguna untuk DFS.

def make_counter(start=0):
    count = [start]  # list to allow mutation
    def increment():
        count[0] += 1
        return count[0]
    return increment

counter = make_counter()
print(counter())  # 1
print(counter())  # 2

# Alternative: nonlocal keyword
def make_counter2():
    count = 0
    def increment():
        nonlocal count
        count += 1
        return count
    return increment

Closure dalam DFS Rekursif

Pola yang umum adalah mendefinisikan pembantu dfs di dalam fungsi utama dan membiarkannya mengumpulkan hasil ke dalam variabel luar. Fungsi dalam tersebut merupakan closure atas lingkup itu.

def max_depth(root):
    '''Closure pattern for tree DFS.'''
    max_d = [0]  # mutable container for closure

    def dfs(node, depth):
        if node is None:
            return
        max_d[0] = max(max_d[0], depth)
        dfs(node.left, depth + 1)
        dfs(node.right, depth + 1)

    dfs(root, 1)
    return max_d[0]
# This pattern avoids a class or global state.

functools.lru_cache untuk Memoisasi

lru_cache (atau @cache pada versi 3.9+) mengingat hasil fungsi berdasarkan argumennya, sehingga Fibonacci naif berubah dari O(2^n) menjadi O(n). Argumen harus dapat di-hash, jadi gunakan tupel.

from functools import lru_cache

@lru_cache(maxsize=None)
def fib(n):
    if n <= 1:
        return n
    return fib(n - 1) + fib(n - 2)

print(fib(40))   # 102334155  fast!
print(fib.cache_info())  # hits, misses, size

Fungsi Tingkat Tinggi

Fungsi tingkat tinggi menerima atau mengembalikan sebuah fungsi. sorted, map, dan filter semuanya termasuk jenis ini. Dengan menulis fungsi sendiri, Anda dapat mengabstraksikan pola yang berulang. Kode ini menunjukkan komposisi.

def apply_twice(f, x):
    return f(f(x))

print(apply_twice(lambda n: n * 2, 3))  # 12  (3*2*2)

# Composing transformations
def compose(f, g):
    return lambda x: f(g(x))

double = lambda n: n * 2
add_one = lambda n: n + 1
double_then_add = compose(add_one, double)
print(double_then_add(5))  # 11  ((5*2)+1)

Rekursi dengan Fungsi Pembantu

Banyak solusi memasangkan fungsi luar yang menangani penyiapan dan kasus tepi dengan pembantu dalam yang menjalankan rekursi. Antarmuka publik tetap rapi dan logika terisolasi. Lihat kodenya.

def flatten(nested):
    '''Flatten an arbitrarily nested list.'''
    result = []

    def _flatten(lst):
        for item in lst:
            if isinstance(item, list):
                _flatten(item)
            else:
                result.append(item)

    _flatten(nested)
    return result

print(flatten([1, [2, [3, 4], 5], 6]))
# [1, 2, 3, 4, 5, 6]

Fungsi Parsial dengan functools.partial

functools.partial mengisi beberapa argumen terlebih dahulu dan mengembalikan callable baru. Ini berguna ketika sebuah antarmuka menginginkan fungsi tanpa argumen, tetapi Anda memerlukan satu parameter yang nilainya tetap.

from functools import partial

def power(base, exp):
    return base ** exp

square = partial(power, exp=2)
cube   = partial(power, exp=3)

print(square(5))   # 25
print(cube(3))     # 27
print(list(map(square, [1, 2, 3, 4])))  # [1, 4, 9, 16]

Lambda untuk Pembanding Khusus

Python 3 menghapus pembanding dengan dua argumen, tetapi cmp_to_key mengembalikannya untuk pengurutan yang rumit—misalnya, menyusun bilangan agar hasil penggabungannya menjadi yang terbesar. Lihat kodenya.

from functools import cmp_to_key

def largest_number(nums):
    def compare(a, b):
        if a + b > b + a: return -1
        if a + b < b + a: return 1
        return 0
    strs = list(map(str, nums))
    strs.sort(key=cmp_to_key(compare))
    result = ''.join(strs)
    return '0' if result[0] == '0' else result

print(largest_number([3, 30, 34, 5, 9]))  # '9534330'

Pemeriksaan Singkat

Pemeriksaan singkat—saatnya menunjukkan apa yang telah Anda pelajari tentang fungsi, closure, dan lambda. Tarik napas, lalu mulai. 🚀

Rangkuman Pelajaran

Rangkuman: jangan pernah menggunakan nilai bawaan yang dapat berubah (gunakan None), closure memungkinkan pembantu dalam mengakses variabel luar untuk DFS, dan alat functools seperti lru_cache mendukung solusi yang cepat.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Fungsi, Closure, dan Lambda” gratis?

Ya — teks lengkap “Fungsi, Closure, dan Lambda” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus DSA Interview Prep, upgrade ke CoddyKit PRO. Kursus DSA Interview Prep mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Fungsi, Closure, dan Lambda”?

Definisikan fungsi pembantu yang dapat digunakan kembali, gunakan argumen bawaan, dan terapkan ekspresi lambda untuk pengurutan serta pola fungsional dalam soal wawancara. Kamu berlatih DSA Interview Prep 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 DSA Interview Prep?

Tidak diperlukan pengalaman sebelumnya. DSA Interview Prep 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 4 dari 4.

Berapa lama pelajaran “Fungsi, Closure, dan Lambda” 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 DSA Interview Prep ini?

Ya. Setiap pelajaran DSA Interview Prep 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. List, Tuple, dan Slicing
  2. Dictionary dan Set dalam Python
  3. Comprehension dan Fungsi Bawaan
  4. Fungsi, Closure, dan Lambda
← Kembali ke DSA Interview Prep