To już piąty wpis z serii „Kurs Python 3 by MR”. I co ciekawe, post ten jest jubileuszowy, bo 50 na blogu! Poznamy tu między innymi struktury danych w Python.

Po ponad miesiącu kwarantanny sam po sobie czuję zmęczenie, lecz postanowiłem wzmocnić działania i pisać jeszcze dłuższe posty. Dodatkowo pojawił się również pierwszy post z serii recenzji, który swoją premierę miał nietypowo, bo w czwartek.

Niech więc nie będzie dla Ciebie zdziwieniem to, że dzisiejszy artykuł jest jak do tej pory najdłuższym z całej serii.

Dodatkowo małe info. Kurs Python 3 by MR przybrał nową formę. Zaczęły pojawiać się darmowe odcinki na kanale YouTube, a w nich między innymi kodowanie na ekranie! Wpadnij na kanał, jeżeli jeszcze Cię tam nie ma.

Dzisiejszy temat obejmie kilka kolejnych, istotnych zagadnień:

  • Czym są i jakie mamy rodzaje pętli?
  • Jak używane są instrukcje break i continue?
  • Jakie mamy struktury danych w Python?
  • Do czego używamy list czy krotek?
  • Czym są listy mieszane?

Pytania dotyczą dwóch niezwykle szerokich zagadnień, więc nie traćmy czasu i zaczynajmy!

Wprowadzenie

Podkręcone tempo to również większa ilość materiału do przyswojenia. Wpis ten zacznę od kolejnego z kanonów programowania ogólnie, czyli od pętli. Akapit z pętlami podzielę na dwa mniejsze, w których na przykładach omówię dwa rodzaje tej programistycznej konstrukcji.

Kolejnym akapitem będzie akapit, w którym poruszę szerzej temat struktur danych. Jest ich kilka w języku Python w wersji 3. Między innymi listy czy krotki.

Pętle 

Warto sobie odpowiedzieć, czym w ogóle jest pętla. W wielkim skrócie pętla to taka konstrukcja języka, która pozwala przechodzić po sekwencjach, takich jak listy, napisy, tablice czy słowniki. Są też takie pętle, które wykonują swoje działanie do pewnego określonego z góry momentu.

Jednym słowem pętla służy do powtarzania konkretnej instrukcji wielokrotnie. Wyobraź sobie, że masz za zadanie wypisać na ekran 10 cyfr — od 1 do 10. 

Bez znajomości pętli zrobisz to pewnie w ten sposób.

print(0)
print(1)
print(2)
print(3)
print(4)
print(5)
print(6)
print(7)
print(8)
print(9)

Rozwiązanie to jest kiepskie, mało estetyczne i zajmuje zbyt dużo miejsca. Z rozwiązaniem tego typu problemów pomaga nam właśnie konstrukcja pętli.

Pętli w programowaniu na ogół mamy dwa rodzaje — pętlę for oraz pętlę while. Nie inaczej jest w języku Python.

Pętla for

Zacznę od bardziej popularnej pętli. Pętla for posiada następującą składnię:

for wartość in sekwencja[lista,napis,tablica,słownik]:
        #instrukcje do wykonania

gdzie,

wartość będzie przyjmować kolejne wartości elementów tej listy podczas wykonywania pętli, zaczynając od elementu pierwszego.

sekwencja to zbiór elementów, który określa liczbę kroków do wykonania. Może być tam użyta funkcja, która określi liczbę kroków (funkcja range) lub liczba ta może być równa wielkości zbioru, po którym będzie następowała iteracja.

instrukcje do wykonania to kod, który z każdą kolejną iteracją zostanie wykonany.

Spróbujmy teraz wywołać kod, który wypisze 10 cyfr, tak jak to zrobiłem w przykładzie wyżej.

for wartosc in range(10):
    print(wartosc)

Wynik będzie identyczny, jak przy kodzie z dziesięcioma funkcjami print, jednak zajmuje kilka razy mniej miejsca!

Wygodne prawda?

Sprawdzę jeszcze jeden przykład. Zadeklaruję tablicę z imionami, kolejno Adam, Ewa, Anna, Jan i  Piotr. Aby je wypisać w pętli, wystarczy taka forma iteracji jak poniżej.

names = ["Adam", "Ewa", "Anna", "Jan", "Piotr"]

