functools: partial ve reduce
partial ile özelleştirilmiş işlevler oluşturun ve reduce ile dizileri katlayın.
functools: partial ve reduce, CoddyKit'te ücretsiz bir Python Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Python Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Python Academy kursu toplamda 4 dersten oluşur.
functools Genel Bakış
functools, diğer işlevler üzerinde çalışan veya başka işlevler döndüren üst düzey işlevlerden oluşan bir standart kitaplık modülüdür.
import functools
# partial, reduce, lru_cache, wraps, cached_property ...
print(dir(functools))partial()
functools.partial(func, *args, **kw), bazı bağımsız değişkenleri önceden doldurulmuş yeni bir çağrılabilir oluşturur.
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)) # 27Yöntemlerle partial
Sabit parametrelere sahip yöntemleri geri çağrılar veya olay işleyicileri olarak kullanıma uyarlamak için partial kullanın.
import functools, logging
logger = logging.getLogger("app")
log_error = functools.partial(logger.log, logging.ERROR)
log_error("Something went wrong")partial ve lambda Karşılaştırması
Bağımsız değişkenleri önceden doldurmak için partial, lambda'ya tercih edilir; çünkü serileştirilebilir, iyi bir gösterime sahiptir ve belgeleme dizesini korur.
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), ikili bir işlev kullanarak yinelemeli nesneyi soldan sağa katlar.
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) # 120reduce ile max() Oluşturma
max() işlevini yeniden uygulayarak reduce kullanımını gösterin:
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İç İçe Listeleri Düzleştirme
Tek bir iç içelik düzeyini düzleştirmek için reduce ile operator.iconcat kullanın.
import functools, operator
nested = [[1,2],[3,4],[5]]
flat = functools.reduce(operator.iconcat, nested, [])
print(flat) # [1, 2, 3, 4, 5]URL Oluşturmak için partial
Pratik bir partial kalıbı: temel bir web adresini sabitleyin ve özelleştirilmiş istek yardımcıları oluşturun.
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(): Üst Verileri Koruma
Dekoratör yazarken, sarmalayıcının özgün işlevin adını ve belgeleme dizesini koruması için @functools.wraps(wrapped) kullanın.
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, __eq__ ile __lt__/__le__/__gt__/__ge__ yöntemlerinden birini tanımladığınızda eksik karşılaştırma yöntemlerini tamamlar.
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, ilk bağımsız değişkenin türüne göre farklı uygulamalara yönlendirme yapan bir işlev oluşturur.
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")) # HIHızlı Kontrol
functools.partial(pow, 2) ne oluşturur?
Özet
partial işlev bağımsız değişkenlerini önceden doldurur; reduce bir diziyi ikili bir işlevle katlar; wraps dekoratör üst verilerini korur; total_ordering karşılaştırma yöntemlerini tamamlar; singledispatch türe göre yönlendirme yapar.
Sıkça Sorulan Sorular
“functools: partial ve reduce” dersi ücretsiz mi?
Evet — “functools: partial ve reduce” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Python Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Python Academy kursu toplamda 4 dersten oluşur.
“functools: partial ve reduce” dersinde ne öğreneceğim?
partial ile özelleştirilmiş işlevler oluşturun ve reduce ile dizileri katlayın. Python Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Python Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Python Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.
“functools: partial ve reduce” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Python Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Python Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- itertools: Sonsuz ve Sonlu Yineleyiciler
- itertools: Kombinatorik
- functools: partial ve reduce
- functools: lru_cache ve cached_property