0Pricing
Python Academy · Lekcja

functools: partial i reduce

Proszę tworzyć wyspecjalizowane funkcje za pomocą partial oraz składać sekwencje za pomocą reduce.

functools: partial i reduce to bezpłatna lekcja Python Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Python Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Python Academy zawiera 4 lekcji w sumie.

Przegląd functools

functools to moduł biblioteki standardowej zawierający funkcje wyższego rzędu, które działają na innych funkcjach lub je zwracają.

import functools

# partial, reduce, lru_cache, wraps, cached_property ...
print(dir(functools))

partial()

functools.partial(func, *args, **kw) tworzy nowy obiekt wywoływalny z częściowo wypełnionymi argumentami.

import functools

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

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

print(square(4))  # 16
print(cube(3))    # 27

partial z metodami

Należy użyć partial, aby dostosować metody ze stałymi parametrami do użycia jako funkcje zwrotne lub procedury obsługi zdarzeń.

import functools, logging

logger = logging.getLogger("app")
log_error = functools.partial(logger.log, logging.ERROR)

log_error("Something went wrong")

partial a lambda

partial jest preferowane zamiast lambda do wstępnego wypełniania argumentów, ponieważ można je serializować za pomocą pickle, ma czytelną reprezentację repr i zachowuje docstring.

import functools

mul = lambda x, y: x * y

double_lambda = lambda x: mul(x, 2)            # lambda approach
double_partial = functools.partial(mul, y=2)   # partial approach

print(double_partial(5))   # 10

reduce()

functools.reduce(func, iterable, initial) agreguje elementy obiektu iterowalnego od lewej do prawej za pomocą funkcji dwuargumentowej.

import functools, operator

total = functools.reduce(operator.add, [1,2,3,4,5])
print(total)   # 15

product = functools.reduce(operator.mul, [1,2,3,4,5], 1)
print(product) # 120

Budowanie max() za pomocą reduce

Funkcję reduce można zilustrować, implementując ponownie max():

import functools

def my_max(seq):
    return functools.reduce(lambda a, b: a if a > b else b, seq)

print(my_max([3, 1, 4, 1, 5, 9]))  # 9

Spłaszczanie zagnieżdżonych list

Należy użyć reduce wraz z operator.iconcat, aby spłaszczyć jeden poziom zagnieżdżenia.

import functools, operator

nested = [[1,2],[3,4],[5]]
flat = functools.reduce(operator.iconcat, nested, [])
print(flat)  # [1, 2, 3, 4, 5]

partial do tworzenia adresów URL

Praktyczny wzorzec użycia partial: ustalenie bazowego adresu URL i utworzenie wyspecjalizowanych pomocników do żądań.

import functools, urllib.request

def fetch(base, path):
    url = base.rstrip("/") + "/" + path.lstrip("/")
    with urllib.request.urlopen(url) as r:
        return r.read()

github = functools.partial(fetch, "https://api.github.com")
# github("/users/octocat")

wraps(): zachowywanie metadanych

Podczas pisania dekoratorów należy użyć @functools.wraps(wrapped), aby opakowująca funkcja zachowała nazwę i docstring oryginalnej funkcji.

import functools

def decorator(func):
    @functools.wraps(func)
    def wrapper(*args, **kw):
        return func(*args, **kw)
    return wrapper

@decorator
def greet(name):
    """Say hello."""
    return f"Hello, {name}"

print(greet.__name__)  # greet
print(greet.__doc__)   # Say hello.

total_ordering

@functools.total_ordering uzupełnia brakujące metody porównywania, gdy zostaną zdefiniowane __eq__ oraz jedna z metod __lt__/__le__/__gt__/__ge__.

import functools

@functools.total_ordering
class Version:
    def __init__(self, major, minor):
        self.v = (major, minor)
    def __eq__(self, o): return self.v == o.v
    def __lt__(self, o): return self.v < o.v

print(Version(1,2) >= Version(1,1))  # True

singledispatch

@functools.singledispatch tworzy funkcję, która wybiera różne implementacje na podstawie typu pierwszego argumentu.

import functools

@functools.singledispatch
def process(arg):
    raise NotImplementedError(type(arg))

@process.register(int)
def _(n): return n * 2

@process.register(str)
def _(s): return s.upper()

print(process(5))     # 10
print(process("hi"))  # HI

Szybkie sprawdzenie

Co tworzy functools.partial(pow, 2)?

Podsumowanie

partial wstępnie wypełnia argumenty funkcji; reduce agreguje sekwencję za pomocą funkcji dwuargumentowej; wraps zachowuje metadane dekoratora; total_ordering uzupełnia metody porównywania; singledispatch wybiera implementację na podstawie typu.

Często zadawane pytania

Czy lekcja „functools: partial i reduce” jest bezpłatna?

Tak — pełny tekst „functools: partial i reduce” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Python Academy, przejdź na CoddyKit PRO. Kurs Python Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „functools: partial i reduce”?

Proszę tworzyć wyspecjalizowane funkcje za pomocą partial oraz składać sekwencje za pomocą reduce. Ćwiczysz Python Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Python Academy?

Nie wymagamy żadnego doświadczenia. Python Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „functools: partial i reduce”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Python Academy?

Tak. Każda lekcja Python Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. itertools: iteratory nieskończone i skończone
  2. itertools: kombinatoryka
  3. functools: partial i reduce
  4. functools: lru_cache i cached_property
← Powrót do Python Academy