for name in names:
    print(name)
Range

Pojawiła się w pierwszej pętli funkcja range, która jest jedną z funkcji biblioteki standardowej. Jej zadaniem jest wykonanie akcji określoną ilość razy. Funkcja przyjmuje na start trzy parametry.

range(start, stop, step)

gdzie:

  • start to parametr opcjonalny, od którego nastąpi start. Domyślnie jest to wartość 0.
  • stop to parametr, do którego będzie wykonywana iteracja. Ważne! Liczba ta nie będzie wliczona do iteracji, więc gdy chcemy odliczyć do 10 włącznie, to musimy tu podać wartość 11.
  • step to parametr opcjonalny,  który określa, co jaki element ma działać iteracja

Można ją wywołać na trzy różne sposoby:

  • Podając wartość, do której ma nastąpić iteracja:

>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

  • Podając wartości od początku zakresu do końca:

>> range(4, 10)
[4, 5, 6, 7, 8, 9]

  • Podając wartości od początku zakresu do końca oraz krok, co który ma nastąpić iteracja:

>> range(0, 10, 3)
[0, 3, 6, 9]

Pętla while

Czas przejść do drugiego rodzaju pętli. Jest to pętla, która działa do momentu, aż nie nastąpi spełnienie warunku lub nie pojawi się instrukcja przerywająca.

Pętla tego rodzaju jest dobra do zastosowania w przypadku tak zwanej pętli nieskończonej, czyli chcemy, by nasz kod wykonywał się ciągle, na przykład wyrysowywał MENU w konsoli.

Sprawdzimy jednak prosty przykład, chcemy zsumować dziesięć pierwszych cyfr.

currentStep = 1
retValue = 0

while currentStep <= 10:
    retValue += currentStep
    currentStep += 1

print(retValue)

Deklarujemy zmienną currentStep, która przechowa informacje o aktualnym kroku oraz zmienną retValue, która przechowa końcowy wynik. Pętla while będzie działać do momentu, aż aktualny krok pętli będzie większy bądź równy 10. Warto tu zauważyć, że currentStep jest co iteracja pętli podnoszony o jeden w górę, co gwarantuje to, że pętla kiedyś się skończy.

Na koniec wypisujemy wartość zmiennej retValue, która z każdym krokiem pętli podnoszona jest o kolejną liczbę naturalną.

Proste prawda? 

Break

Zmodyfikuje kod i dodam funkcję przerwania. Nie zawsze oczywisty jest koniec pętli, dlatego trzeba wymusić jej przerwanie w ściśle określony sposób. Do tego służy instrukcja break.

Zobacz na schemat poniżej. Jeżeli zmienna currentStep jest mniejsza od 10 i jednocześnie mniejsza od 6, to pętla działa, w innym przypadku pętla kończy swoje działanie. Warto zauważyć, że nigdy w tym przypadku nie przejdziemy ścieżką Jeśli currentStep > 10.

Schemat blokowy instrukcji Break

Kod zgodnie ze schematem blokowym będzie prezentował się następująco.

currentStep = 1
retValue = 0

while currentStep <= 10:
    retValue += currentStep
    currentStep += 1

    if currentStep == 6:
        break

print(retValue)
Continue

Czas na drugą instrukcję używaną w pętlach. Chodzi o instrukcję continue, której zadaniem jest przeskoczenie do kolejnego kroku. W tym przypadku, gdy currentStep będzie większy od 6, to nastąpi przeskok do początku pętli. Spowoduje to pewne zachowanie, które będzie trochę inne niż w przypadku instrukcji break. Polecam Ci odpalić te dwa przykłady i porównać zachowanie pętli z break oraz continue!

Schemat blokowy wygląda następująco.

Kod zgodnie ze schematem blokowym będzie prezentował się następująco.

currentStep = 0
retValue = 0

while currentStep <= 10:
    currentStep += 1
    if currentStep > 6:
        continue

    retValue += currentStep

print(retValue)

Czas przejść dalej i sprawdzić, jakie są struktury danych w Python.

Struktury danych w Python

Na początku odpowiem na pytanie, czym jest struktura danych ogólnie w programowaniu. Jest to sposób, w jaki przechowywane są w pamięci dane. Ważne jest, by podczas pisania algorytmów dobierać odpowiedni sposób na przechowywanie danych, ponieważ może on znacząco poprawić czas działania algorytmu. 

