Czy tworząc kod zastanawiasz się jak go ulepszyć? Szczególnie jeśli to Twoje pierwsze kroki z danym językiem i jeszcze nie znasz jego możliwości.
Python zaskoczył mnie swoją elastycznością już przy pierwszym spotkaniu, szczególnie, że jedyne co znałam to C++ i C#. W mojej głowie natychmiast pojawiły się pytania: ale jak to nie muszę deklarować typu? Wow, da się to zapisać w jednej linii, ale tylko jednej linii? ?
Nie wiem jak Ciebie, ale mnie urzekł swoimi możliwościami.
Programując w Pythonie, możesz stworzyć kod szybciej i prościej używając wbudowanych funkcji czy jego pozostałych supermocy ?.
Przed Tobą lista 10 trików, być może Python zaskoczy także Ciebie! ?
[EDIT] Przedstawione sposoby dotyczą Pythona w wersji 3.
1. Zmiana zawartości zmiennych
Chcesz zamienić wartości zmiennych? Nie potrzebujesz do tego żadnych pomocniczych zmiennych, zrób to w jednej linii kodu!
a, b = b, a
Przykład:
>>> a, b = 1, 2
>>> a, b = b, a
>>> print(a, b)
2 1
2. Operatory porównania
Programując dość często używamy operatorów porównania, a czy wiesz, że możesz je skrócić?
Zamiast:
number > 5 and number <= 10
skróć porównanie do:
5 < a <= 10
3. Range
Chcesz stworzyć ciąg liczb, ale nie chcesz ich wypisywać ręcznie? Czy zostaje Ci tylko wykorzystanie pętli?
Nie, użyj gotowego rozwiązania – range
, który zwraca sekwencję liczb z podanego zakresu.
Problem: Lista zawierająca liczby od 1 do 100.
Zamiast:
i = 1
numbers = []
while i <= 100:
numbers.append(i)
i += 1
print(numbers) # [1, 2, 3, ..., 99, 100]
użyj:
numbers = list(range(1,101))
Czy tak nie jest wygodniej? ?
Jak wygląda użycie range()?
range([start], stop, [step])
gdzie:
- start – początek zakresu (opcjonalnie, domyślnie 0),
- stop – koniec zakresu, granica, przed którą się zatrzymujemy,
- step – różnica występująca pomiędzy kolejnymi wartościami (opcjonalnie, domyślnie 1).
Przykłady:
>>> range(5)
range(0, 5)
>>>list(range(0,5))
[0, 1, 2, 3, 4]
>>> range(1,5)
range(1, 5)
>>> list(range(1,5))
[1, 2, 3, 4]
>>> range(1, 5, 2)
range(1, 5, 2)
>>> list(range(1, 5, 2))
[1, 3]
Czym jest range()?
Range()
zachowuje się podobnie jak lista, ale nią nie jest. Zwraca kolejne elementy listy w momencie iterowania (np. gdy używasz pętli for), nie tworząc przy tym listy, dzięki czemu oszczędza pamięć. Jeśli chcesz uzyskać listę musisz dodatkowo użyć list()
.
❗Uwaga! Range jest lazy iterable, ale nie jest iteratorem. Jeśli jesteś ciekawy, zajrzyj tu lub do dokumentacji.
4. Wycinanie list (list slicing)
Aby dostać się do wybranego elementu z listy możemy odwołać się do jego indeksu.
>>> numbers = [1, 2, 3, 4, 5]
>>> print(numbers[1])
2
Ale co jeśli chcę wybrać więcej elementów z listy?
Z Pythonem to nie problem! ?
“Wycinanie list” pozwala nam na pobranie części listy definiując początek i koniec zakresu, a także opcjonalnie krok. Co ważne, tym sposobem tworzy się nowa lista, w której zostają umieszczone kolejne elementy pasujące do zakresu.
lista[start:stop:step]
gdzie:
- start – początek zakresu, indeks, od którego zaczyna się wybór elementów,
- stop – koniec zakresu, indeks na którym kończy się wybieranie elementów (Uwaga! Element spod tego indeksu nie znajdzie się w wyniku!),
- step – pomijanie podanej liczby indeksów, np ustawiając krok na 2, otrzymamy co drugi element, na 3 co trzeci, -1 pozwoli nam na przejście po poszczególnych elementach odwrotnie, zaczynając od tyłu.
Domyślne wartości.
Jeśli nie zdefiniujesz argumentów (start, koniec i krok), przyjmą one domyślne wartości. Start będzie równy 0, stop przyjmie wartość równą długości listy, a krok 1.
Przykładowe operacje
- Wszystkie elementy listy –
numbers[:]
- Elementy od indeksu 2 do indeksu 4 –
numbers[2:4] # [3, 4]
- Od indeksu 2 do ostatniego elementu listy –
numbers[2:] # [3, 4, 5]
- Od przedostatniego do końca listy –
numbers[-2:] # [4, 5]
- Od początku do 3 indeksu –
numbers[:3] # [1, 2, 3]
- Co drugi element –
numbers[::2]
#[1, 3, 5]
- Odwrócenie listy –
numbers[::-1] # [5, 4, 3, 2, 1]
?Tę samą operację jesteś w stanie wykonać na krotkach.
❗Jeśli podając zakres odwołasz się do miejsc, które nie istnieją w tabeli nie otrzymasz błędu!
Na przykład:
>>> numbers[6:10]
[]
>>> numbers[:10]
[1, 2, 3, 4, 5]
5. List/dict/set comprehension
Chcesz wykonać operacje modyfikacji na liście, słowniku lub zbiorze?
Możesz zrobić to używając pętli for:
numbers = [1, 2, 3, 4]
squares = []
for number in numbers:
squares.append(number ** 2)
print(squares) # [1, 4, 9, 16]
Albo funkcji map i lambdy:
numbers = [1, 2, 3, 4]
squares = map(lambda number: number ** 2, numbers)
print(list(squares)) # [1, 4, 9, 16]
Lub zamiast tych rozwiązań użyj prostszego zapisu, czyli list comprehension.
numbers = [1, 2, 3, 4]
squares = [number ** 2 for number in numbers]
print(list(squares)) # [1, 4, 9, 16]
Jesteś ciekawy jak zrobić podobną operację na zbiorze czy słowniku? Zajrzyj tutaj.
6. Scalenie zawartości słowników
Operator ** rozpakowuje słowniki, co pozwala nam między innymi na scalenie ich zawartości.
>>> products1 = {"book": 50, "pen": 2}
>>> products2 = {"notebook": 5}
>>> products = {**products1, **products2}
>>> products
{'book': 50, 'pen': 2, 'notebook': 5}
? Istnieje również możliwość rozpakowania listy za pomocą operatora *.
>>> products1 = ["book", "pen"]
>>> products2 = ["notebook"]
>>> products = [*products1, *products2]
>>> products
['book', 'pen', 'notebook']
[EDIT] Dostępne od Python 3.5
7. Rozpakowanie listy/krotki
Jeśli chcesz przypisać konkretne elementy listy/krotki do zmiennych możesz użyć “rozpakowania”.
Zamiast:
>>> numbers = (1, 2, 3)
>>> a = numbers[0]
>>> b = numbers[1]
>>> c = numbers[2]
>>> print(a)
1
>>> print(f"a: {a}, b: {b}, c: {c}")
a: 1, b: 2, c: 3
możesz użyć:
>>> numbers = (1, 2, 3)
>>> a, b, c = numbers
>>> print(a)
1
>>> print(f"a: {a}, b: {b}, c: {c}")
a: 1, b: 2, c: 3
To samo możesz wykonać z użyciem listy:
>>> numbers = [1, 2, 3]
>>> a, b, c = numbers
>>> print(a)
1
>>> print(f"a: {a}, b: {b}, c: {c}")
a: 1, b: 2, c: 3
❗Uwaga! Operacja nie powiedzie się, jeśli podasz inną liczbę zmiennych niż ilość elementów w liście/krotce.
>>> a,b,c,d = numbers
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: not enough values to unpack (expected 4, got 3)
>>> a, b = numbers
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: too many values to unpack (expected 2)
Aby przypisać wszystkie elementy i uniknąć błedu zastosuj:
>>> a, *b = [1,2,3]
>>> a
1
>>> b
[2, 3]
8. Zwracanie wielu wartości z funkcji
W Pythonie bez problemu zwrócisz kilka wartości z funkcji. (Ale pamiętaj, że funkcja powinna być odpowiedzialna za jedną funkcjonalność ? )
def get_something():
....
x = 2
y = 3
return x, y
x, y = get_something()
Czy taki zapis czegoś Ci nie przypomina? Kojarzysz krotki?
>>> print(get_something())
(2, 3)
>>> print(type(get_something()))
<class 'tuple'>
>>> x, y = get_something()
>>> print(x)
2
Tak, dobrze widzisz, funkcja tak naprawdę zwraca jedną wartość – tuple.
Przypomnę, że tuple możemy stworzyć na dwa sposoby:
# Utworzenie krotki z elementami
>>> numbers = (1, 2, 3)
# Utworzenie krotki bez nawiasów
>>> numbers = 1, 2, 3
Po więcej informacji o krotce zajrzyj tutaj.
9. Łączenie elementów listy w string
A gdyby tak połączyć całą tablicę w jeden string?
lista = ["Jestem", "pogromcą", "kodu"]
print(" ".join(lista)) # Jestem pogromcą kodu
Elementy listy możesz połączyć przy pomocy dowolnego znaku.
lista = ["Jestem", "pogromcą", "kodu"]
print(",".join(lista) # Jestem,pogromcą,kodu
10. zip
Funkcja zip() przyjmuje jako argumenty iterable (np. lista), a następnie zwraca iterator, który scala poszczególne elementy z argumentów w krotki. Możesz podać dowolną ilość argumentów.
>>> products = ["book", "notebook", "pen"]
>>> prices = [50, 5, 2]
>>> print(zip(products, prices))
<zip object at 0x7f6ec6f59f40>
>>> print(list(zip(products, prices)))
[('book', 50), ('notebook', 5), ('pen', 2)]
Znałeś wszystkie przedstawione “triki”? A może coś było dla Ciebie nowością?
A może Ty podzielisz się jak efektywnie wykorzystujesz Pythona? Jeśli masz jakiś pomysł, zostaw komentarz pod tym artykułem ✍️.
Miłego dnia ☕!
Dobre, proszę o więcej