Python: 10 trików o których warto pamiętać

W tym wpisie chciałbym przedstawić Ci kilka sztuczek dostępnych w Pythonie, które warto poznać. Przydadzą Ci się one zwłaszcza jeżeli jesteś na początku swojej przygody z nauką Pythona. Również jeżeli jesteś bardziej zaawansowany to mam nadzieję, że ten wpis pomoże Ci przypomnieć sobie co nieco.

1. Zmiana wartości zmiennych w miejscu

x, y = 11, 22
print(x, y)
x, y = y, x
print(x, y)

2. Łączenie listy stringów

W taki sposób możesz uprościć zapis tworząc np. algorytmy sortowania. W innych językach programowania, potrzebna by była tutaj dodatkowa zmienna pomocnicza, ale nie w Pythonie 😉

separately = ['P', 'y', 't', 'h', 'o', 'n']
joined = "".join(separately)
print(joined)

Zamiast używać pętli for do łączenia kolejnych elementów listy, możesz użyć metody join(). Wywołaj ją na stringu, który ma znaleźć się pomiędzy kolejnymi elementami. Może to być pusty string jak powyżej, lub np. spacja: jeżeli chcesz połączyć wyrazy.

3. Łączenie słowników

x = {'a': 1, 'b': 2, 'c':3}
y = {'d': 4, 'b': 8}
z1 = {**x, **y}
z2 = {**y, **x}

W taki sposób możesz łatwo połączyć wiele słowników w jeden. Zwróć uwagę co stanie się gdy w obu słownikach występują elementy o takim samym kluczu.

4. Odwracanie napisów

napis = "Python"
print("Od tylu:", napis[::-1])

5. Zwracanie wielu wartości z funkcji

def spam(a):
    x = a+1
    y = a*2
    z = a/3
    return x, y, z

i, j, k = spam(6)

Funkcja spam zwraca trzy wartości. Możemy je zapisać w osobnych zmiennych, jak w przykładzie powyżej. Jak również możemy zapisać jej wynik do jednej zmiennej – tupli z trzema elementami.

6. Łączenie operatorów porównania

for i in range(10):
    if 2 < i < 7:
        print(i)
    else:
        print('...')

Zamiast łączyć dwie operacje porównania operatorem and, możemy w powyższy sposób sprawdzić czy zmienna znajduje się w danym przedziale.

7. Iterowanie po wartościach i pozycjach elementów listy

l = ['a', 'b', 'c', 'd', 'e']
for index, value in enumerate(l):
    print('{} - {}'.format(index, value))

Często spotykaną konstrukcją, zwłaszcza u osób z doświadczeniem w innych językach programowania, jest iterowanie po range(len(l)) w przypadku gdy chcemy otrzymać kolejne elementy listy l. W Pythonie jeżeli zależy nam nie tylko na wartości elementu, ale również na jego pozycji, powinniśmy użyć funkcji enumerate.

8. Znajdowanie najczęściej występującego elementu listy

oceny = [1, 2, 3, 2, 3, 1, 4, 4, 4, 5, 2, 4] 
print(max(oceny, key = oceny.count)) 

Wywołanie funkcji max(oceny, key=oceny.count) pozwoli nam otrzymać wartość najczęściej pojawiającego się elementu. Jest to możliwe dzięki wykorzystaniu argumentu key i funkcji count, która zawarta jest w liście i pozwala na sprawdzenie liczby wystąpień w niej danego elementu.

9. Użycie list(dict/set) comprehension

l = [1, 2, 4, 6, 2, 7]
lc = [x*x for x in l if x%2==0]
ld = {i: v for i, v in enumerate(l)}
ls = {i*2 for i in l}

Wyrażenia typu list/dict/set comprehension służą do tworzenia zmiennych tych typów z innych iterowalnych zmiennych. Możesz nimi zastąpić w łatwy sposób funkcje map i filter, oraz wykorzystanie pętli for do tworzenia list, ponieważ ich wykonanie w większości przypadków będzie trwało krócej, a ich zapis jest zwięzły i czytelny.

10. Użycie generatorów

import time
t1 = time.clock()
sum([i * i for i in range(1, 10000000)])
print(time.clock() - t1)

t2 = time.clock()
sum((i * i for i in range(1, 10000000)))
print(time.clock() - t2)

Często spotykam się z opinią młodych adeptów Pythona, że działanie generatorów jest trudne do zrozumienia przez co ich nauka jest zaniedbywana. Jednak zrozumienie generatorów jest bardzo istotne w momencie, w których chcielibyśmy optymalizować nasz kod – generatory pozwalają nam zaoszczędzić pamięć i czas.

W powyższym przykładzie użycie generatora, zamiast tworzenia całej listy pozwoliło zaoszczędzić w moim przypadku ok. 20% czasu, oraz dużo pamięci, która nie była potrzebna do przechowywania całej listy służącej tylko do zsumowania jej elementów.


Mam nadzieję, że spodobało Ci się 10 trików, które przedstawiłem w tym artykule. Jeżeli chcesz poznać więcej dobrych praktyk stosowanych w języku Python to zapraszam Cię do lektury pozostałych artykułów na blogu, oraz do komentowania tego wpisu. Chętnie dowiem się jakich sztuczek Ty używasz na co dzień w swoim kodzie.




7 komentarzy

Apropo nowego Pythona 3.8 i przykladow to pare z nich juz nie zadziala np:

import time
t1 = time.clock()
From the Python 3.8 doc: The function time. clock() has been removed,

Faktycznie w Pythonie od wersji 3.8 ostatni przykład może wykorzystywać funkcję time.perf_counter() zamiast time.clock(), jednak sama istota używania generatorów pozostaje taka sama.

Zwracanie wielu wartości z funkcji jest super, ale jak to łączyç z typowaniem, gdy będą różne typy?
def typowanie(a: int) -> str, int:
typ1 = str(a)
typ2 = a*2
return typ1, typ2

Używając return typ1, typ2 tak naprawdę tworzymy tuplę, która zawiera dwa elementy i potem możemy ją rozpakować przypisując jej wartości do dwóch zmiennych. Zatem typowanie w tym przypadku również będzie opierało się o tuple i będzie wyglądało następująco def typowanie(a: int) -> typing.Tuple[str, int] lub od Pythona 3.9 def typowanie(a: int) -> tuple[str, int].

ja na co dzień nie używam pythona, bo dopiero się uczę na egzamin na studia podyplomowe, ale ten art. bardzo mi się spodobał spośród wielu innych; zapisuję w zakładce do ulubionych; generalnie python to świetna sprawa, nawet jako rozrywka! z pozdrowieniami, anka

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *