Python_zajęcia_7

Wzór Fibriocci'ego + turtle


import turtle
import random

zolwik = turtle.Turtle() # stworz obiekt rysujacego zolwia pod zmienna zolwik
zolwik.speed(2) # ustaw szybkosc zolwia wbudowana metoda speed
zolwik.shape("turtle") # uzyj metody shape do ustawienia wygladu kursora / zolwia
zolwik.pensize(3)

kolory = [
    "CornflowerBlue",
    "DarkOrchid",
    "IndianRed",
    "DeepSkyBlue",
    "LightSeaGreen",
    "wheat",
    "SlateGray",
    "SeaGreen",
]

fibo = [0, 1]
suma_ostatnich = fibo[-1]+fibo[-2]

gorna_granica = 77

while suma_ostatnich <= gorna_granica:
    fibo.append(suma_ostatnich)
    suma_ostatnich = fibo[-1]+fibo[-2]

print(fibo)

# [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]

dl_boku = 20

for mnoznik in fibo[1:]:
    zolwik.fillcolor(random.choice(kolory))
    zolwik.begin_fill()
    for _ in range(5):
        zolwik.forward(dl_boku*mnoznik)
        zolwik.left(90)
    zolwik.end_fill()
    zolwik.forward(dl_boku*mnoznik)

turtle.exitonclick()

Szyfrowanie:


 jak moga dzialać funkcje szyforwania

# I kategoria szyfrowanie: symetryczne - asymetryczne 

# szyfrowanie symetryczne - dwie osoby chca wymieniac miedzy soba wiadomosc 
# wymyslaja hasło - klucz: ktora odszyfruje zaszyforwane haslo
# osoba 1 szyfryjue haslo kluczem - przesyla do osoby 2
# osoba 2 wpisuje klucz - wiadomosc odszyfrowana 

# szyfrowanie asymetryczne - dwie osoby chcac wymienic miedzy soba
# osoba 1 jak i 2 - tworza sobie pare kluczy 
# 1 klucz jest do szafrywonia 
# 2 klucz do odszyfrowania 
# osoba 1 wysyla klucz publiczny do osoby 2,i ppsiaja tylko polowe klucza
# osoba 1 wysyla wiadomosc zaszyfrowana kluczem publicznym osoby 2
# osoba 2 odszyfrowuje wiadomosc swoim kodem prywaatnym 
# nie ma możliwości przechwycenia klucza do odszyfrowania

# ssh - metoda łączenia sie  z zewn.serwerami 
# wymiana kluczy 
# taki klucz składa sie klucz wewn. prywatny i klucz publiczny

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",
    "Ą",
    "ą",
    "Ć",
    "ć",
    "Ę",
    "ę",
    "Ł",
    "ł",
    "Ń",
    "ń",
    "Ó",
    "ó",
    "Ś",
    "ś",
    "Ź",
    "ź",
    "Ż",
    "ż",
    " ",
    ".",
    "?",
    "!",
]

# powyższa lista znaków ułatwi stworzenie kodu odpowiedzialnego za szyfrowanie

# żeby przy bardzo dużym kluczu , lub przy zamianie znaku z końca listy nie wyjść za nią
# można skorzystać z operatora modulo (to ten od reszty z dzielenia)
# wg. schematu (indeksznaku + klucz) % len(ZNAKI)

# indeksznaku = ZNAKI.index("!")
# print(f"Indeks znaku to: {indeksznaku}")
# klucz = 3
# nowy_indeks = (indeksznaku + klucz) % len(ZNAKI)
# print(f"Po przesunieciu o {klucz} uzyskamy {nowy_indeks}")

# jeśli nie chcemy skorzystać z naszej własnej tablicy znaków,
# to można to też zrobic korzystajac z tablicy znaków Unicode.
# Przydadzą się wtedy funkcje:
# ord - zwraca nr unicode znaku
# chr - zwraca znak po podaniu nr unicode

# klucz = 3
# haslo = input("Podaj hasło: ")

for n in haslo:
    indeksznaku = ZNAKI.index(n)
    nowy_indeks = (indeksznaku + klucz) % len(ZNAKI)
    print(f"Po przesunieciu o {klucz} uzyskamy {nowy_indeks}")
    print(ZNAKI[nowy_indeks])
    print(nowy_indeks)

# tekst = input("Wpisz tekst do zaszyfrowania: ")
# klucz =  int(input("wpisz klucz: "))

# for znak in tekst:
#     indeksznaku = ZNAKI.index(znak)
#     print(f"Indeks znaku to: {indeksznaku}")
#     nowy_indeks = (indeksznaku + klucz) % len(ZNAKI)
#     print(f"Po przesunieciu o {klucz} uzyskamy {nowy_indeks}")

Książka kontaków:


kontakty = {
    "Alice" : "[email protected]",
    "Bob" : "[email protected]",
            }

