eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingPython i argumenty funkcji › Re: Python i argumenty funkcji
  • X-Received: by 2002:ac8:590b:: with SMTP id 11mr23106311qty.114.1613562058634; Wed,
    17 Feb 2021 03:40:58 -0800 (PST)
    X-Received: by 2002:ac8:590b:: with SMTP id 11mr23106311qty.114.1613562058634; Wed,
    17 Feb 2021 03:40:58 -0800 (PST)
    Path: news-archive.icm.edu.pl!news.icm.edu.pl!wsisiz.edu.pl!goblin2!goblin3!goblin1!g
    oblin.stu.neva.ru!news-out.google.com!nntp.google.com!postnews.google.com!googl
    e-groups.googlegroups.com!not-for-mail
    Newsgroups: pl.comp.programming
    Date: Wed, 17 Feb 2021 03:40:58 -0800 (PST)
    In-Reply-To: <602ce57f$0$523$65785112@news.neostrada.pl>
    Complaints-To: g...@g...com
    Injection-Info: google-groups.googlegroups.com; posting-host=213.192.68.153;
    posting-account=f7iIKQoAAAAkDKpUafc-4IXhmRAzdB5r
    NNTP-Posting-Host: 213.192.68.153
    References: <602ce57f$0$523$65785112@news.neostrada.pl>
    User-Agent: G2/1.0
    MIME-Version: 1.0
    Message-ID: <3...@g...com>
    Subject: Re: Python i argumenty funkcji
    From: Maciek Godek <g...@g...com>
    Injection-Date: Wed, 17 Feb 2021 11:40:58 +0000
    Content-Type: text/plain; charset="UTF-8"
    Content-Transfer-Encoding: quoted-printable
    Xref: news-archive.icm.edu.pl pl.comp.programming:215373
    [ ukryj 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: