Witam w czwartym artykule z serii dotyczącej tego, czego nie powinniśmy robić w Pythonie. Załączam trzy poprzednie wpisy:
- Czego nie powinniśmy robić w Pythonie? #1
- Czego nie powinniśmy robić w Pythonie? #2
- Czego nie powinniśmy robić w Pythonie? #3
Funkcja zip
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.
Czekaj, stop!
Podoba Ci się to co tworzę? Jeśli tak to zapraszam Cię do zapisania się na newsletter:Jeśli to Cię interesuje to zapraszam również na swoje social media.
Jak i do ewentualnego postawienia mi kawy :)
Zamiana wartości zmiennych z użyciem zmiennej tymczasowej
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:)
Budowanie warunkó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!
Mateusz Mazurek
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:)