ilosc_kontaktow = ""
imie = ""
mail = ""
nowe_kontakty = {imie: mail}

while True:
    print("Książka kontaktowa:")
    print("Wybierz operację:")
    print("1 - dodanie wpisu")
    print("2 - aktualizacja wpisu")
    print("3 - usunięcie wpisu")
    print("4 - wydruk wszystkich kontaktów")
    print("5 - wydruk konretntego kontaktu")
    print("6 - koniec programu")

    wybor = input("Podaj kod operacji: ")

    if wybor == "1":
        print("")
        ilosc_kontaktow = int(input("Podaj liczbe kontaktów do dodania: "))
        for _ in range(ilosc_kontaktow):
            input('Nacisnij ENTER aby kontynuować.')
            print('\033c', end='')
            imie = input("Podaj imię: ")
            mail = input("Podaj mail: ")
            if imie in kontakty: 
                print('')
                print("Kontakt istnieje.")
                print('')
                input('Nacisnij ENTER aby kontynuować.')
                print('\033c', end='') 
            else:
                kontakty[imie] = mail
                print('')
                print("Kontakt został dodany.")
                print('')
                input('Nacisnij ENTER aby kontynuować.')
                print('\033c', end='')

    elif wybor == "2":
        print('')
        imie = input("Podaj imię: ")
        if imie in kontakty:
            print('')
            mail = input("Podaj mail: ")
            kontakty[imie] = mail
            print('')
            print(kontakty)
            input('Nacisnij ENTER aby kontynuować.')
            print('\033c', end='') 
        else: 
            print("Brak wpisu na liście kontaktów")
            print("Dodaj nowy wpis, za pomocą klawisza 1")
            print('')
            print(kontakty)
            print('')
            input('Nacisnij ENTER aby kontynuować.')
            print('\033c', end='')

    elif wybor == "3":
        print('')
        imie = input("Podaj imię: ")
        kontakty.pop(imie, "brak kontaktu")
        print('')
        print(kontakty)
        print('')
        input('Nacisnij ENTER aby kontynuować.')
        print('\033c', end='')

    elif wybor == "4":
        print(kontakty)
        print('')
        input('Nacisnij ENTER aby kontynuować.')
        print('\033c', end='')

    elif wybor == "5":
        print('')
        imie = input("Podaj imię: ")
        print(kontakty.get(imie, "brak kontaktu"))
        input('Nacisnij ENTER aby kontynuować.')
        print('\033c', end='')

    elif wybor == "6":
        print("Koniec programu")
        print('\033c', end='')
        break
    else:
        print("Nie ma opcji o podanym kodzie.")
        print('\033c', end='')   

Powtórka ze struktur:

 
1. Lista(list) - uporządkowana, mutowalna, pozwala na duplikaty

list = [1, 2, 2, 3, 4] 
list.append(4) #dodanie elementu na koniec
list.extend #dodaje do listy elementy z innej listy
list.insert(i, x) #wstawia element x na **miejsce elementu** i
list[x] #dostęp do elementu po indexie
list.count(x) #zwraca liczbę wystąpień elementu x
list.count(2)
print(list.count(2)) -> (2)

list.remove(2) #usuwa pierwsze wystąpienie zduplikowanego elementu
list.pop([x]) #usuwa element o indexie i & go zwraca (domyślenie ostani)

list.sort(key=None, reverse=False) #sortuje liste "na miejscu" (modyfikuje oryginał)
list.reverse() #odwraca elementy listy /nie sortuje, tylko odwraca /

list.copy() #zwraca płytką kopie listy
    .copy() albo lista[:] → płytka kopia (nowa lista, ale elementy to referencje do tych samych obiektów).
    copy.deepcopy(lista) → głęboka kopia (tworzy całkowicie nowe obiekty, niezależne od oryginału).
    
m = list.copy()
m[4] = 99
print(list)
print(m)
wynik: list = [1, 2, 2, 3, 99]

list_2 = [[1, 2], [3, 4]]
kopia = lista.copy()     # płytka kopia

print(lista)  # [[1, 2], [3, 4]]
print(kopia)  # [[1, 2], [3, 4]]

# zmieniamy element w zagnieżdżonej liście
lista[0][0] = 99

print(list_2)  # [[99, 2], [3, 4]]
print(kopia)  # [[99, 2], [3, 4]]  <-- kopia też się zmieniła!

import copy

list_2 = [[1, 2], [3, 4]]
kopia = copy.deepcopy(lista)

lista[0][0] = 99

print(lista)  # [[99, 2], [3, 4]]
print(kopia)  # [[1, 2], [3, 4]]  <-- niezależna kopia

len(list) #zwraca ilość elementów w liście
print(len(list)) 
sum(list) #sumuje wszystkie elementy listy
print(sum(list))
max(list) #zwraca największy element listy
min(list) #zwraca najmniejszy element listy