Struktury danych są tak powszechne w językach programowania, że większość bibliotek standardowych danych języków je dostarcza.

Struktury danych w Python, które występują w bibliotece standardowej to:

  • listy
  • krotki, inaczej zwane tuples
  • słowniki
  • zbiory

Każdy z tych zbiorów ma swoje wady i zalety, więc czas się im bliżej przyjrzeć.

Listy

Python oferuje bardzo szeroką gamę typów danych. Listy są najpopularniejszą strukturą. Zawdzięczają to prostocie dostępu do danych, uporządkowaniu danych, mnogością sytuacji, gdzie może zostać użyta i bardzo dużej elastyczności. Przez to jednak jednym z zarzutów w stosunku do niej może być słabsza wydajność przy większych zbiorach.

Ważną cechą listy jest jej zmienność, czyli mamy możliwość zmian wartości listy lub całej listy już po jej utworzeniu. Co ciekawe listy mogą zawierać zmieszane elementy, nie są więc jednego typu.

Aby zadeklarować listę, musimy użyć po znaku równości nawiasów kwadratowych []. Później takie listy możemy w prosty sposób wypisać zarówno za pomocą funkcji print, jak i pętli.

# pusta lista
my_empty_list = []
print(my_empty_list)
for element in my_empty_list:
    print(element)

# lista liczb
my_integers_list = [1, 2, 3]
print(my_integers_list)
for element in my_integers_list:
    print(element)

# lista elementów zmieszanych
my_mixed_list = [1, "To jest napis", 3.4, False]
print(my_mixed_list)
for element in my_mixed_list:
    print(element)

Wynikiem powyższego kodu będzie wypisanie zarówno całych list. jak i poszczególnych elementów.

C:\REPO\BLOG\Wpis50\venv\Scripts\python.exe C:/REPO/BLOG/Wpis50/Listy.py
[]
[1, 2, 3]
1
2
3
[1, 'To jest napis', 3.4, False]
1
To jest napis
3.4
False

Process finished with exit code 0

Oczywiście lista jest taką strukturą, z której możemy w dowolnym momencie sięgnąć po konkretną wartość w liście. Aby do tego doszło, musimy użyć nawiasów [] zaraz po nazwie listy.

my_mixed_list = [1, "To jest napis", 3.4, False]
print(my_mixed_list[1])
print(my_mixed_list[0])
print(my_mixed_list[-1])
print(my_mixed_list[:2])
print(my_mixed_list[2:3])
print(my_mixed_list[4])


'''
WYNIK
To jest napis
1
False
[1, 'To jest napis']
[3.4]
Traceback (most recent call last):
  File "C:/REPO/BLOG/Wpis50/Listy.py", line 23, in <module>
    print(my_mixed_list[4])
IndexError: list index out of range
'''

W wyniku poniżej kodu widzimy ciekawe rzeczy. Pierwsze dwa wywołania funkcji print nie zaskakują niczym. Po prostu pobieramy drugi i pierwszy element z listy, bo należy pamiętać, że listy numerowane są od 0.

W trzecim wywołaniu użyłem indeksu o wartości -1, co powinno być okraszone błędem. Nic bardziej mylnego! Po prostu zaglądamy dzięki temu do ostatniego elementu w liście, czyli wartości False. Gdybym użył -2, wtedy pobrana zostałaby wartość przedostatnia, czyli 3.4.

Kolejne dwa ciekawe wywołania, to te z użyciem znaku :. Pozwala on na wypisanie pewnego podzbioru z danej listy. W przypadku :2, wypisze dwa pierwsze elementy, w przypadku 2:3 wypisze te od dwójki do trójki, lecz bez tej trójki!

Ostatnie wywołanie to coś w listach standardowego i oczekiwanego. Przekroczyliśmy zakres listy, dlatego dostajemy komunikat z błędem. A teraz zadam Ci pytanie, co się stanie, gdy użyjemy indeksu o wartości -5 lub jeszcze mniejszego? Na to pytanie możesz udzielić odpowiedzi w komentarzu!

in/not in

