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()
zamiasttime.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ącodef typowanie(a: int) -> typing.Tuple[str, int]
lub od Pythona 3.9def typowanie(a: int) -> tuple[str, int]
.Super, dzięki za wyjaśnienie
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
Dziękuję bardzo i powodzenia na egzaminie! 🙂