2. Krotka (tuple) - uporządkowana, niemutowalna
Krotka ma tylko dwie metody: 
tuple = (1, 2, 2, 3, 4)
tuple.count(x) #zwraca liczbę wystąpień elementu x
tuple.count(2)
print(list.count(2)) -> (2)

index(x, [start], [stop]) #zwraca index pierwszego wystąpienia x
tuple = (1, 2, 3, 2, 4)
print(tuple.index(2)) #zwróci mi index pierwszego wystąpienia elementu (2) czyli 1. 
print(tuple.index(2, 2) #zwróci index drugiego wystąpienia elementu (2)

3. Zbiór (set) - nieuporządkowany, unikalne elementy(bez powtórzeń, jeśli chcemy szybko usunąć zduplikowane ****elementy -> zamieniamy set na list -> a następnie list na set. ****

set.add() #dodaje elementy zbioru
set.update() #dodaje elementu z innego zbioru iterowalnego
set.remove() # usuwa element, jeśli istnieje / jeśli nie KeyError
set.discard() #usuwa elementy, ale nie rzuca błędu jesli nie istnieje
set.pop() #usuwa i zwraca losowy element
set.clear() #usuwa wszystkie elementy

4. Słownik (dict) - para klucz:wartość
dict.keys #zwraca widok wszystkich kluczy
dict.values #zwraca widok wszystkich wartości
dict.items #zwraca widok wszystkich par

*#WAŻNE! GRAMATYKA W PYTHON JEST BARDZO WAŻNA. KAŻDY NAWIAS, KAŻDA PODŁOGA 
#MA ZNACZENIE. JESLI ZABRAKNIE KTOREGOS Z NAWIASÓW W W/W KOMNEDZIE PYTHON SIE WYSYPIE; 
#! WAŻNA II! rezultat metody .keys() jest to 'NIEZWYKŁA LISTA' po której można 'ITEROWAĆ'
#! Iteracja = przechodzenie element po elemencie w strukturze danych.
# dzięki temu możemy łatwo przetwarzać wszystkie elementy jednej kolekcji.
# przydaje się to w momencie kiedy musimy przeglądnąć liste w pętli; 
# w przypadku metody (list.(dict.keys())) otrzymjujemy zwykłą listę bez możliwośći ITERRACJI; 

# analogicznie jeśli chcemy uzyskać/wyciągnąć wartości /values/ używamy komendy: .values()
# lista wartości: list("nazwasłownika".values())*

dict.get(key, default=None) #zwraca wartość dla klucza, albo default jeśli klucza nie ma
dict.setdefault(key, default=None) #zwraca wartość pod klucz, jeśli klucza nie ma -> wstawia wartość default

dict.update({:}) #aktualizuje słownik na podstawie innego słownika lub par klucza:wartość
dict[key] = values #aktualizuje wartość już istniejącego elementu

#?Klamry {} – tworzą słownik, czyli pary klucz–wartość.
#?Nawiasy okrągłe () – oznaczają wywołanie metody update.
#?Wywołujesz funkcję update, która przyjmuje jeden argument – słownik z elementami do dodania.
Czyli:
#! [] → operator bezpośredni (przypisanie lub dostęp do pojedynczego klucza).
#! () + {} → wywołanie metody z argumentem w postaci słownika (dla wielu elementów).

#* Podsumowanie: 
#* Co robimy	Składnia	Działanie:
#todo Pojedynczy klucz–wartość	dictionary["history"] = 3	Przypisanie wartości do klucza
#TODO Dodanie wielu klucz–wartości	dictionary.update({"history":3,"biology":5})	
#* Wywołanie metody update z argumentem – słownikiem

dict.pop(key, [default]) #usuwa elementy o danym kluczu i zwraca jego wartość. 
( jeśli klucza brak i brak default ) = KeyError

dict.popitem() #usuwa ostatnio dodaną parę (klucz:wartość)
dict.clear #usuwa zawartość całego słownika

dict.copy() #zwraca płytką kopie słownika

## To oznacza, że nowy słownik będzie niezależnym obiektem, ale jeśli wartościami są obiekty mutowalne (np. listy), to nadal będą współdzielone.
## 

dict.fromkeys(old_dict, value=None) #tworzy nowy slownik z podanymi kluczami, przypisując im tą samą wartość 

old_dict = ["a", "b", "c"]
new_dict = dict.fromkeys(old_dict)
print(slownik)
# {'a': None, 'b': None, 'c': None}

old_dict = ["a", "b", "c"]
new_dict = dict.fromkeys(old_dict, 0)
print(slownik)
# {'a': 0, 'b': 0, 'c': 0}

funkcje wbudowane: 

dict.led() # liczba elementów słownika
dict.sorted() # posortowana liczba kluczy
dict.in #sprawdza czy klucz istnieje