Zmienne

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:

  1. Definicja klasy: Zdefiniowaliśmy klasę Osoba z metodą powiedz_cześć(), która wypisuje powitanie.
  2. Utworzenie obiektu: Stworzyliśmy obiekt osoba1 klasy Osoba.
  3. 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.
  4. 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.