Python Language
Funkcje częściowe
Szukaj…
Wprowadzenie
Jak zapewne wiesz, jeśli pochodzisz ze szkoły OOP, specjalizowanie się w klasie abstrakcyjnej i korzystanie z niej jest praktyką, o której powinieneś pamiętać przy pisaniu kodu.
Co jeśli mógłbyś zdefiniować funkcję abstrakcyjną i specjalizować ją w celu tworzenia różnych wersji? Uważa to za rodzaj funkcji Dziedziczenie, w której łączone są określone parametry, aby były niezawodne w określonym scenariuszu.
Składnia
- częściowe (funkcja, ** params_you_want_fix)
Parametry
Param | Detale |
---|---|
x | liczba do podniesienia |
y | wykładnik potęgi |
podnieść | funkcja do specjalizacji |
Uwagi
Jak stwierdzono w dokumencie Python, funools.partial :
Zwraca nowy obiekt częściowy, który po wywołaniu będzie zachowywał się jak wywołany func z argumentami pozycyjnymi argumenty i słowa kluczowe argumenty. Jeśli do wywołania zostanie dostarczonych więcej argumentów, zostaną one dołączone do argumentów. Jeśli podano dodatkowe argumenty słów kluczowych, rozszerzają one i zastępują słowa kluczowe.
Sprawdź ten link, aby zobaczyć, w jaki sposób można wdrożyć częściowe .
Podnieś moc
Załóżmy, że chcemy podnieść x do liczby y .
Napisałbyś to jako:
def raise_power(x, y):
return x**y
Co jeśli Twoja wartość y może przyjąć skończony zestaw wartości?
Załóżmy, że y może być jednym z [3,4,5] i powiedzmy, że nie chcesz oferować użytkownikowi końcowemu możliwości korzystania z takiej funkcji, ponieważ jest ona bardzo intensywna obliczeniowo. W rzeczywistości sprawdzisz, czy pod warunkiem, że y przyjmie prawidłową wartość i przepiszesz swoją funkcję jako:
def raise(x, y):
if y in (3,4,5):
return x**y
raise NumberNotInRangeException("You should provide a valid exponent")
Niechlujny? Użyjmy abstrakcyjnego formularza i specjalizujmy go we wszystkich trzech przypadkach: zaimplementujmy je częściowo .
from functors import partial
raise_to_three = partial(raise, y=3)
raise_to_four = partial(raise, y=4)
raise_to_five = partial(raise, y=5)
co się tutaj stało? Naprawiliśmy parametry y i zdefiniowaliśmy trzy różne funkcje.
Nie musisz używać funkcji abstrakcyjnej zdefiniowanej powyżej (możesz ustawić ją jako prywatną ), ale możesz użyć funkcji częściowego zastosowania, aby poradzić sobie z podniesieniem liczby do stałej wartości.