Poruszę jeszcze jeden ciekawy element dotyczący pracy z listami. Chodzi o operator in oraz not in. Dzięki temu operatorowi, nie musimy sprawdzać listy element po elemencie z użyciem pętli for, tylko po prostu napisać warunek z użyciem jednego z dwóch operatorów.

Wystarczy zastosować prostą instrukcję warunkową, by sprawdzić, czy szukany element występuje w liście.

Poniżej zademonstruję fragment kodu, widzimy tam listę przykładowych imion oraz instrukcje warunkowe sprawdzające, czy dane imiona występują lub nie występują w liście.

my_list = ["Adam", "Anna", "Jan", "Kamil", "Norbert", "Katarzyna", "Tomasz"]

#in
if ("Jan" in my_list):
    print("Jan znajduje się w liście")
else:
    print("Jan nie znajduje się w liście")

if ("Karolina" in my_list):
    print("Karolina znajduje się w liście")
else:
    print("Karolina nie znajduje się w liście")

#not in
if ("Anna" not in my_list):
    print("Anna nie znajduje się w liście")
else:
    print("Anna znajduje się w liście")

if ("Stanisław" not in my_list):
    print("Stanisław nie znajduje się w liście")
else:
    print("Stanisław znajduje się w liście")


'''
WYNIK

Jan znajduje się w liście
Karolina nie znajduje się w liście
Anna znajduje się w liście
Stanisław nie znajduje się w liście

Process finished with exit code 0


'''
Operacje i funkcje na listach

Wspomniałem wyżej, że listy są najbardziej popularną strukturą danych w języku Python. Ma ona również bardzo dużą liczbę operacji i funkcji, które można na niej wykonywać. Są to między innymi:

len() 

Funkcja len jest jednoparametrową funkcją, która na wejście przyjmuje sprawdzaną listę i jako wyjście zwraca informacje na temat liczby elementów w liście.

my_list = ["Adam", "Anna", "Jan", "Kamil", "Norbert", "Katarzyna", "Tomasz"]

print(len(my_list))

'''
WYNIK

7

Process finished with exit code 0
'''
max() oraz  min()

Funkcja na wejście przyjmuje między innymi naszą listę. W przypadku max zwraca największy element z listy, z funkcji min natomiast zwróci najmniejszy element z listy. Bardzo dobrze widać to na poniższym przykładzie. Nie zwróci pierwszego i ostatniego elementu, tylko element pierwszy i ostatni w kolejności alfabetycznej!

my_list = ["Jan", "Anna", "Adam", "Kamil", "Tomasz", "Katarzyna", "Norbert"]

print(max(my_list))
print(min(my_list))

'''
WYNIK

Tomasz
Adam

Process finished with exit code 0
'''
append

Metoda append dodaje na końcu listy element. 

my_list = ["Jan", "Anna", "Adam", "Kamil", "Tomasz", "Katarzyna", "Norbert"]
my_list.append("Zofia")
print(my_list)

'''
WYNIK

['Jan', 'Anna', 'Adam', 'Kamil', 'Tomasz', 'Katarzyna', 'Norbert', 'Zofia']

Process finished with exit code 0
'''
extend

Funkcja podobna do wspomnianej powyżej. Jej zadaniem jest również dodanie do listy elementów na koniec. Jednak w tym przypadku nie jest to pojedynczy element, lecz cała lista elementów. Widać to dobrze w napisie, który jest również listą pojedynczych znaków.

my_list = ["Jan", "Anna", "Adam", "Kamil", "Tomasz", "Katarzyna", "Norbert"]
my_list.extend("Joanna")
print(my_list)

'''
WYNIK

['Jan', 'Anna', 'Adam', 'Kamil', 'Tomasz', 'Katarzyna', 'Norbert', 'J', 'o', 'a', 'n', 'n', 'a']

Process finished with exit code 0
'''
count

Funkcja count może być nieco myląca i sugerować identyczne działanie jak len(). Nic bardziej mylnego, jej działanie polega na zliczeniu wystąpienia danego obiektu w liście. 

my_list = ["Jan", "Anna", "Adam", "Kamil", "Tomasz", "Katarzyna", "Norbert"]
print(my_list.count("Adam"))

'''
WYNIK

1

Process finished with exit code 0
'''
insert

