Python Academy · Oppitunti

functools: partial ja reduce

Luokaa erikoistuneita funktioita partial-funktiolla ja laskekaa sekvenssien taitoksia reduce-funktiolla.

Oppitunti 3/413 vaihetta

functools: partial ja reduce on ilmainen Python Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Python Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Python Academy-kurssilla on yhteensä 4 oppituntia.

functools-moduulin yleiskatsaus

functools on vakiokirjaston moduuli, joka sisältää korkeamman asteen funktioita muiden funktioiden käsittelyyn tai palauttamiseen.

import functools

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

partial()

functools.partial(func, *args, **kw) luo uuden kutsuttavan olion, jonka jotkin argumentit on esitäytetty.

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 metodien kanssa

Käyttäkää partial-funktiota kiinteitä parametreja käyttävien metodien sovittamiseen takaisinkutsujen tai tapahtumankäsittelijöiden käyttöön.

import functools, logging

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

log_error("Something went wrong")

partial vai lambda

partial-funktiota suositellaan lambda-funktion sijaan argumenttien esitäyttöön, koska sen voi pickle-sarjoittaa, sen repr-esitys on hyvä ja se säilyttää dokumenttimerkkijonon.

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) yhdistää iteroitavan vasemmalta oikealle binäärifunktion avulla.

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

max():n rakentaminen reducella

Havainnollistakaa reduce-funktion toimintaa toteuttamalla max() uudelleen:

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

Sisäkkäisten listojen litistäminen

Käyttäkää reduce-funktiota yhdessä operator.iconcat-funktion kanssa yhden sisäkkäisyystason litistämiseen.

import functools, operator

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

URL-osoitteiden rakentaminen partial-funktiolla

Käytännöllinen partial-malli: kiinnittäkää perus-URL-osoite ja luokaa erikoistuneita pyyntöapufunktioita.

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(): Metatietojen säilyttäminen

Kun kirjoitatte dekorointifunktioita, käyttäkää @functools.wraps(wrapped)-koristetta, jotta kääre säilyttää alkuperäisen funktion nimen ja dokumenttimerkkijonon.

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 täydentää puuttuvat vertailumetodit, kun määrittelette __eq__-metodin ja yhden metodeista __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 luo funktion, joka ohjaa kutsun eri toteutuksiin ensimmäisen argumentin tyypin perusteella.

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

Pikatarkistus

Mitä functools.partial(pow, 2) luo?

Kertaus

partial esitäyttää funktion argumentteja, reduce yhdistää jonon alkiot binäärifunktion avulla, wraps säilyttää dekoroinnin metatiedot, total_ordering täydentää vertailumetodit ja singledispatch ohjaa kutsun tyypin perusteella.

Aloita maksutta

Opi Python tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
76
Oppitunnit
320

Usein kysytyt kysymykset

Onko oppitunti ”functools: partial ja reduce” ilmainen?

Kyllä – oppitunnin ”functools: partial ja reduce” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Python Academy-kurssin, päivitä CoddyKit PROhon. Python Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”functools: partial ja reduce”?

Luokaa erikoistuneita funktioita partial-funktiolla ja laskekaa sekvenssien taitoksia reduce-funktiolla. Harjoittelet Python Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Python Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Python Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.

Kuinka kauan ”functools: partial ja reduce”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Python Academy-oppitunnilla?

Kyllä. Jokainen Python Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. itertools: äärettömät ja äärelliset iteraattorit
  2. itertools: kombinatoriikka
  3. functools: partial ja reduce
  4. functools: lru_cache ja cached_property
← Takaisin: Python Academy