Pytania na dziś
- Czy poniższy kod zadziała ?
- Jakiego typu będzie zmienna przekazana do funkcji ?
def nasza_funkcja(zmienna): print(type(zmienna)) lista = ['jeden', 'dwa', 'trzy'] nasza_funkcja(x * 2 for x in lista)
Zadziała, czy nie zadziała?
Oczywiście, że zadziała. Jeśli myślałeś inaczej pewnie zgubił cię pomysł mnożenia zmiennych zwierających tekst. Python nie ma z tym problemu. Zmienne typu str traktowane są podobnie jak listy. Mnożenie list jest możliwe:
>>> [1, 2, 3] * 2 [1, 2, 3, 1, 2, 3]
Podobnie wygląda sytuacja z mnożeniem zmiennych tekstowych str:
>>> 'adam' * 2 'adamadam'
Jeśli już ustaliliśmy, że powyższy kod działa zastanówmy się teraz co przekazywane jest do funkcji.
Zmienna jakiego typu trafia do naszej funkcji ?
Nasz funkcja wywoływana jest na rzecz takiego argumentu
nasza_funkcja(x * 2 for x in lista)
Jak widać jest to jakieś wyrażenie składane (ang. comprehensive). Jest to zapis uproszczony dlatego może sprawiać pewne problemy. Pełna forma wyglądałaby następująco:
nasza_funkcja((x * 2 for x in lista))
Dużo ludzi błędnie odpowiada, że to tupla, a tak nie jest. Dodatkowo nie istnieje coś takiego jak tupla składna.
Dostępne kolekcje składne w języku Python
- lista składana (ang. list comprehension)
- słownik składny (ang. dictionary comprehension)
- zbiór składany (ang. set comprehension)
- generator składny (ang. generator comprehension)
Odpowiedź
Pewnie już się domyśliłeś, że do funkcji przekazujemy generator. Używanie generatorów jest tak popularne, że powstała składnia uproszczona. Jeśli przekażesz do funkcji kolekcję składaną i jawnie za pomocą odpowiednich nawiasów nie wymusisz jej typu, Python uzna, że będzie to generator. Zachęcam do przetestowania kodu samemu.