Jak sama nazwa wskazuje, funkcja Insert dodaje element do zbioru. Ważne jest to, by podać dwa parametry, pierwszym będzie miejsce w liście, gdzie element ma zostać wstawiony, a następnie element, który chcemy wstawić.

my_list = ["Jan", "Anna", "Adam", "Kamil", "Tomasz", "Katarzyna", "Norbert"]
my_list.insert(2, "Mateusz")
print(my_list)

'''
WYNIK

['Jan', 'Anna', 'Mateusz', 'Adam', 'Kamil', 'Tomasz', 'Katarzyna', 'Norbert']

Process finished with exit code 0
'''
index

Funkcja Index jest również intuicyjna. Zwraca informacje, na którym miejscu w liście leży dany element.

my_list = ["Jan", "Anna", "Adam", "Kamil", "Tomasz", "Katarzyna", "Norbert"]
print(my_list.index("Kamil"))

'''
WYNIK

3

Process finished with exit code 0
'''
pop

Funkcja Pop pozwala programiście na usunięcie elementu kryjącego się pod wskazanym indeksem.

my_list = ["Jan", "Anna", "Adam", "Kamil", "Tomasz", "Katarzyna", "Norbert"]
my_list.pop(4)
print(my_list)

'''
WYNIK

['Jan', 'Anna', 'Adam', 'Kamil', 'Katarzyna', 'Norbert']

Process finished with exit code 0
'''
remove

Funkcja Remove działa podobnie jak funkcja Pop, z tym, że usuwa pierwszy pasujący element z listy.

my_list = ["Jan", "Anna", "Adam", "Kamil", "Tomasz", "Kamil", "Katarzyna", "Norbert"]
my_list.remove("Kamil")
print(my_list)

'''
WYNIK

['Jan', 'Anna', 'Adam', 'Tomasz', 'Kamil', 'Katarzyna', 'Norbert']

Process finished with exit code 0
'''
clear

Przedostatnią omawianą funkcją jest funkcja, która czyści całą listę.

my_list = ["Jan", "Anna", "Adam", "Kamil", "Tomasz", "Katarzyna", "Norbert"]
my_list.clear()
print(my_list)

'''
WYNIK

[]

Process finished with exit code 0
'''
reverse

Ostatnia funkcja, którą przyszło mi omówić to funkcja, która pozwala programiście na szybkie odwrócenie listy.

my_list = ["Jan", "Anna", "Adam", "Kamil", "Tomasz", "Katarzyna", "Norbert"]
my_list.reverse()
print(my_list)

'''
WYNIK

['Norbert', 'Katarzyna', 'Tomasz', 'Kamil', 'Adam', 'Anna', 'Jan']

Process finished with exit code 0
'''

I to by było na tyle. Warto wspomnieć, że funkcji takich w języku Python jest więcej, w oficjalnej dokumentacji wbudowanych funkcji jest około 50. Zachęcam do zobaczenia ich.

Krotki

Czas przejść do drugiej struktury danych, która jest dostępna w języku Python. Pierwszą i zarazem najbardziej znaczącą różnicą między listą a krotką jest to, że gdy stworzymy naszą krotkę, to w późniejszym etapie działania aplikacji nie będzie możliwości podmienić tam wartość!

Aby stworzyć krotkę, po prostu po znaku równości podajemy wartości po przecinku. Nie ma potrzeby stosowania żadnego nawiasu. Można użyć nawiasów zwykłych (), jednak z reguły się ich nie używa.

Jak zauważymy poniżej, możemy w ten sam sposób jak wcześniej wypisać całą zawartość struktury, wypisać poszczególny element, lecz przy próbie zmiany dostaniemy błąd.

krotka = 4, -6, 31.1, "Testowy napis", False

print(krotka)
print(krotka[3])

krotka[1] = 12

'''
WYNIK

(4, -6, 31.1, 'Testowy napis', False)
Testowy napis

Traceback (most recent call last):
  File "C:/REPO/BLOG/Wpis50/Krotki.py", line 6, in <module>
    krotka[1] = 12
TypeError: 'tuple' object does not support item assignment

Process finished with exit code 1
'''

Powstaje jednak jedno zasadnicze pytanie. Skoro krotka jest niemal identyczną strukturą danych jak lista to w zasadzie, po co jej używać? 

