7.1 Uzyskanie wszystkich argumentów funkcji
W Pythonie jest kilka bardzo wygodnych sposobów, aby z wnętrza funkcji uzyskać listę wszystkich przekazanych do niej parametrów. Przejdźmy przez nie.
Używanie *args
*args
pozwala na przekazywanie dowolnej liczby argumentów pozycyjnych do funkcji. Te argumenty są pakowane w krotkę i mogą być przetwarzane wewnątrz funkcji.
def print_numbers(*args):
for arg in args:
print(arg)
print_numbers(1, 2, 3, 4, 5)
Wyjaśnienie
Funkcja print_numbers
akceptuje dowolną liczbę argumentów pozycyjnych, pakowanych w krotkę args
. Możemy przeglądać argumenty wewnątrz funkcji za pomocą pętli for
.
Zalety
- Elastyczność: Pozwala na przekazywanie dowolnej liczby argumentów do funkcji.
- Uniwersalność: Może być używane dla funkcji z nieokreśloną liczbą parametrów.
Używanie **kwargs
**kwargs
pozwala na przekazywanie dowolnej liczby nazwanych argumentów do funkcji. Te argumenty są pakowane w słownik i mogą być przetwarzane wewnątrz funkcji.
def print_person_info(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
print_person_info(name="Alice", age=30, city="New York")
Wyjaśnienie
Funkcja print_person_info
akceptuje dowolną liczbę nazwanych argumentów, pakowanych w słownik kwargs
. Możemy przeglądać argumenty wewnątrz funkcji za pomocą metody słownika items()
.
Zalety
- Elastyczność: Pozwala na przekazywanie dowolnej liczby nazwanych argumentów do funkcji.
- Czytelność: Nazwane argumenty sprawiają, że wywołania funkcji są bardziej czytelne.
7.2 Określanie typu argumentów
Tylko argumenty pozycyjne
W Pythonie 3.8 i nowszych można definiować funkcje z argumentami pozycyjnymi, które można przekazywać wyłącznie według pozycji. Robi się to za pomocą symbolu /
w definicji funkcji.
def greet(name, /, greeting="Hello"):
print(f"{greeting}, {name}!")
greet("Alice") # Wyjście: Hello, Alice!
greet("Alice", greeting="Hi") # Wyjście: Hi, Alice!
# greet(name="Alice") # Błąd: TypeError
Wyjaśnienie
Funkcja greet
akceptuje argument name
, który można przekazać tylko według pozycji. Argumenty przed /
mogą być przekazane tylko według pozycji.
Takie podejście pozwala ograniczyć sposób przekazywania argumentów, poprawiając czytelność i zapobiegając błędom.
Tylko nazwane argumenty (Keyword-Only Arguments)
Można również określić parametry funkcji, które można przekazywać tylko przez nazwę. Robi się to za pomocą symbolu *
w definicji funkcji.
def greet(*, name, greeting="Hello"):
print(f"{greeting}, {name}!")
greet(name="Alice") # Wyjście: Hello, Alice!
greet(name="Alice", greeting="Hi") # Wyjście: Hi, Alice!
# greet("Alice") # Błąd: TypeError
Funkcja greet
akceptuje argument name
, który można przekazać tylko przez nazwę. Argumenty po *
mogą być przekazane tylko przez nazwę.
Takie podejście wymusza jawne podawanie nazw argumentów, co poprawia czytelność kodu.
Kombinowanie argumentów pozycyjnych i nazwanych
Można również łączyć argumenty pozycyjne i nazwane, aby osiągnąć maksymalną elastyczność.
def greet(name, /, *, greeting="Hello"):
print(f"{greeting}, {name}!")
greet("Alice") # Wyjście: Hello, Alice!
greet("Alice", greeting="Hi") # Wyjście: Hi, Alice!
# greet(name="Alice") # Błąd: TypeError
Funkcja greet
akceptuje argument name
, który można przekazać tylko według pozycji, i nazwany argument greeting
, który musi być przekazany przez nazwę. Użycie zarówno /
, jak i *
pozwala na łączenie argumentów pozycyjnych i nazwanych.
Pełny przykład wszystkich trzech sytuacji:
def full_example(a, b, /, c, d, *, e, f):
print(f"a={a}, b={b}, c={c}, d={d}, e={e}, f={f}")
# Wywołanie funkcji z różnymi argumentami
full_example(1, 2, 3, 4, e=5, f=6) # Wszystkie argumenty przekazane poprawnie
# full_example(a=1, b=2, c=3, d=4, e=5, f=6) # Błąd: TypeError
Wyjaśnienie
- Tylko argumenty pozycyjne:
a
ib
muszą być przekazane tylko według pozycji. - Zwykłe argumenty pozycyjne lub nazwane:
c
id
mogą być przekazane zarówno według pozycji, jak i przez nazwę. - Tylko nazwane argumenty:
e
if
muszą być przekazane tylko przez nazwę.
GO TO FULL VERSION