Python nie taki straszny. Zobacz, co warto wiedzieć na początku drogi
Zacznijmy od początku – czym właściwie jest Python? Jego twórca, Guido van Rossum, definiuje go jako: “zaawansowany język programowania, którego filozofia designu polega na czytelności kodu oraz syntaksie pozwalającym programistom wyrazić dane koncepcje w niewielkiej ilości linijek kodu.”
Leandro Tk. Software Engineer w QuintoAndar. Inżynier oprogramowania, redaktor The Renaissance Developer oraz autor tekstów o programowaniu na Medium i freeCodeCamp. W tym artykule TK opowiada o swoim doświadczeniu z Pythonem i przedstawia jego strukturę i działanie w sposób niezwykle przystępny dla osób początkujących. Polecamy go każdemu, kto zastanawia się nad podjęciem nauki tego języka. Poniższy tekst został przetłumaczony za zgodą autora.
Pierwszym powodem, dla którego sam zacząłem uczyć się Pythona był fakt iż jest to w rzeczywistości piękny język programowania. Do nauki zachęcało też to, że pozwalał z łatwością kodować oraz wyrażać swoje myśli.
Kolejnym powodem był to, że Pythona możemy użyć w wieloraki sposób, np. do: nauki o danych, tworzenia stron internetowych oraz samouczenie się maszyn. Dodatkowo, ogromne serwisy jak Quora, Pinterest i Spotify używają Pythona, co mam nadzieję przekonało także i Ciebie do poznania tego języka. Co warto o nim wiedzieć na początku?
Podstawy
VARIABLES
O zmiennych można myśleć jak o słowach, które przechowują jakąś wartość.
W Pythonie łatwo zdefiniować zmienną i ustawić wartość. Wyobraź sobie, że chcesz przechować liczbę “1” w zmiennej o nazwie “one”. Zróbmy to:
one = 1
Prawda, że proste? Właśnie przypisałeś wartość “1” do zmiennej “one”.
two = 2 some_number = 10000
Możesz przypisać jakąkolwiek inną wartość do jakiejkolwiek innej zmiennej. Jak widać w powyższej tabeli, zmienna “two” przechowuje liczbę “2”, a “some_number” przechowuje 10,000.
Poza liczbami możemy również użyć booleans (True / False), strings, float, i wiele innych typów danych.
# booleans true_boolean = True false_boolean = False # string my_name = "Leandro Tk" # float book_price = 15.80
Control flow: Conditional statements
“If” jest wyrażeniem używanym do ocenienia czy dany statement jest Prawdą, czy Fałszem. Jeśli jest to Prawda, zostanie wykonane to, co zostało zawarte w statement “if”. Na przykład:
if True: print("Hello Python If") if 2 > 1: print("2 is greater than 1")
Ponieważ 2 jest większe niż 1, metoda “print” zostanie wykonana.
Jeśli wyrażenie “if” jest fałszywe, w zamian zostanie wykonany statement “else”.
if 1 > 2: print("1 is greater than 2") else: print("1 is not greater than 2")
Ponieważ 1 nie jest większe niż 2, kod zawarty w statement “else” został wykonany.
Możesz również użyć “elif” statement:
if 1 > 2: print("1 is greater than 2") elif 2 > 1: print("1 is not greater than 2") else: print("1 is equal to 2")
Looping / Iterator
W Pythonie możemy iterować w różny sposób. W tym artykule będę mówił o dwóch sposobach: while i for.
While Looping: gdy stwierdzenie jest Prawdą, kod w bloku zostanie wykonany i wywoła numery od 1 do 10.
num = 1 while num <= 10: print(num) num += 1
While loop potrzebuje “loop condition”. Jeśli pozostanie ono Prawdziwe to będzie się dalej iterowało. W tym przykładzie, kiedy num
równa się 11
, loop condition będzie False.
Kolejny kawałek kodu, aby lepiej zrozumieć co mam na myśli:
loop_condition = True while loop_condition: print("Loop Condition keeps: %s" %(loop_condition)) loop_condition = False
Loop condition jest True
, więc nadal będzie się iterować, i aż do momentu, gdy przestawimy go na False
.
Jeśli chodzi o For Looping, musisz jedynie zaaplikować zmienną “num” do bloku, a “for” statement przeiteruje ją dla ciebie. Ten kod wydrukuje to samo co while code: od 1 do 10.
for i in range(1, 11): print(i)
Proste, prawda? Zakres zaczyna się od elementu 1
aż do 11
(10
to dziesiąty element).
List: Collection | Array | Data Structure
Wyobraź sobie, że chcesz przechować liczbę 1 w zmiennej. Ale może teraz chcesz w niej przechować 2. I 3, 4, 5 …
Czy jest jakiś inny sposób, aby przechować wszystkie liczby, jakie chcesz, ale nie w milionach zmiennych? Zgadłeś – jest na to inne rozwiązanie.
List
to zbiór, który może zostać użyty do przechowywania listy wartości (jak na przykład wybrane przez ciebie liczby). Użyjmy go zatem:
my_integers = [1, 2, 3, 4, 5]
Jak widzisz, jest to naprawdę proste. Stworzyliśmy szereg i zapisaliśmy go do przechowania na my_integer
.
Być może zapytasz: “Jak mogę otrzymać jakąś wartość z tego szeregu?” Jest to bardzo dobre pytanie. List zawiera koncepcję zwaną indeksem – pierwszy element otrzymuje index 0 (zero), drugi otrzymuje 1 itd.
Aby uściślić, możemy przedstawić ten szereg i każdy element z jego indeksem. Pozwól, że to narysuję:
Używając syntaksu Pythona, jest to równie łatwe do zrozumienia:
my_integers = [5, 7, 1, 3, 4] print(my_integers[0]) # 5 print(my_integers[1]) # 7 print(my_integers[4]) # 4
Wyobraź sobie, że nie chcesz przechowywać liczb a jedynie strings, jak na przykład listę imion twoich krewnych. Moja wyglądałaby tak:
relatives_names = [ "Toshiaki", "Juliana", "Yuji", "Bruno", "Kaio" ] print(relatives_names[4]) # Kaio
Działa w ten sam sposób jak liczby. Nieźle, prawda?
Właśnie nauczyliśmy się jak działają indeksy Lists
. Za chwilę pokażę, jak możemy dodać element do struktury danych Lists
.
Najbardziej powszechna metoda dodawania nowych wartości do Lists
nazywa się append
. Zobaczmy jak działa:
bookshelf = [] bookshelf.append("The Effective Engineer") bookshelf.append("The 4 Hour Work Week") print(bookshelf[0]) # The Effective Engineer print(bookshelf[1]) # The 4 Hour Work Week
append
jest bardzo prosty. Po prostu musisz zaaplikować element (np. “The Effective Engineer”) jako parametr append
.
No, ale wystarczy już o Lists
. Pogadajmy o kolejnej strukturze danych.
Dictionary: Key-Value Data Structure
Teraz już wiemy, że Lists
są indeksowane liczbami. Ale co jeśli nie chcemy użyć liczby jako indeks? Niektóre struktury danych, które chcemy użyć są numeryczne, string, lub też inne.
Poświęćmy trochę czasu strukturze danych Dictionary
, która jest zbiorem par key-value. Wygląda tak:
dictionary_example = { "key1": "value1", "key2": "value2", "key3": "value3" }
Klucz jest indeksem wskazującym wartość. Jak możemy uzyskać dostęp do Dictionary value? Zgadłeś – używając key. Spróbujmy:
dictionary_tk = { "name": "Leandro", "nickname": "Tk", "nationality": "Brazilian" } print("My name is %s" %(dictionary_tk["name"])) # My name is Leandro print("But you can call me %s" %(dictionary_tk["nickname"])) # But you can call me Tk print("And by the way I'm %s" %(dictionary_tk["nationality"])) # And by the way I'm Brazilian
Stworzyłem Dictionary
o sobie samym. Moje imię, nickname, i narodowość. Te atrybuty to Dictionary
.
Tak jak uczyliśmy się uzyskać dostęp do List
za pomocą indeksu, tak i teraz możemy użyć indeksu, by uzyskać dostęp do wartości przechowywanej w Dictionary
.
W tym przykładzie wydrukowałem frazę o sobie używając wszystkich wartości przechowanych w Dictionary
. Całkiem proste, prawda?
Kolejną fajną rzeczą o Dictionary
jest to, że możemy użyć wszystkiego, co chcemy jako wartość. W stworzonym przeze mnie Dictionary
chcę dodać klucz “wiek” oraz mój prawdziwy wiek w postaci liczby:
dictionary_tk = { "name": "Leandro", "nickname": "Tk", "nationality": "Brazilian", "age": 24 } print("My name is %s" %(dictionary_tk["name"])) # My name is Leandro print("But you can call me %s" %(dictionary_tk["nickname"])) # But you can call me Tk print("And by the way I'm %i and %s" %(dictionary_tk["age"], dictionary_tk["nationality"])) # And by the way I'm Brazilian
Tu mamy parę key (wiek) value (24) używając string jako key i liczbę jako value.
Tak jak zrobiliśmy z Lists
, nauczmy się jak dodawać elementy do Dictionary
. Klucz wskazujący na wartość jest dużą częścią tego, czym jest Dictionary
. Sprawdza się to również, gdy mowa o dodawaniu elementów:
dictionary_tk = { "name": "Leandro", "nickname": "Tk", "nationality": "Brazilian" } dictionary_tk['age'] = 24 print(dictionary_tk) # {'nationality': 'Brazilian', 'age': 24, 'nickname': 'Tk', 'name': 'Leandro'}
Potrzebujemy jedynie przypisać wartość do klucza Dictionary
. Nic skomplikowanego, prawda?
Iteration: Looping Through Data Structures:
Jak nauczyliśmy się w podstawach Pythona, iteracja List
jest bardzo prosta. My, developerzy Pythona, powszechnie używamy for
looping.
bookshelf = [ "The Effective Engineer", "The 4-hour Workweek", "Zero to One", "Lean Startup", "Hooked" ] for book in bookshelf: print(book)
Dla każdej książki na półce, wywołujemy metodę “print”. Całkiem proste i intuicyjne – taki jest zwyczajnie Python.
Dla hash data structure możemy również użyć for
loop, ale zaaplikujemy key
:
dictionary = { "some_key": "some_value" } for key in dictionary: print("%s --> %s" %(key, dictionary[key])) # some_key --> some_value
To jest przykład jak można go użyć. Dla każdego key
w Dictionary
, możemy użyć print
dla key
oraz przypisanej do niego value
.
Kolejny sposób, aby to zrobić to użycie metody iteritems
.
dictionary = { "some_key": "some_value" } for key, value in dictionary.items(): print("%s --> %s" %(key, value)) # some_key --> some_value
Mimo, iż nazwaliśmy powyższe dwa parametry key
i value
, nie jest to potrzebne. Możemy nazwać je jak tylko chcemy. Spójrzmy:
dictionary_tk = { "name": "Leandro", "nickname": "Tk", "nationality": "Brazilian", "age": 24 } for attribute, value in dictionary_tk.items(): print("My %s is %s" %(attribute, value)) # My name is Leandro # My nickname is Tk # My nationality is Brazilian # My age is 24
Można zobaczyć, że użyliśmy atrybutów jako parametr dla Dictionary
key
i działa tak jak powinno. Super!Zacznijmy od początku – czym właściwie jest Python? Jego twórca, Guido van Rossum, definiuje go jako: “zaawansowany język programowania, którego filozofia designu polega na czytelności kodu oraz syntaksie pozwalającym programistom wyrazić dane koncepcje w niewielkiej ilości linijek kodu.”
Klasy i obiekty
Trochę teorii
Obiekty to reprezentacja realnych obiektów, takich jak samochody, psy, lub rowery. Dzielą one dwie główne cechy: dane oraz zachowanie.
Samochody mają dane, jak na przykład liczba kół, drzwi, oraz ilość miejsc siedzących. Wykazują one również zachowanie: mogą przyspieszyć, zatrzymać się, pokazać ile paliwa zostało oraz wiele innych.
W programowaniu object-oriented dane identyfikujemy jako atrybuty, a zachowanie jako metody.
Dane → Atrybuty i Zachowanie → Metody
Klasa natomiast jest planem, według którego obiekty są tworzone. W prawdziwym świecie często istnieje wiele obiektów o takim samym typie, jak na przykład samochody. Wszystkie mają podobną konstrukcję (wszystkie mają silnik, koła, drzwi, itd.), choć mało które są identyczne.
Python Object-Oriented Programming mode: ON
Python, jako język programowania object-oriented, posiada dwie koncepcje: klasę i obiekt.
Klasa jest planem, lub też modelem dla obiektu; pomaga ona zdefiniować atrybuty i zachowania (tak jak mówiliśmy o tym w sekcji poświęconej teorii). Na przykład, klasa pojazdów ma własne atrybuty, które definiują jakie obiekty są pojazdami. Ilość kół, pojemność zbiornika, ilość miejsc siedzących, i maksymalna prędkość to wszystko przykładowe atrybuty pojazdu.
Mając to na uwadze, spójrzmy na syntaks Pythona dla klas:
class Vehicle: pass
Klasy definiujemy za pomocą class statement – i tyle. Proste, prawda? Obiekty to elementy klas. Element kreujemy poprzez nazwanie klas.
W tym przykładzie, car jest obiektem klasy Vehicle.
car = Vehicle() print(car) # <__main__.Vehicle instance at 0x7fb1de6c2638>
Pamiętajmy, że nasza klasa pojazdów ma cztery atrybuty: ilość kół, pojemność zbiornika, ilość miejsc siedzących, i maksymalna prędkość. Wszystkie te atrybuty ustawiliśmy tworząc obiekt pojazd. Definiujemy naszą klasę do otrzymania danych, kiedy zapoczątkuje je:
class Vehicle: def __init__(self, number_of_wheels, type_of_tank, seating_capacity, maximum_velocity): self.number_of_wheels = number_of_wheels self.type_of_tank = type_of_tank self.seating_capacity = seating_capacity self.maximum_velocity = maximum_velocity
Używamy metody init
, nazywaną również metodą constructor, która pozwala nam na zdefiniowanie atrybutów w trakcie kreowania obiektów. Wyobraź sobie, że bardzo podoba nam się Tesla Model S i chcemy stworzyć tego rodzaju obiekt. Ma on cztery koła, działa na energię elektryczną, ma pięć miejsc siedzących, i maksymalną prędkość 250 km/h (155 mph). Stwórzmy zatem taki obiekt:
tesla_model_s = Vehicle(4, 'electric', 5, 250)
Cztery koła + elektryczny “typ zbiornika” + pięć siedzeń + maksymalna prędkość 250 km/h.
Wszystkie atrybuty są już ustawione. Ale jak możemy uzyskać dostęp do ich wartości? Za pomocą metody, znanej także jako zachowanie obiektu. Zastosujmy ją:
class Vehicle: def __init__(self, number_of_wheels, type_of_tank, seating_capacity, maximum_velocity): self.number_of_wheels = number_of_wheels self.type_of_tank = type_of_tank self.seating_capacity = seating_capacity self.maximum_velocity = maximum_velocity def number_of_wheels(self): return self.number_of_wheels def set_number_of_wheels(self, number): self.number_of_wheels = number
Powyżej widzicie implementację dwóch metod: number_of_wheels i set_number_of_wheels. Nazywamy je getter
i setter
ponieważ temu pierwszemu zostaje przypisana wartość atrybutu, a ten drugi ustanawia nową wartość dla tego atrybutu.
W Pythonie możemy dokonać tego używając @property
(decorators
), aby zdefiniować getters
i setters
. Przyjrzyjmy się temu:
class Vehicle: def __init__(self, number_of_wheels, type_of_tank, seating_capacity, maximum_velocity): self.number_of_wheels = number_of_wheels self.type_of_tank = type_of_tank self.seating_capacity = seating_capacity self.maximum_velocity = maximum_velocity @property def number_of_wheels(self): return self.__number_of_wheels @number_of_wheels.setter def number_of_wheels(self, number): self.__number_of_wheels = number
Tych metod możemy również użyć jako atrybutów:
tesla_model_s = Vehicle(4, 'electric', 5, 250) print(tesla_model_s.number_of_wheels) # 4 tesla_model_s.number_of_wheels = 2 # setting number of wheels to 2 print(tesla_model_s.number_of_wheels) # 2
Jest to trochę inne niż metody definiujące. Te metody działają jako atrybuty. Na przykład, kiedy ustawiamy nową liczbę kół, ustawiamy wartość 2 w number_of_wheels
. Jest to jeden sposób na napisanie kodu pythonic
getter
i setter
.
Możemy jednak użyć metod do innych rzeczy, jak na przykład metoda “make_noise”. Spójrzmy na to:
class Vehicle: def __init__(self, number_of_wheels, type_of_tank, seating_capacity, maximum_velocity): self.number_of_wheels = number_of_wheels self.type_of_tank = type_of_tank self.seating_capacity = seating_capacity self.maximum_velocity = maximum_velocity def make_noise(self): print('VRUUUUUUUM')
Kiedy stosujemy tą metodę, produkuje ona jedynie string “VRRRRUUUUM”.
tesla_model_s = Vehicle(4, 'electric', 5, 250) tesla_model_s.make_noise() # VRUUUUUUUM
Encapsulation: Hiding Information
Enkapsulacja to mechanizm, który zastrzega bezpośredni dostęp do danych oraz metod obiektów. Jednakże tym samym ułatwia wykonywanie działań na tych danych (metody obiektów).
Cała wewnętrzna reprezentacja obiektu jest ukryta przed… Jedynie obiekt może komunikować się z jego wewnętrznymi danymi.
Jednak najpierw, musimy zrozumieć jak działają public
i non-public
instance variables i metody.
Public Instance Variables
Dla klasy Pythona możemy zainicjować public instance variables w zakresie metody constructor. Przyjrzyjmy się temu:
W zakresie metody constructor:
class Person: def __init__(self, first_name): self.first_name = first_name
Tu możemy zaaplikować wartość first_name
jako argument do public instance variable
.
tk = Person('TK') print(tk.first_name) # => TK
W zakresie klasy:
class Person: first_name = 'TK'
W tym przypadku nie musimy aplikować first_name
jako argumentu, a wszystkie obiekty instancji będą miały class attribute
.
tk = Person() print(tk.first_name) # => TK
Nauczyliśmy się właśnie, że możemy użyć public instance variables
i class attributes
. Kolejną interesującą rzeczą o części public
jest to, iż możemy zarządzać wartościami zmiennych. Co mam przez to na myśli? Nasz object
jest w stanie zarządzać wartością jego zmiennej: Get
i Set
wartości zmiennych.
Pamiętając o klasie Person
chcemy ustawić kolejną wartość do zmiennej first_name
:
tk = Person('TK') tk.first_name = 'Kaio' print(tk.first_name) # => Kaio
Jedyne, co musieliśmy zrobić to przestawić wartość (kaio
) do first_name
instance variable i to doprowadzi do zaktualizowania wartości. Możemy tak zrobić ponieważ jest to public
variable.
Non-public Instance Variable
Nie używamy tu takiego pojęcia jak “prywatny”, ponieważ żaden atrybut nie jest tak naprawdę prywatny w Pythonie (bez niepotrzebnego nadmiaru pracy) – PEP8
Tak jak public instance variable
, non-public instance variable
możemy zdefiniować w zakresie metody constructor lub klasy. Co do różnicy w syntaksie, dla non-public instance variables
używaj podkreślnika ( _ ) przed variable
name.
“Private instance variables, do których nie można uzyskać dostępu prócz od środka obiektu nie istnieją w Pythonie. Jednakże, istnieje konwencja, którą stosuje większość kodu Python: nazwa poprzedzona podkreślnikiem ( e.g. _spam ) powinna być traktowana jako niepubliczna część API (bez względu na to, czy jest to funkcja, metoda, czy członek danych)” – Python Software Foundation
Tu mamy przykład:
class Person: def __init__(self, first_name, email): self.first_name = first_name self._email = email
Zauważyłeś zmienną email
? Tak definiujemy non-public variable
:
tk = Person('TK', 'tk@mail.com') print(tk._email) # tk@mail.com
Możemy uzyskać do tego dostęp i zaktualizować to. Non-public variables
są tylko konwencją i powinny być traktowane jako niepubliczna część API. Stosujemy metodę, która pozwala nam działać od środka definicji klasy. Implementujemy dwie metody (email
and update_email
), aby lepiej to zrozumieć:
class Person: def __init__(self, first_name, email): self.first_name = first_name self._email = email def update_email(self, new_email): self._email = new_email def email(self): return self._email
Za pomocą tych metod możemy teraz zaktualizować i uzyskać dostęp do non-public variables
. Spójrzmy:
tk = Person('TK', 'tk@mail.com') print(tk.email()) # => tk@mail.com # tk._email = 'new_tk@mail.com' -- treat as a non-public part of the class API print(tk.email()) # => tk@mail.com tk.update_email('new_tk@mail.com') print(tk.email()) # => new_tk@mail.com
1. Zainicjowaliśmy nowy obiekt z first_name
TK i email
tk@mail.com
2. Wydrukowaliśmy ten email poprzez uzyskanie dostępu do non-public variable
3. Próbowaliśmy ustawić nowy email
w naszej klasie
4. Musimy traktować non-public variable
jako non-public
część API
5. Zaktualizowaliśmy non-public variable
za pomocą instance method
6. Sukces! Możemy to zaktualizować od środka naszej klasy z metoda pomocniczą (helper method)
Public method
Z public methods możemy również użyć ich spoza naszych klas:
class Person: def __init__(self, first_name, age): self.first_name = first_name self._age = age def show_age(self): return self._age
Przetestujmy to:
tk = Person('TK', 25) print(tk.show_age()) # => 25
Super, możemy tego używać bez najmniejszego problemu
Non-public Method
Jednakże z non-public methods
nie jesteśmy w stanie tego zrobić. Zaimplementujmy tą samą klasę Person
, ale teraz wraz z show_age
non-public method
używając podkreślnik ( _ ).
class Person: def __init__(self, first_name, age): self.first_name = first_name self._age = age def _show_age(self): return self._age
A teraz spróbujemy nazwać non-public method
naszym obiektem:
tk = Person('TK', 25) print(tk._show_age()) # => 25
Możemy uzyskać do tego dostęp i zaktualizować to. Non-public methods
są tylko konwencją i powinny być traktowane jako niepubliczna część API.
Tutaj mamy przykład jak można to użyć:
class Person: def __init__(self, first_name, age): self.first_name = first_name self._age = age def show_age(self): return self._get_age() def _get_age(self): return self._age tk = Person('TK', 25) print(tk.show_age()) # => 25
Mamy tu _get_age
non-public method
oraz show_age
public method
. show_age
może być użyte przez nasz obiekt (spoza naszej klasy), a _get_age
może zostać użyty tylko w zakresie definicji klasy (wewnątrz metody show_age
). Jednakże powtórzę: jako konwencja.
Encapsulation Summary
Z encapsulation możemy zapewnić, że wewnętrzna reprezentacja obiektu jest ukryta przed światem zewnętrznym.
Inheritance: zachowania i charakterystyka
Niektóre obiekty dzielą pewne rzeczy: ich zachowanie i cechy.
Na przykład, ja odziedziczyłem pewne cechy i zachowanie po moim ojcu. Z cech odziedziczyłem jego oczy i włosy, a z zachowań jego brak cierpliwości i introwersje. W programowaniu zorientowanym wokół obiektu, klasy mogą odziedziczyć wspólne cechy (dane) i zachowania (metody) z innej klasy.
Spójrzmy na kolejny przykład i zastosujmy go w Pythonie.
Wyobraź sobie samochód. Numer kół, pojemność i maksymalna prędkość to wszystko atrybuty tego samochodu. Można powiedzieć, że klasa ElectricCar dziedziczy te same atrybuty, co klasa zwyczajnego Car.
class Car: def __init__(self, number_of_wheels, seating_capacity, maximum_velocity): self.number_of_wheels = number_of_wheels self.seating_capacity = seating_capacity self.maximum_velocity = maximum_velocity
Nasza klasa Car:
my_car = Car(4, 5, 250) print(my_car.number_of_wheels) print(my_car.seating_capacity) print(my_car.maximum_velocity)
W Pythonie aplikujemy parent class
do child class
jako parametr. Klasa ElectricCar może odziedziczyć klasę naszego Car.
class ElectricCar(Car): def __init__(self, number_of_wheels, seating_capacity, maximum_velocity): Car.__init__(self, number_of_wheels, seating_capacity, maximum_velocity)
To jest tak proste. Nie musimy stosować żadnej innej metody ponieważ ta klasa już ją ma (odziedziczoną po klasie Car). Udowodnijmy to:
my_electric_car = ElectricCar(4, 5, 250) print(my_electric_car.number_of_wheels) # => 4 print(my_electric_car.seating_capacity) # => 5 print(my_electric_car.maximum_velocity) # => 250
Pięknie.
To wszystko!
Nauczyliśmy się wiele rzeczy o podstawach Pythona:
- Jak działają zmienne Pythona
- Jak działa conditional statement Pythona
- Jak działa looping (while i for) Pythona
- Jak działa Lista: Collection | Array
- Dictionary key-value Collection
- Jak możemy iterować przez data structures
- Objects i Classes
- Atrybuty jako dane obiektów
- Metody jako zachowanie obiektów
- Używanie Python getters and setters oraz property decorator
- Enkapsulacja: ukrywanie informacji
- Dziedziczenie: zachowania i cechy
Jeśli chciałbyś nauczyć się o nim więcej, wypróbuj One Month Python Bootcamp. Natomiast jeśli chciałbyś poczytać trochę więcej o mojej podróży, na której zgłębiałem tajniki programowania, zapraszam do czytania moich publikacji na The Renaissance Developer. Życzę miłej zabawy i uczcie się dalej!
Artykuł został pierwotnie opublikowany na freecodecamp.org, a przetłumaczony przez Zuzę Filipiuk. Zdjęcie główne artykułu pochodzi z unsplash.com.