DSA Interview Prep · leksjon

Funksjoner, closures og lambda

Definer gjenbrukbare hjelpefunksjoner, bruk standardargumenter og anvend lambda-uttrykk på sortering og funksjonelle mønstre i intervjuproblemer.

Leksjon 4 av 413 trinn

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

Standard- 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 increment

Closures 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, size

Hø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.

Gratis å komme i gang

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

  1. Lister, tupler og slicing
  2. Ordbøker og mengder i Python
  3. Comprehensions og innebygde funksjoner
  4. Funksjoner, closures og lambda
← Tilbake til DSA Interview Prep