eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingPython i argumenty funkcji › Re: Python i argumenty funkcji
  • Data: 2021-02-17 12:40:58
    Temat: Re: Python i argumenty funkcji
    Od: Maciek Godek <g...@g...com> szukaj wiadomości tego autora
    [ pokaż wszystkie nagłówki ]

    środa, 17 lutego 2021 o 10:44:33 UTC+1 Roman Tyczka napisał(a):
    > Uczę się Pythona, trochę już ogarniam, ale trafiłem na niejasny dla mnie
    > przypadek. Wiem mniej więcej o co chodzi z parametrami w funkcjach typu
    > pozycyjnego i nazwanego (tuple i dictionary), ale nie rozumiem w
    > poniższym kodzie czegoś.
    >
    > Jest oto klasa DESCipher:
    >
    >
    > class DESCipher(blockalgo.BlockAlgo):
    > """DES cipher object"""
    >
    > def __init__(self, key, *args, **kwargs):
    > """Initialize a DES cipher object
    >
    > See also `new()` at the module level."""
    > blockalgo.BlockAlgo.__init__(self, _DES, key, *args, **kwargs)
    > [...]
    >
    > W ostatniej linii woła ona metodę __init__() klasy BlockAlgo:
    >
    > class BlockAlgo:
    > """Class modelling an abstract block cipher."""
    >
    > def __init__(self, factory, key, *args, **kwargs):
    > self.mode = _getParameter('mode', 0, args, kwargs,
    > default=MODE_ECB)
    > [...]
    >
    > Ta klasa z kolei woła metodę _getParameter().
    > I teraz dlaczego w wywołaniu metody __init__ parametry są przekazane w
    > formie jak w definicji czyli *args, **kwargs? W przykładach jakie
    > widziałem, a także w wywołaniu _getParameter() są już podane zwyczajnie,
    > czyli: args, kwargs.
    > Skąd w tym pierwszym wywołaniu i dlaczego są użyte gwiazdki (czyli w
    > formie takiej jak w definicji metody/funkcji)?

    Ściśle rzecz biorąc, dlatego, że projektant funkcji _getParameter() tak sobie
    postanowił.

    Argumenty w Pythonie są pomyślane w taki sposób, że jak masz tę gwiazdkę, to ona
    przechwyci do listy dowolnie wiele argumentów. Na przykład:

    def list(*x):
    return x

    sprawi, że jak wywołamy

    list(1,2,3)

    to w wyniku dostaniemy listę

    (1,2,3)

    Tak to wygląda w kontekście definicji. Natomiast w kontekście użycia rola gwiazdki
    jest analogiczna, Załóżmy, że mamy taką funkcję:

    def f(x, y, z):
    return [x, y, z]

    i do tego mamy listę L=(1,2,3)

    Moglibyśmy sobie wywołać funkcję f w taki sposób:

    f(L[0], L[1], L[2])

    ale jeśli zamiast tego napiszemy

    f(*L)

    to efekt będzie taki sam. (Oczywiście, możemy używać indeksowania jeżeli znamy ilość
    argumentów, którą bierze f. Natomiast w ogólnym przypadku jej nie znamy, dlatego
    przekazywanie argumentów przez operator gwiazdki jest ogólniejsze)

    Jeżeli idzie o operator dwóch gwiazdek, to jest on analogiczny, z tą różnicą, że nie
    są tworzone/rozpakowywane listy, tylko słowniki, czyli np.

    def dict(**kwargs):
    return kwargs

    sprawi, że jak napiszemy

    dict(a=5,b=10)

    to dostaniemy słownik

    {'a': 5, 'b': 10}

    I teraz jeśli mamy funkcję:

    def g(a, b):
    ...

    oraz słownik

    D = {'a':5, 'b':10}

    to zamiast pisać

    g(a=5, b=10)

    albo

    g(a=D['a'], b=D['b'])

    możemy napisać

    g(**D)

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: