Wyjaśnienie ćwiczenia: Funkcje i używanie dowolnej liczby argumentów - początkujący

0

Cześć,
Robię przykład z książki, z której się uczę pythona i wynika programu jest inny od tego co jest pokazane w książce.
Program wygląda następująco

def build_profile(first, last, **user_info):
	"""Budowa słownika zawierającego wszystkie informacje o użytkowniku."""
	user_info['first_name'] = first
	user_info['last_name'] = last
	return user_info

user_profile = build_profile('albert', 'einstein', location='pirnceston', field='fizyka')
print(user_profile)

I według autora powinno się wyświetlić:

{'first_name': 'albert', 'last_name': 'einstein', 'location': 'pirnceston', 'field': 'fizyka' }

niestety wynik jest taki:

{'location': 'pirnceston', 'field': 'fizyka', 'first_name': 'albert', 'last_name': 'einstein'}

Czyli zamiast pierwszej i drugiej pary klucz, wartość mamy trzecią i czwartą na początku a dopiero później wyświetla argumenty first i last.

Znalazłem na githubie rozwiązanie tego ale to już jest trochę inny kod. I chciałbym się dowiedzieć dlaczego przy tym oryginalnym nie ma zachowanej dobrej kolejności chociaż wyświetla wszystkie wartości słownika

Program z githuba z poprawnym działaniem

def build_profile(first, last, **user_info):
    """Build a dictionary containing everything we know about a user."""
    profile = {}
    profile['first_name'] = first
    profile['last_name'] = last
    for key, value in user_info.items():
        profile[key] = value
    return profile

user_profile = build_profile('albert', 'einstein',
                                location='princeton',
                                field='physics')
print(user_profile)
1

Problem wersji Pythona. Od wersji bodajże 3.8 kolejność wkładania do słownika ma znaczenie.

0

@jackweb: Ok, ale first_name i last_name i tak są podane pierwsze. To dlaczego wyrzuciło je na koniec ?

1

W pierwszym przykładzie nie są jako pierwsze, bo jako pierwsze są argumenty nazwane w funkcji. A dopiero na sam koniec dodawane jest first-name oraz last-name.

0

@jackweb: OK, ale idąc tym tokiem myślenia to w kodzie, który znalazłem na githubie powinno być tak samo. Tworzymy słownik poprzez argumenty a następne klucze są dodawane z funkcji. A tutaj jest inaczej.

Edit:
Ok, chyba już to widzę. W przykładzie z githuba funkcja najpierw tworzy pustą bibliotekę person do której przypisuje dwa klucze a dopiero później idzie iteracja dla user_info. Na sam koniec zwraca nam cały słownik z uporządkowanymi kluczami.

1 użytkowników online, w tym zalogowanych: 0, gości: 1