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.

testuj kod