Odpowiedź jest prosta. Skoro krotka, to taka struktura, która jest niezmienna, to od razu możemy zaoszczędzić zbędnych obliczeń, chociażby na to, by wyliczyć liczbę elementów i to, gdzie jaka wartość się znajduje. Powoduje to też sytuację, że nie mamy do dyspozycji tylu funkcji, ile jest dostępnych w przypadku list.

Słowniki

Czas na trzeci rodzaj struktury danych w Python, czyli słownik, z angielskiego dictionary. Były użyte już nawiasy kwadratowe i zwykłe, czas na użycie nawiasów klamrowych! Poza klamrami struktura wewnątrz słownika jest nieco inna niż w przypadku list i krotek.

Każdy z elementów słownika podzielony jest na dwie składowe:

  • key – klucz elementu
  • value – wartość elementu

Klucz i wartość rozdzielane są znakiem dwukropka :, elementy natomiast standardowo przecinkiem. Jak można się domyślać, klucze w słownikach są unikalne.

Bardzo ciekawą cechą takiej struktury danych w Python jest to, że tak jak w przypadku dwóch powyższych, w pewnym sensie znaczenie miała kolejność, tak tu klucz taką kolejność spycha na dalszy plan.

W łatwy sposób dzięki obecności klucza możemy dodawać i podmieniać wartości. Klucz może mieć również klucz inny niż liczba. Dla przykładu niech będzie tekstowy.

W przypadku słowników możemy używać metod takich samych jak przy listach.

my_dict = {1: "Anna", 2: "Mateusz", 3: "Jan", 4: "Janusz", 5: "Kamila", 6: "Marta"}
print(my_dict)

my_dict[4] = "Karolina"
print(my_dict)

my_dict[7] = "Adam"
print(my_dict)

my_new_dict = {"imie": "Jan", "nazwisko": "Nowak"}
print(my_new_dict)
print(my_new_dict["imie"])

my_dict = {1: "Anna", 2: "Mateusz", 3: "Jan", 4: "Janusz", 5: "Kamila", 6: "Marta"}
print(len(my_dict))
my_dict.pop(5)
print(my_dict)

'''
WYNIK

{1: 'Anna', 2: 'Mateusz', 3: 'Jan', 4: 'Janusz', 5: 'Kamila', 6: 'Marta'}
{1: 'Anna', 2: 'Mateusz', 3: 'Jan', 4: 'Karolina', 5: 'Kamila', 6: 'Marta'}
{1: 'Anna', 2: 'Mateusz', 3: 'Jan', 4: 'Karolina', 5: 'Kamila', 6: 'Marta', 7: 'Adam'}
{'imie': 'Jan', 'nazwisko': 'Nowak'}
Jan
6
{1: 'Anna', 2: 'Mateusz', 3: 'Jan', 4: 'Janusz', 6: 'Marta'}

Process finished with exit code 0
'''

Czas przejść do ostatniego rodzaju struktury danych w Python. 

Zbiory

Zbiór jest ciekawym tworem, podobnym w swej budowie do słowników, ponieważ zaczynają się od nawiasów klamrowych {}. Różnicą numer jeden jest to, że nie stosujemy tu budowy typu klucz-wartość.

W zbiorze przechowujemy jedynie wartości, które są unikalne. Gdy podamy tę samą wartość więcej niż jeden raz, ona zniknie. To, co warto jeszcze zapamiętać to brak kolejności. Nie zostaje ona zachowana względem tego, jak utworzyliśmy zbiór. 

Najczęściej wspominaną metodą podczas działania na zbiorach jest metoda set, która na przykład ze zwykłej listy potrafi zrobić unikalny zbiór poprzez usunięcie duplikatów. Bardzo dużą potęgę zbiorów możemy zauważyć przy wynikających z matematyki operacji, takich jak sprawdzenie elementów w zbiorach. W łatwy sposób można sprawdzić, jakie wspólne elementy zawierają zbiory my_set i my_second_set.

Tak samo możemy sprawdzić wszystkie elementy w dwóch zbiorach. Kolejną operacją jest unikalność danych w zbiorach. Za pomocą operatora minus dowiemy się, które wartości w zbiorze my_set nie występują w zbiorze my_second_set. Ostatnią operacją na zbiorach, którą możemy zrobić to koniunkcja ^, czyli wyświetlenie unikalnych elementów dla zbioru my_set oraz my_second_set.

