Witam w czwartym artykule z serii dotyczącej tego, czego nie powinniśmy robić w Pythonie. Załączam trzy poprzednie wpisy:
Jak jeden mąż, osoby początkujące, pisząc kod w Pythonie i chcąc iterować po dwóch listach jednocześnie, robią coś takiego:
1 2 3 4 5 6 7 8 9 10 | >>> a = [1, 2, 3] >>> b = ['a', 'b', 'c'] >>> >>> for i, x in enumerate(a): ... value_from_b = b[i] ... print(value_from_b, x) ... a 1 b 2 c 3 |
Czyli, używając funkcji enumerate, dostają się do aktualnego indeksu i korzystając z niego, biorą wartość z drugiej tablicy. No niby można. Ale to nie jest Pythonowe rozwiązanie.
Python dostarcza wbudowane narzędzie do tego typu operacji, czyli wspomnianą w nagłówku, funkcję zip. A działa ona tak:
1 2 3 4 5 6 7 8 9 | >>> a = [1, 2, 3] >>> b = ['a', 'b', 'c'] >>> >>> for x, y in zip(a, b): ... print(y, x) ... a 1 b 2 c 3 |
Co ciekawe – ta funkcja przyjmuje jeden lub więcej iterabli (*args), więc możemy zrobić coś takiego:
1 2 3 4 5 6 7 8 9 10 | >>> a = [1, 2, 3] >>> b = ['a', 'b', 'c'] >>> c = (11, 22, 33) >>> d = 'wxz' >>> for x, y, z, w in zip(a, b, c, d): ... print(x, y, z, w) ... 1 a 11 w 2 b 22 x 3 c 33 z |
I tak, w Pythonie string jest iterable. Jeśli natomiast przekazane obiekty nie mają tej samej długości, to zip zawęża zakres do najkrótszej listy:
1 2 3 4 5 6 7 8 9 | >>> a = [1, 2, 3] >>> b = ['a', 'b', 'c', 'd', 'e'] >>> c = (11, 22, 33) >>> for x, y, z in zip(a, b, c): ... print(x, y, z) ... 1 a 11 2 b 22 3 c 33 |
To, co warto wiedzieć, poza tym jak używać tej funkcji, to to co dokładnie ona zwraca. A zwraca po prostu obiekt iterable, którego elementami są tuple zawierające wartości z przekazanych mu list.
Czyli mamy zmienną a i b. Chcemy by w zmiennej a była wartość zmiennej b i w zmiennej b była wartość zmiennej a.
I kod wygląda najczęściej tak:
1 2 3 4 5 6 7 8 9 | >>> a = 5 >>> b = 6 >>> >>> c = a >>> a = b >>> b = c >>> >>> print(a, b) 6 5 |
A możesz zrobić to znacznie ładniej:
1 2 3 4 5 | >>> a = 5 >>> b = 6 >>> a, b = b, a >>> print(a, b) 6 5 |
Przyznaj, że to raj perfekcjonistów:)
Sytuacja jest prosta – chcemy napisać warunek, który będzie sprawdzał czy wartość zmiennej zawiera się w jakimś przedziale. I dostajemy taki kod:
1 2 3 4 5 | x = 5 if x > 4 and x < 10: pass |
To, co powinniśmy zauważyć, a już na pewno nie zignorować, to reakcja PyCharma na taki kod, która sugeruje, że coś jest nie tak!
PyCharm sugeruje nam, że taki zapis jest nie Pythonowy. W Pythonie możemy tworzyć takie warunki, określając przedział bardziej matematycznie tj:
1 2 3 4 5 | x = 5 if 4 < x < 10: pass |
I to na tyle, jeśli chodzi o czwartą część. Będą kolejne, choć pewnie stali czytelnicy zauważyli, że potrzebowałem chwilowej przerwy od tej serii, to zapewniam – będą kolejne!
Oj daaawnoo mnie tu nie było. Ale wakacje to był czas dużej liczby intensywnych wyjazdów i tak naprawdę, dopiero jakoś… Read More
Cześć! Zapraszam na krótkie podsumowanie kwietnia. Wyjazd do Niemiec A dokładniej pod granicę z Francją. Chrześnica miała pierwszą komunię. Po… Read More
Ostatnio tygodnie były tak bardzo wypełnione, że nie udało mi się napisać nawet krótkiego podsumowanie. Więc dziś zbiorczo podsumuję luty… Read More
Zapraszam na krótkie podsumowanie miesiąca. Książki W styczniu przeczytałem "Homo Deus: Historia jutra". Książka łudząco podoba do wcześniejszej książki tego… Read More
Cześć! Zapraszam na podsumowanie roku 2023. Książki Zacznijmy od książek. W tym roku cel 35 książek nie został osiągnięty. Niemniej… Read More
Zapraszam na krótkie podsumowanie miesiąca. Książki W grudniu skończyłem czytać Mein Kampf. Nudna książka. Ciekawsze fragmenty można by było streścić… Read More
Pokaż komentarze
Hej,
Tytuł pierwszego rozdziału jest trochę mylący, bo pomyślałem że powinienem szerokim łukiem omijać funkcję zip, ale jak już się wczytałem to zrozumiałem.
Lubię Pythona za uproszczenie operacji swap. Lepiej się czyta kod dzięki temu. Co do operacji warunkowych to PyCharmowe rozwiązanie jest mniej czytelne. Ciekaw jestem czy wpływa ono na złożoność obliczeniową i czasową programu?
Pozdrawiam.
Cześć!
Dzięki za komentarz:) poprawiłem, faktycznie mylący, pierwszy akapit:)
Co do złożoności obliczeniowej to myślę że nie wpływa:)