Lekcja 9 - Nikola Horn

Lekcja 9 - Nikola Horn
Photo by Brooke Lark / Unsplash

Zadanie domowe:

Stworzyć klasę Ksiazka, gdzie atrybutami będzie imię (str) i numer telefonu (int), a wyjściową informacją lista zawierająca imię i numer telefonu (chyba, że da się je dodać jakoś do słownika??).

Metody do tej klasy mogłyby modyfikować i usuwać wpisy?

Szyfr Cezara jako funkcja

ZNAKI = (
"a",
"b",
"c",
"d",
"e",
"f",
"g",
"h",
"i",
"j",
"k",
"l",
"m",
"n",
"o",
"p",
"q",
"r",
"s",
"t",
"u",
"v",
"w",
"x",
"y",
"z",
"A",
"B",
"C",
"D",
"E",
"F",
"G",
"H",
"I",
"J",
"K",
"L",
"M",
"N",
"O",
"P",
"Q",
"R",
"S",
"T",
"U",
"V",
"W",
"X",
"Y",
"Z",
"Ą",
"ą",
"Ć",
"ć",
"Ę",
"ę",
"Ł",
"ł",
"Ń",
"ń",
"Ó",
"ó",
"Ś",
"ś",
"Ź",
"ź",
"Ż",
"ż",
" ",
".",
"?",
"!",
)

def szyfrowanie(x: str, y:int) -> str:

    zaszyfrowanytekst = ""

    for i in x:
        obecny_indeks = ZNAKI.index(i)
        
        #dzięki temu wraca do początku
        indekszaszyfrowany = (obecny_indeks + y) % len(ZNAKI)
        
        zaszyfrowanytekst += ZNAKI[indekszaszyfrowany]
    return(zaszyfrowanytekst)

# to będzie x - str
tekst = input("Podaj tekst do zaszyfrowania: ")

# to będzie y - int
klucz = int(input("Podaj klucz: "))

tekst_zaszyfrowany = szyfrowanie(tekst, klucz)
print(tekst_zaszyfrowany)

Gra RPG (tworzenie postaci) z klasami, metodami i funkcjami

class PostacGracza:
    def __init__(self, imie: str, rasa: str, profesja: str, hp: int, mana: int) -> None:
        self.imie = imie
        self.rasa = rasa
        self.profesja = profesja
        self.hp = hp
        self.mana = mana
    
    def otrzymaj_obrazenia(self, ilosc_obrazen: int):
        self.hp -= ilosc_obrazen
    
#można stworzyć postać używając klasy, albo używając osobnej funkcji:
def stworz_gracza():
    imie = input("Podaj imie: ")
    rasa = input("Podaj rase: ")
    profesja = input("Podaj profesje: ")
    hp = 100
    mana = 100
    return PostacGracza(imie, rasa, profesja, hp, mana)

gracz3 = stworz_gracza()

#dwa sposoby podawania parametrów, drugi sposób jest bezpieczniejszy:
gracz1 = PostacGracza("Nikorin", "elf", "łotrzyk", 100, 100)
gracz2 = PostacGracza(rasa="krasnolud", hp=100, mana=0, imie="Torin", profesja="wojownik")
#gracz3 = stworz_gracza()

print(f"Gracz {gracz1.imie} ma na początku {gracz1.hp} punktów HP")
gracz1.otrzymaj_obrazenia(15)
print(f"Gracz {gracz1.imie} ma teraz {gracz1.hp} punktów HP")

Różne funkcje

#sumowanie 3 liczb
def sumowanie3(x:int, y:int, z:int) -> int:
    wynik = x+y+z
    return wynik

wynik1 = sumowanie3(3, 4, 5)
print(wynik1)


#podniesienie do potegi 3
def potega3(x:int) -> int:
    wynik = x*x*x
    return wynik

wynik2 = potega3(7)
print(wynik2)


#max i min z listy/krotki
krotka = (5, 16, 34, 23, 242, 643, 6746)

def minmax(x: tuple[int]) -> tuple[int]:
    minimum = min(x)
    maximum = max(x)
    print(f"Minimum: {minimum}")
    print(f"Maximum: {maximum}")
    return minimum, maximum

wynik3 = minmax(krotka)
print(wynik3)

Notatki z zajęć

Programowanie obiektowe

Można tworzyć własne funkcje, używając def

def nazwa_funkcji(parametry):
blok kodu
return zwracana_wartosc

Funkcje maksimum i minimum:

  • max()
  • min()
def kwadrat(x):
  wynik = x*x
  return wynik

wynik_funkcji = kwadrat(5)
print(wynik_funkcji)

Dobra praktyka: podajemy jakiego typu parametru oczekujemy na wejściu i wyjściu, np. int, str, list itp.!

def kwadrat(x: int) -> int:
  wynik = x*x
  return wynik

def print_z_gwiazdkami(x) -> None:

Klasy obiektów

Możemy tworzyć własne typy poprzez stworzenie jakiejś klasy obiektów. Tworzymy jakiś ogólny opis cech i rzeczy, które dany obiekt może robić.

klasa != obiekt

Klasa to jedynie szablon, na podstawie którego obiekt zostanie stworzony.

Wystarczy, że raz poprawnie stworzymy klasy, a użytkownicy dostaną jasny komunikat co do jej celu.

Do deklarowania klas - class; do klas można stworzyć metody

class Zamowienie:
  def __init__ (self, stolik: int, potrawy: list) -> None

self - dotyczy tylko konkretnego obiektu, nie wszystkich obiektów danej klasy. Zazwyczaj dodaje się to do każdej metody w klasie.

init - to będzie działo się podczas tworzenia obiektu

nazwa klasy najlepiej w SnakeCase (każde słowo z dużej litery bez spacji)

class NazwaKlasy:
  def __init__(self, parametry)
    #tu przypisanie atrybutów, wywołanie funkcji startowych

  def nasza_nazwa_metody(self, parametry dla metody)
    #tu funkcje itp, co ta metoda ma robić
class Zamowienie:
  def __init__ (self, stolik: int, potrawy: list) -> None:

#tutaj reszta rzeczy blabla

zam1 = Zamowienie(1, ["sałatka", "burito"])
print(zam1.potrawy)

Zamowienie - nazwa klasy; 1 - ilość stolików; ["sałatka", "burito"] - lista potraw

zam1.potrawy - zawiera same atrybuty klasy, czyli w tym wypadku listę potraw, którą można wydrukować