# [expression for item in iterable if condition]

lista = [1, 2, 3, 4, 5]
kwadraty = [i*i for i in lista]
print(kwadraty)

kwadraty2 = (i*i for i in lista)
print(kwadraty2)

kwadraty3 = {i*i for i in lista}
print(kwadraty3)

kwadraty4 = {i:i*i for i in lista}
print(kwadraty4)

kwadraty5 = tuple(i*i for i in lista)
print(kwadraty5)

podwojenia = [2*i for i in range(10)]
print(podwojenia)

kwadraty6 = [i*i for i in lista if i % 2 == 0]
print(kwadraty6)

panstwa = ['Polska', 'Niemcy', 'Francja', 'Hiszpania']
stolice = ['Warszawa', 'Berlin', 'Paryż', 'Madryt']

informacje = [f'{stolica} to stolica kraju {panstwo}' for panstwo, stolica in zip(panstwa, stolice)]

for info in informacje:
    print(info)

# ZADANIE 1
slowa = ['ala', 'kot', 'pies', 'kamilslimak', 'zebra', 'madam', 'Adam']
# stwórz listę zawierającą wyłącznie palindromy
print([slowo for slowo in slowa if slowo == slowo[::-1]])

# ZADANIE 2
trojkaty = [(1, 3, 5), (2, 2, 3), (3, 1, 8), (3, 4, 5)]
#               X          V          X          V
# stwórz listę zawierającą wyłącznie krotki, które mogłyby zawierać długości boków trójkąta
print([trojkat for trojkat in trojkaty if 2 * max(trojkat) < sum(trojkat)])

# ZADANIE 3
st_fahr = [32, 68, 104, 140]
# fahrenheit na celciusz
# (temperatura - 32) * 5/9
print([(temp - 32) * 5/9 for temp in st_fahr])

# ZADANIE 4
string = 'hello@123world!456'
# pozbyć się wszystkiego co nie jest cyfrą bądź literą
print(''.join([char for char in string if char.isalpha() or char.isdigit()]))

# OBSŁUGA WYJĄTKÓW
try:
    # kod który sprawdzamy pod względem wyjątku
    pass
except Exception as e:
    # jak wywali błąd
    pass
else:
    # jak nie wywali błędu
    pass
finally:
    # niezależnie czy wywali błąd
    pass

# ZADANIE 1
# Funkcja dzielenia i mnożenia a i b

def dzielenie_i_mnozenie(a, b):
    try:
        a / b
    except Exception as e:
        print(e)
    else:
        print(f'Wynik dzielenia: {a / b}')
    finally:
        print(f'Wynik mnożenia: {a * b}')

dzielenie_i_mnozenie(5, 2)
dzielenie_i_mnozenie(0, 2)
dzielenie_i_mnozenie(5, 0)

# ZADANIE 2

# Napisz funkcję dodawanie, która przyjmuje dwa argumenty a i b oraz wyświetla ich sumę. Co się wydarzy jeżeli jako argument podamy inta i stringa?

def dodawanie(a, b):
    try:
        a + b
    except Exception as e:
        print('Typy nie sa zgodne')
    else:
        print(a + b)

dodawanie(5, 5)
dodawanie('5', 5)
dodawanie('5', '5')


def parzyste(a, b):
    try:
        if a % 2 == 1 or b % 2 == 1:
            raise Exception ('To nie są liczby parzyste')
    except Exception as e:
        print(e)
    else:
        print(a + b)

parzyste(2, 4)
parzyste(1, 3)
parzyste(1, 4)

# ZADANIE 3
# Stwórz funkcję dzielącą zdanie na wyrazy. Prawidłowe zdanie powinno zaczynać się od wielkiej i kończyć kropką. W razie niespełnienia wymogów powinien zostać zgłoszony wyjątek z informcją o wymaganej korekcie

def zdanie_na_wyrazy(zdanie):
    try:
        if not zdanie[0].isupper():
            raise Exception ('Zdanie musi się zaczynać z wielkiej litery')
        elif zdanie[-1] not in ['.', '!', '?']:
            raise Exception ('Zdanie musi kończyć się odpowiednim znakiem interpunkcyjnym')
    except Exception as e:
        print(e)
    else:
        print(zdanie.split(' '))
    finally:
        print('Ukończono')

zdanie_na_wyrazy('ala ma kota')
zdanie_na_wyrazy('Kuba ma kota')
zdanie_na_wyrazy('kuba ma psa.')
zdanie_na_wyrazy('Ala ma kota.')