İşlevler, Kapanımlar ve Lambda
Yeniden kullanılabilir yardımcı işlevler tanımlayın, varsayılan bağımsız değişkenleri kullanın ve mülakat problemlerindeki sıralama ile işlevsel kalıplara lambda ifadelerini uygulayın.
İşlevler, Kapanımlar ve Lambda, CoddyKit'te ücretsiz bir DSA Interview Prep dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, DSA Interview Prep öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. DSA Interview Prep kursu toplamda 4 dersten oluşur.
Python'da İşlev Tanımlama
Python'da işlevler birinci sınıf nesnelerdir: onları aktarabilir, döndürebilir ve saklayabilirsiniz. İyi adlandırılmış yardımcı işlevler, mülakat kodunu okunabilir kılar. Önce sınır durumlarını ele alın.
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')) # TrueVarsayılan ve Anahtar Sözcük Tabanlı Değişkenler
Varsayılan değerler, çağıranların değişkenleri atlamasına olanak tanır. Ancak liste gibi değiştirilebilir bir varsayılanı asla kullanmayın; tüm çağıranlar onu paylaşır. Çözüm, varsayılan olarak None kullanmak ve listeyi içeride oluşturmaktır. Koda bakın.
# 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 ve **kwargs
*args, fazladan konumsal değişkenleri bir demette toplar; **kwargs ise fazladan anahtar sözcük değişkenlerini bir sözlükte toplar. * işareti, bir işlevi çağırırken bir diziyi de açar.
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!Lambda İfadeleri
Bir lambda, tek satırlık küçük bir işlevdir: lambda params: expression. sorted veya max içinde hızlı bir anahtar olarak idealdir. Daha büyük işler için adlandırılmış bir def daha anlaşılırdır.
# 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))İç İçe İşlevler ve Kapanımlar
Bir kapanım, çevresindeki işlevdeki değişkenleri hatırlayan bir işlevdir. Bir işlevin içinde yardımcı işlev tanımladığınızda, bu yardımcı dış değişkenleri kullanabilir; bu, DFS için kullanışlıdır.
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Özyinelemeli DFS'de Kapanımlar
Yaygın bir kalıp şöyledir: ana işlevin içinde bir dfs yardımcısı tanımlayın ve sonuçları dıştaki bir değişkende toplamasına izin verin. İç işlev, bu kapsam üzerinde bir kapanımdır.
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.Memoisation için functools.lru_cache
lru_cache (veya 3.9 ve sonraki sürümlerde @cache), bir işlevin sonuçlarını değişkenlerine göre hatırlar ve saf Fibonacci çözümünü O(2^n) yerine O(n) hâline getirir. Değişkenlerin özetlenebilir olması gerekir; bu nedenle demet kullanın.
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Üst Düzey İşlevler
Bir üst düzey işlev, bir işlev alır veya döndürür. sorted, map ve filter bu gruba girer. Kendi işlevlerinizi yazmak, tekrarlanan kalıpları soyutlamanıza olanak tanır. Kod bileşimi gösterir.
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)Yardımcı İşlevlerle Özyineleme
Birçok çözümde, kurulumu ve sınır durumlarını ele alan dış işlev ile özyinelemeyi gerçekleştiren iç yardımcı işlev birlikte kullanılır. Temiz bir genel arayüz ve yalıtılmış bir mantık elde edilir. Koda bakın.
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]functools.partial ile Kısmi İşlevler
functools.partial, bazı değişkenleri önceden doldurur ve yeni bir çağrılabilir nesne döndürür. Bir arayüz bağımsız değişken almayan bir işlev istediğinde, ancak sizin sabitlenmiş bir parametre kümesine ihtiyaç duyduğunuzda kullanışlıdır.
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]Özel Karşılaştırıcılar için Lambda
Python 3, iki değişken alan karşılaştırıcıları kaldırdı; ancak cmp_to_key bunları zor sıralamalar için geri getirir. Örneğin sayıları, birleştirildiklerinde en büyük sayıyı oluşturacak şekilde düzenlemek için kullanılabilir. Koda bakın.
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'Kısa Kontrol
Kısa bir kontrol yapalım: İşlevler, kapanımlar ve lambda'lar hakkında neler öğrendiğinizi gösterme zamanı. Derin bir nefes alın ve başlayın. 🚀
Ders Özeti
Özet: değiştirilebilir varsayılanları asla kullanmayın (None kullanın), kapanımlar iç yardımcıların DFS için dış değişkenlere erişmesini sağlar ve lru_cache gibi functools araçları hızlı çözümlere güç verir.
Sıkça Sorulan Sorular
“İşlevler, Kapanımlar ve Lambda” dersi ücretsiz mi?
Evet — “İşlevler, Kapanımlar ve Lambda” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve DSA Interview Prep kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. DSA Interview Prep kursu toplamda 4 dersten oluşur.
“İşlevler, Kapanımlar ve Lambda” dersinde ne öğreneceğim?
Yeniden kullanılabilir yardımcı işlevler tanımlayın, varsayılan bağımsız değişkenleri kullanın ve mülakat problemlerindeki sıralama ile işlevsel kalıplara lambda ifadelerini uygulayın. DSA Interview Prep ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
DSA Interview Prep öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te DSA Interview Prep, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.
“İşlevler, Kapanımlar ve Lambda” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu DSA Interview Prep dersinde kod yazıp çalıştırabilir miyim?
Evet. Her DSA Interview Prep dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Listeler, Demetler ve Dilimleme
- Python’da Sözlükler ve Kümeler
- Kapsamlı İfadeler ve Yerleşik İşlevler
- İşlevler, Kapanımlar ve Lambda