functools: partial ja reduce
Luokaa erikoistuneita funktioita partial-funktiolla ja laskekaa sekvenssien taitoksia reduce-funktiolla.
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)) # 27partial 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)) # 10reduce()
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) # 120max():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])) # 9Sisä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)) # Truesingledispatch
@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")) # HIPikatarkistus
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.
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
- itertools: äärettömät ja äärelliset iteraattorit
- itertools: kombinatoriikka
- functools: partial ja reduce
- functools: lru_cache ja cached_property