Różnica pomiędzy list comprehension a pętlą

0

Witam ponownie. Mam prośbę o wyjaśnienie jak w temacie powyżej, jednej linijki kodu. Chodzi mi , dlaczego w takiej formie to jest napisane, czy nie można tego zrobić w samej pętli?

def stick(*args):
     args = [arg for arg in args if isinstance(arg, str)] 
     result = ','.join(args)
     return result

print(stick('sport', 'summer',8,True))

Chodzi mi o drugą linijkę kodu args = [arg for arg in args if isinstance(arg, str)] Dlaczego arg for arg in args... , zamiast for arg in args?

Może się czepiam drobiazgów, ale chcę wiedzieć co każda linijka kodu mniej więcej oznacza :)

4

Do wyszukania
➡️ list comprehension

5

Można, oczywiście, to zrobić „normalną” pętlą. Można, jak tutaj, zrobić list comprehension — szybsze, i ma tendencję do bycia czytelniejszym dla ludzi (choćby dlatego, że od razu widać, że rezultatem jest lista o pewnych cechach, podczas gdy pętla może robić cokolwiek).

Ale najbardziej pythoniczne, i najtrudniejsze do błędnego zinterpretowania, byłoby tu filterargs = filter(lambda x: isinstance(x, str), args)

Bo o ile rezultatem list comprehension mogłoby być teoretycznie cokolwiek — dowolna lista — tak rezultatem filter będzie generator jakiejś pod-listy zadanej listy. Jakiej pod-listy? Takiej, która spełnia przekazany warunek — lambda x: isinstance(x, str)

0

Dzięki Wam za informacje :)

4

Ja jeszcze tylko dodam, że ten kod jest nieoptymalny, bo tworzysz nową listę filtrując starą. Lepiej stworzyć generator w stylu:

return ','.join(arg for arg in args if isinstance(arg, str))

Ponieważ join też iteruje - więc generator sprawdzi się lepiej. Oczywiście to mikrooptymalizjacja, ale trzeba być świadomym co się dzieje :)

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