Funksjoner, closures og lambda
Definer gjenbrukbare hjelpefunksjoner, bruk standardargumenter og anvend lambda-uttrykk på sortering og funksjonelle mønstre i intervjuproblemer.
Funksjoner, closures og lambda er en gratis leksjon i DSA Interview Prep på CoddyKit. Dette er leksjon 4 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i DSA Interview Prep, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i DSA Interview Prep inneholder totalt 4 leksjoner.
Definere funksjoner i Python
Funksjoner er førsteklasses i Python: du kan sende dem rundt, returnere dem og lagre dem. Hjelpefunksjoner med gode navn gjør intervjukode lett å lese. Håndter spesialtilfeller først.
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')) # TrueStandard- og nøkkelordargumenter
Standardverdier lar kallere utelate argumenter. Men bruk aldri en endringsbar standardverdi som en liste – alle kallere deler den. Løsningen er å bruke None som standard og opprette listen inne i funksjonen. Se koden.
# 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 og **kwargs
*args samler ekstra posisjonsargumenter i en tuple, mens **kwargs samler ekstra nøkkelordargumenter i en dict. * pakker også ut en sekvens når du kaller en funksjon.
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-uttrykk
En lambda er en liten funksjon på én linje: lambda params: expression. Den er perfekt som en rask key i sorted eller max. For noe mer omfattende er en navngitt def tydeligere.
# 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))Nestede funksjoner og closures
En closure er en funksjon som husker variabler fra funksjonen rundt seg. Definer en hjelpefunksjon inne i en annen funksjon, så kan den bruke variablene utenfra – nyttig for 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 incrementClosures i rekursiv DFS
Et vanlig mønster er å definere en dfs-hjelpefunksjon inne i hovedfunksjonen og la den samle resultater i en ytre variabel. Den indre funksjonen er en closure over dette området.
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 for memoisering
lru_cache (eller @cache i 3.9+) husker resultatene fra en funksjon basert på argumentene og gjør naiv Fibonacci om fra O(2^n) til O(n). Argumentene må kunne hashes, så bruk tupler.
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, sizeHøyereordensfunksjoner
En høyereordensfunksjon tar imot eller returnerer en funksjon. sorted, map og filter er alle eksempler. Når du skriver dine egne, kan du abstrahere gjentatte mønstre. Koden viser komposisjon.
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)Rekursjon med hjelpefunksjoner
Mange løsninger kombinerer en ytre funksjon som håndterer oppsett og spesialtilfeller, med en indre helper som utfører rekursjonen. Da får du et ryddig offentlig API og isolert logikk. Se koden.
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]Partielle funksjoner med functools.partial
functools.partial fyller inn noen argumenter på forhånd og returnerer en ny kallbar funksjon. Det er nyttig når et API krever en funksjon uten argumenter, men du trenger å binde én parameter.
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 for egendefinerte komparatorer
Python 3 fjernet komparatorer med to argumenter, men cmp_to_key gjør dem tilgjengelige igjen for krevende sorteringsrekkefølger – for eksempel å ordne tall slik at sammenkoblingen deres blir størst. Se koden.
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'Rask sjekk
Rask sjekk – nå skal du vise hva du har lært om funksjoner, closures og lambdaer. Trekk pusten, og sett i gang. 🚀
Oppsummering av leksjonen
Oppsummering: bruk aldri endringsbare standardverdier (bruk None), closures lar indre hjelpefunksjoner nå ytre variabler i DFS, og functools-verktøy som lru_cache gjør raske løsninger mulig.
Lær deg Python med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 30
- Leksjoner
- 120
Ofte stilte spørsmål
Er leksjonen «Funksjoner, closures og lambda» gratis?
Ja – hele teksten i «Funksjoner, closures og lambda» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av DSA Interview Prep-kurset, kan du oppgradere til CoddyKit PRO. Kurset i DSA Interview Prep inneholder totalt 4 leksjoner.
Hva lærer jeg i «Funksjoner, closures og lambda»?
Definer gjenbrukbare hjelpefunksjoner, bruk standardargumenter og anvend lambda-uttrykk på sortering og funksjonelle mønstre i intervjuproblemer. Du øver på DSA Interview Prep med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med DSA Interview Prep?
Ingen tidligere erfaring er nødvendig. DSA Interview Prep på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 4 av 4.
Hvor lang tid tar leksjonen «Funksjoner, closures og lambda»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne DSA Interview Prep-leksjonen?
Ja. Alle DSA Interview Prep-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Lister, tupler og slicing
- Ordbøker og mengder i Python
- Comprehensions og innebygde funksjoner
- Funksjoner, closures og lambda