my_set = {1, -5, -32, 1, -54, 100, 2}
print(my_set)

my_list = [1, -5, -32, 1, -54, 100, 2]
print(my_list)
print(set(my_list))

my_set = {1, -5, -32, 1, -54, 100, 2}
my_second_set = {1, 2, -3, 4, -5, 12, 2}
print(my_set&amp;my_second_set)
print(my_set|my_second_set)
print(my_set-my_second_set)
print(my_set^my_second_set)

'''
WYNIK

{-32, 1, 2, 100, -54, -5}
[1, -5, -32, 1, -54, 100, 2]
{-32, 1, 2, 100, -54, -5}
{1, 2, -5}
{-32, 1, 2, 100, 4, -54, 12, -5, -3}
{-32, -54, 100}
{-32, 4, 100, -54, 12, -3}

Process finished with exit code 0
'''

I to byłoby na tyle, jeżeli chodzi o zbiory w Python. Jeżeli jesteś uważnym uczniem w szkole i znasz temat zbiorów w matematyce, to jest to analogiczny proces jak w przypadku omawianej tu struktury danych.

Kurs Python — podsumowanie

„Kurs Python 3 by MR” właśnie dobił do półmetka. Mimo że omówiłem w tym wpisie tylko dwa tematy, gdzie przewodnim były struktury danych w Python, to jednak materiału wyszło sporo. Dla początkujących ta wiedza będzie wystarczająca, by poeksperymentować. 

Przy okazji zdradzę Ci, że rozpocząłem pracę nad wrześniowym kursem, który będzie praktycznym dopełnieniem tych teoretycznych dywagacji.

Czas bardzo szybko leci, materiału przybywa, więc mam nadzieję, że już jesteś w stanie napisać prosty konsolowy program!

Możesz opisać w komentarzu swoją przygodę z językiem Python. Może ten kurs Python pomógł Ci w początkowym etapie rozwoju jako programista? Koniecznie pochwal się!

Na koniec oczywiście standardowo zostawiam Ci dwie książki, które pomogą w rozwoju programistycznego skilla.

PS. Będę wdzięczny za komentarze pod tym postem!

PS2. Czeka też na Ciebie prezent. Wystarczy, że zapiszesz się na Newsletter poniżej!

PS3. Dołącz do naszej grupy na Facebook!

Subskrybuj

Zapisz się na Newsletter, odbierz NAGRODĘ w postaci e-booka z 10 omówionymi algorytmami pojawiającymi się w pytaniach podczas REKRUTACJI..

Dodatkowo otrzymuj co niedzielę informacje na temat nowych wpisów, wiadomości ze świata IT i matematyki oraz ciekawych wydarzeniach. Nie przegap i dołącz już dziś do 942 osób!.
Autor

👨‍💻 .NET and Python programming passionate 🏦 Digtial Banking Solutions 🎓 Student 📊 Psychology 📚 Bookworm 🏠 Warsaw

6 komentarzy

  1. Przeczytałem cały artykuł. Pozwala na dokładne uporządkowanie informacji na ten temat. Ja wcześniej nie słyszałem o zbiorach, była to nowość. W trakcie czytania natknąłem się na fragment, którego albo nie rozumiem, albo jest literówka, tj. ” funkcje są najbardziej popularną strukturą danych w języku Python”. Czy nie powinno być listy ?? PS. Czy przy krotkach i słownikach mógłbyś wymienić możliwe funkcje na nich, przykłady są wyżej więc nie są potrzebne.

  2. Hej Mateusz,

    Myślę że jak wstawisz do tej listy -5 to będzie zgłoszenie erroru. Bardzo fajnie się porządkuje wiedza o Python czytając ten artykuł. Czekam na więcej.

    Pythona uczę się już od paru miesięcy. Wiem tyle że nadal bardzo mało wiem i jeszcze mniej umiem :-p.

    Pozdrawiam

  3. Super kurs, merytorycznie wartościowy. Dobrze się czyta. Przydałaby się jednak profesjonalna korekta językowa. „Ilość” operacji „ilość” elementów, aż bolą oczy. Gratuluję rozróżniania „tą” i „tę”.

Napisz komentarz

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.