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 Coding 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 Coding Interview Prep, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Coding 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')) # TrueArgumen 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 incrementClosure 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, sizeFungsi 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 Coding Interview Prep, upgrade ke CoddyKit PRO. Kursus Coding 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 Coding 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 Coding Interview Prep?
Tidak diperlukan pengalaman sebelumnya. Coding 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 Coding Interview Prep ini?
Ya. Setiap pelajaran Coding 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
- List, Tuple, dan Slicing
- Dictionary dan Set dalam Python
- Comprehension dan Fungsi Bawaan
- Fungsi, Closure, dan Lambda