Wyjaśnienie lekcji
Po tej lekcji będziesz potrafić:
Kod w stylu Pythona to nie kod o najmniejszej liczbie znaków. To kod, który jasno przekazuje intencję za pomocą narzędzi Pythona.
Użyj wyrażenia listowego (comprehension), aby zbudować nową kolekcję. Użyj zwykłej pętli for, gdy celem jest widoczny efekt uboczny, na przykład wypisanie każdego wiersza, lub gdy w jednej iteracji zmienia się kilka elementów stanu. Użyj zip() dla naprawdę dopasowanych sekwencji, enumerate(), gdy liczy się numer, oraz sorted(), aby zwrócić nową uporządkowaną listę bez modyfikowania źródła.
Częsty błąd danych pojawia się, gdy filtrujesz dwie dopasowane listy osobno: ich pozostałe pozycje mogą przestać do siebie pasować. Najpierw sparuj powiązane wartości, a potem przefiltruj połączone rekordy.
Niezawodny raport jest zwykle składany w jasnych etapach: normalizacja → wybór → przekształcenie → uporządkowanie → raport. Zmaterializuj kolekcję pośrednią, gdy musisz ją obejrzeć dwa razy; w przeciwnym razie użyj wyrażenia generatorowego dla jednoprzebiegowej agregacji lub sprawdzenia.
Dla wyniku gotowości samo all() nie wystarcza, jeśli pusty zestaw sprawdzeń ma być uznany za zablokowany. Sformułuj regułę biznesową jawnie: wymagaj niepustych sprawdzeń oraz zaliczenia każdego sprawdzenia.
raw_regions = [" US ", "eu", " APAC "]
regions = [region.strip().lower() for region in raw_regions]
print(regions)
print(raw_regions[0])Wynik:
['us', 'eu', 'apac']
US Dane wejściowe pozostają nietknięte; nowa lista zawiera znormalizowane wartości.
jobs = ["api", "queue", "mail"]
owners = ["Maya", "Omar", "Lina"]
active_pairs = [(job, owner) for job, owner in zip(jobs, owners) if job != "queue"]
print(active_pairs)Wynik:
[('api', 'Maya'), ('mail', 'Lina')]Wspólne filtrowanie par zachowuje informację, który właściciel należy do którego zadania.
services = ["api", "db"]
for position, service in enumerate(services, start=1):
print(f"{position}. {service}")Wynik:
1. api
2. dbZwykła pętla jest jaśniejsza niż wyrażenie listowe używane tylko do wypisywania.
checks = ["PASS", "pass"]
normalized = [item.strip().lower() for item in checks]
ready = bool(normalized) and all(item == "pass" for item in normalized)
print(f"Ready: {ready}")Wynik:
Ready: TrueGdyby lista sprawdzeń była pusta, zabezpieczenie bool(normalized) zapobiegłoby przypadkowemu wynikowi „gotowe”.
| Zamiar | Czytelna opcja |
|---|---|
| Skonstruowanie nowej kolekcji | Wyrażenie listowe / słownikowe / zbiorowe |
| Wypisanie lub aktualizacja kilku liczników | Zwykła pętla for |
| Połączenie dopasowanych danych wejściowych | zip() przed filtrowaniem |
| Numery dla wierszy raportu | enumerate(..., start=1) |
| Sortowanie bez modyfikowania źródła | sorted(..., key=...) |
| Jednorazowa agregacja | Wyrażenie generatorowe z sum() / any() / all() |
| Potwierdzenie, że niepusty stos przeszedł | bool(items) and all(...) |
zip().all([]) oznacza, iż sprawdzono prawdziwą partię.