Blog JSystems - uwalniamy wiedzę!

Szukaj

Wyrażenia z jedną gwiazdką (*) używamy gdy do funkcji chcemy przekazać dowolną liczbę argumentów pozycyjnych. Przyjrzyjmy się prostemu przykładowi

def args(*args):
    for a in args:
        print(f'{a}')

Dla każdego elementu w "args" wypisujemy jego zawartość. Args jest więc iterowalne. Zauważ że deklarując argument piszę "*" przed args, ale już iterując po nim tego nie robię. Wywołanie funkcji:

args(1,2,3,4,5)

Powoduje wyświetlenie każdej z wartości w osobnej linii.

1

2

3

4

5

Zwróć uwagę, że elementy nie zostały przekazane jako lista, ale jako kolejne argumenty!

Przyjrzyjmy się jeszcze jednemu prostemu przykładowi:

def powiekszacz(*slowa):
    for s in slowa:
        print(s.upper())

powiekszacz('siema','tu','mapet')

Po wywołaniu dostajemy na konsoli:

SIEMA

TU

MAPET

Nazwa *args nie jest wymagana, jest to tylko taka przyjęta konwencja. Może się nazywać choćby *slowa jak w powyższym przykładzie.

Do funkcji poza parametrami *args możemy przekazać jeszcze jakieś dodatkowe parametry, ale wtedy bedą musiały być one wymienione jako pierwsze.

def dlakazdego(param1,*args):
    print(f'param1={param1}')
    for a in args:
        print(a)

dlakazdego('pierwsza wartość','pierwszy arg','drugi arg', 3)

Należy być ostrożnym przy przekazywaniu list do takiej funkcji. Weźmy pod uwagę taki przypadek:

def argi(*args):
    for e in args:
        print(e)

argi([1,2,3,4],'coś')

Przekazana lista zostaje potraktowana jako jeden element. Zobaczmy co zostało wyświetlone:

[1, 2, 3, 4]

coś

Jeśli chcemy by każdy z elementów tej listy został potraktowany jako osobny argument, musimy tę listę rozpakować za pomocą operatora "*":

argi(*[1,2,3,4],'coś')

co skutkuje wyrzuceniem na konsolę:

1

2

3

4

coś

Komentarze (0)

Musisz być zalogowany by móc dodać komentarz. Zaloguj się przez Google

Brak komentarzy...