Przejdź do treści

Zostań czarodziejem programowania. 10 trików w Pythonie.

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 ☕!

5 5 votes
Article Rating
guest
1 Komentarz
najstarszy
najnowszy oceniany
Inline Feedbacks
View all comments
Tomasz
Tomasz
2 lat temu

Dobre, proszę o więcej