Wyobraź sobie pudełko(pudełko jako obiekt). Możesz do niego włożyć różne rzeczy: zabawkę, książkę, czy słodycze. W programowaniu, takie pudełko to zmienna. Zamiast przedmiotów, do zmiennej wkładamy różne wartości, np. liczby, słowa czy nawet bardziej skomplikowane informacje.
Co to jest zmienna?
- Nazwa: Każda zmienna ma swoją unikalną nazwę, np. wiek, imie, cena.
- Wartość: W zmiennej przechowujemy konkretną wartość, np. wiek = 17, imie = „Jan”, cena = 4.99.
- Typ: Wartość w zmiennej ma określony typ, np. liczbowy (całkowity, rzeczywisty), tekstowy (łańcuch znaków) czy logiczny (prawda/fałsz).
Dlaczego używamy zmiennych?
- Przechowywanie danych: Dzięki zmiennym możemy zapamiętać różne informacje, które będą nam potrzebne później w programie.
- Ułatwienie obliczeń: Możemy wykonywać działania na wartościach przechowywanych w zmiennych.
- Zwiększenie czytelności kodu: Dobrze nazwane zmienne sprawiają, że kod jest łatwiejszy do zrozumienia.
Najważniejsze typy danych w Pythonie:
- int: Liczby całkowite (np. -5, 0, 100). Służą do reprezentowania liczb bez części ułamkowej.
- float: Liczby zmiennoprzecinkowe (np. 3.14, -0.5). Służą do reprezentowania liczb z częścią ułamkową.
- str: Łańcuchy znakowe (np. „Hello”, „Python”). Służą do przechowywania tekstu.
- bool: Wartości logiczne (True, False). Służą do reprezentowania wartości prawda/fałsz.
- list: Listy (np. [1, 2, 3, „a”]). Służą do przechowywania uporządkowanych zbiorów elementów różnego typu.
- tuple: Krotki (np. (1, 2, 3)). Podobne do list, ale są niemutowalne, czyli nie można zmieniać ich elementów po utworzeniu.
- set: Zbiory (np. {1, 2, 3}). Służą do przechowywania nieuporządkowanych zbiorów unikalnych elementów.
- dict: Słowniki (np. {„name”: „John”, „age”: 30}). Służą do przechowywania par klucz-wartość.
Przykład 1: Python dynamicznie sam przydziela typ zmiennej
imie = „Adam”
wiek = 25
wzrost = 1.75
czy_lubi_programowanie = True
print(„Nazywam się”, imie, „mam”, wiek, „lat i jestem wzrostu”, wzrost, „m.”)
print(„Czy lubię programowanie?”, czy_lubi_programowanie)
Przykład 2: Samodzielne ustawienie typu zmiennej
liczba = 10
tekst = str(liczba) # Konwersja liczby na tekst
Odwoływanie się do metody za pomocą zmiennej w Pythonie
W Pythonie, podobnie jak w wielu innych językach programowania, możemy przypisać metodę do zmiennej. To pozwala na bardziej elastyczne i dynamiczne korzystanie z funkcjonalności obiektów.
Przykład:
class Osoba:
def __init__(self, imie):
self.imie = imie
def powiedz_cześć(self):
print(f”Cześć, mam na imię {self.imie}!”)
# Utworzenie obiektu klasy Osoba
osoba1 = Osoba(„Jan”)
# Przypisanie metody do zmiennej
powitanie = osoba1.powiedz_cześć
# Wywołanie metody za pomocą zmiennej
powitanie()
Wyjaśnienie powyższego kodu:
- Definicja klasy: Zdefiniowaliśmy klasę Osoba z metodą powiedz_cześć(), która wypisuje powitanie.
- Utworzenie obiektu: Stworzyliśmy obiekt osoba1 klasy Osoba.
- Przypisanie metody do zmiennej: Przypisaliśmy metodę powiedz_cześć() obiektu osoba1 do zmiennej powitanie. Zauważ, że nie wywołujemy jeszcze metody, tylko przypisujemy ją do zmiennej.
- Wywołanie metody: Wywołując zmienną powitanie jak funkcję, uruchamiamy metodę powiedz_cześć().
Dlaczego to działa?
- Metody są obiektami: W Pythonie metody są tak naprawdę obiektami typu function. Możemy je przypisywać do zmiennych, przekazywać jako argumenty do innych funkcji, a nawet je zwracać z funkcji.
- Binding: Kiedy przypisujemy metodę do zmiennej, tworzymy tzw. „binding” między zmienną a metodą. Oznacza to, że wywołanie zmiennej jest równoważne wywołaniu oryginalnej metody.
Ważne uwagi:
- Self: Pamiętaj, że metody w Pythonie mają domyślny argument self, który odnosi się do samego obiektu.
- Kontekst: Kiedy przypisujesz metodę do zmiennej, ważne jest, aby zrozumieć, w jakim kontekście ta metoda będzie wywoływana. Zmienna przechowuje jedynie „przepis” na wykonanie metody, a nie jej wynik.
- Funkcje vs. metody: Chociaż metody są podobne do funkcji, różnią się tym, że są związane z konkretnym obiektem.
Inne przydatne metody wbudowane i ich zastosowanie:
- len(): Oblicza długość sekwencji (np. list, string).
moja_lista = [1, 2, 3]
dlugosc_listy = len(moja_lista)
- sum(): Sumuje elementy sekwencji liczbowej.
liczby = [1, 2, 3, 4, 5]
suma = sum(liczby)
- max(): Zwraca największą wartość w sekwencji.
liczby = [10, 5, 15, 8]
najwieksza_liczba = max(liczby)
- min(): Zwraca najmniejszą wartość w sekwencji.
liczby = [10, 5, 15, 8]
najmniejsza_liczba = min(liczby)
- sorted(): Sortuje elementy sekwencji.
liczby = [3, 1, 4, 1, 5, 9]
posortowane_liczby = sorted(liczby)
- reversed(): Zwraca odwróconą iterację sekwencji.
tekst = „Python”
odwrocony_tekst = „”.join(reversed(tekst))
Dlaczego warto przypisywać metody do zmiennych?
- Czytelność: Może poprawić czytelność kodu, zwłaszcza gdy nazwa metody jest długa lub skomplikowana.
- Elastyczność: Umożliwia dynamiczne wybieranie metod w zależności od warunków.
- Funkcje wyższego rzędu: Możesz przekazywać metody jako argumenty do innych funkcji.
Pamiętaj:
- Kontekst: Zawsze pamiętaj o kontekście, w którym wywołujesz metodę.
- Argumenty: Podawaj odpowiednie argumenty dla danej metody.
- Typy danych: Upewnij się, że przekazywane dane są zgodne z oczekiwaniami metody.
Odwoływanie się do metod za pomocą notacji atrybutowej na przykładzie metody abs.
x.__abs__()?
- __abs__() to specjalna metoda w Pythonie, zwana metodą magiczną lub dunder method.
- Służy ona do obliczania wartości bezwzględnej liczby.
- Notacja x.__abs__() jest bardziej szczegółowym sposobem wywołania tej metody w porównaniu do abs(x).
Dlaczego używamy notacji atrybutowej?
- Wyjaśnienie: Np. kiedy używamy notacji x.__abs__(), wprost mówimy Pythonowi: „Weź obiekt x i wywołaj jego metodę o nazwie __abs__()”.
- Dostęp do wewnętrznych mechanizmów: Pozwala to na głębsze zrozumienie, jak działają obiekty i metody w Pythonie.
- Polimorfizm: Możemy nadpisywać metody magiczne w naszych własnych klasach, aby dostosować ich zachowanie do naszych potrzeb.
Przykład z listą i metodą sort()
moja_lista = [3, 1, 4, 1, 5, 9]
moja_lista.sort()
print(moja_lista) # Wynik: [1, 1, 3, 4, 5, 9]
W tym przykładzie:
- moja_lista jest obiektem typu lista.
- sort() jest metodą wbudowaną w obiekty listy, która służy do sortowania elementów.
- Wywołanie moja_lista.sort() jest równoważne z moja_lista.__sort__(), ale notacja sort() jest bardziej czytelna i powszechnie używana.
Inne przykłady metod magicznych i ich zastosowania
- __str__(): Zwraca reprezentację obiektu w postaci łańcucha znaków, używaną np. przy drukowaniu.
- __len__(): Zwraca długość obiektu (np. długość listy, długość łańcucha znaków).
- __add__(): Definiuje działanie dodawania dla obiektów.
- __eq__(): Definiuje operator porównania równości.
Przykład z metodą __str__():
class Osoba:
def __init__(self, imie, nazwisko):
self.imie = imie
self.nazwisko = nazwisko
def __str__(self):
return f”Osoba: {self.imie} {self.nazwisko}”
osoba1 = Osoba(„Jan”, „Kowalski”)
print(osoba1) # Wyświetli: Osoba: Jan Kowalski
Kiedy używać notacji atrybutowej?
- Kiedy chcesz podkreślić, że wywołujesz metodę obiektu.
- Kiedy chcesz nadpisywać metody magiczne w swoich własnych klasach.
- Kiedy pracujesz z metaprogramowaniem.
