CodeGym /Kursy /Python SELF PL /Zaawansowana praca z parametrami funkcji

Zaawansowana praca z parametrami funkcji

Python SELF PL
Poziom 14 , Lekcja 3
Dostępny

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 i b muszą być przekazane tylko według pozycji.
  • Zwykłe argumenty pozycyjne lub nazwane: c i d mogą być przekazane zarówno według pozycji, jak i przez nazwę.
  • Tylko nazwane argumenty: e i f muszą być przekazane tylko przez nazwę.
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION