2023-programowanie-w-pythonie/zajecia1/odpowiedzi.ipynb

17 KiB

"""
Sprawdź czy tekst 'aAaAaA' znajduje się w tablicy passwords.
W zależności czy znajduje się czy też nie, wyświetl na ekranie odpowiedni komunikat.
"""

passwords = ['aaAaa', 'aAAAaa', 'aaaaaaA', 'aaaAAAAA', 'aaAAAaa', 'aAaAaA', 'aAaAaAA']
if 'aAaAaA' in passwords:
    print('napis ' + 'aAaAaA' + ' znajduje sie w tablicy passwords')
else:
    print(' napis' + 'aAaAaA' + ' nie znajduje sie w tablicy passwords')
napisaAaAaAznajduje sie w tablicy passwords
"""
Niech x oznacza liczbę uzyskanych punktów. Standardowa skala ocen jest następująca:
* x >= 90 -- 5.0
* 90 > x >= 80 -- 4.5
* 80 > x >= 70 -- 4.0
* 70 > x >= 60 -- 3.5
* 60 > x >= 50 -- 3.0
* x < 50 -- 2.0

Zmienna `points` zawiera liczbę uzyskanych punktów przez studenta.
Napisz instrukcję warunką, która wyświetli ocenę studenta w zależności od liczby punktów.
"""

points = 85
def print_grade(grade):
    print('Twoja ocena to: ',grade)
    
    
# te rozwiązanie korzysta z ciekawej możliwości zawarcia dwóch warunków a<x<b w jednej lini
if points >= 90:
    print_grade(5.0)
elif 90 > points >= 80:
    print_grade(4.5)
elif 80 > points >= 70:
    print_grade(4.0)
elif 70 > points >= 60:
    print_grade(3.5)
elif 60 > points >= 50:
    print_grade(3.0)
else:
    print_grade(2.0)
    
# albo można tak:
if points >= 90:
    print_grade(5.0)
elif 90 > points:
    print_grade(4.5)
elif 80 > points:
    print_grade(4.0)
elif 70 > points:
    print_grade(3.5)
elif 60 > points:
    print_grade(3.0)
else:
    print_grade(2.0)
    
Twoja ocena to:  4.5
Twoja ocena to:  4.5
"""
Oblicz sumę  liczb od 1 do 678.
"""
# te dodanie 1 jest ważne, bo python nie włącza końca przedziału
sum(list(range(1,678+1)))
230181

"""
Słownik `oceny` zawiera oceny kilku osób. Kluczami są imiona dzieci, a wartosciami -- ich oceny.
Uzupełnij słownik `rozklad`, którego kluczami są oceny, a wartosciami -- listy... 
"""

oceny = {
    'Albert': 4.5,
    'Beata': 5,
    'Cecylia': 4,
    'Dariusz': 4,
    'Eliza': 3,
    'Feliks': 5,
    'Grzegorz': 4.5,
    'Izabela': 4.5
}

rozklad = {
    5: [],
    4.5: [],
    4: [],
    3: []
}
for key, value in oceny.items():
    rozklad[value].append(key)
rozklad
        
{5: ['Beata', 'Feliks'],
 4.5: ['Albert', 'Grzegorz', 'Izabela'],
 4: ['Cecylia', 'Dariusz'],
 3: ['Eliza']}

"""
Poniżej znajdują się 2 słowniki z danymi o liczbie przejazdów rowerami miejskimi w Montrealu w 2018 z podziałem na miesiące (od kwietnia do listopada).
Pierwszy słownik zawiera informacje o przejazdach wykonanych przez posiadaczy abonamentu, a drugi przez ludzi, którzy
nie mają wykupionego abonamentu. Dane pochodzą ze strony https://montreal.bixi.com/en/open-data. 

a) Stwórz trzeci słownik `all_rides`, w którym zliczysz łączną liczbę przejazdów w każdym z podanych miesięcy.
b) Oblicz sumę zarejestrowanych przejazdów od kwietnia do listopada.
c) Wyswietl jaki procent wszystkich przejazdów odbyło się w sierpniu (August).

"""

members = {
    'April': 211819,
    'May': 682758,
    'June': 737011,
    'July': 779511,
    'August': 673790,
    'September': 673790,
    'October': 444177,
    'November': 136791,
}

occasionals = {
    'April': 32058,
    'May': 147898,
    'June': 171494,
    'July': 194316,
    'August': 206809,
    'September': 140492,
    'October': 53596,
    'November': 10516,
}
all_rides = dict()
for key,value in members.items():
    all_rides[key] = value

for key,value in occasionals.items():
    all_rides[key] += value

print(all_rides)
# można też to zrobić szybciej korzystająć z list comprehensions, albo  np biblioteki copy

print(sum(all_rides.values()))

print(100 * all_rides['August'] / sum(all_rides.values()), '%')
print(round(100 * all_rides['August'] / sum(all_rides.values()),2), '%') # zaokrąglenie
{'April': 243877, 'May': 830656, 'June': 908505, 'July': 973827, 'August': 880599, 'September': 814282, 'October': 497773, 'November': 147307}
5296826
16.62503166990949 %
16.63 %
"""
Napisz kod, który zwraci tzw. "Big 'NO!'" (zob. http://tvtropes.org/pmwiki/pmwiki.php/Main/BigNo)
dla zadanej liczby tj. napis typu "NOOOOOOOOOOOOO!", gdzie liczba 'O' ma być
równa wartości zmniennej `number_of_o`. Jeśli argument jest mniejszy niż 5, ma być zwracany napis "It's not a Big 'No!'".
Wyświetl ten napis na ekran.
"""

number_of_o = 6
if number_of_o < 5:
    print("It's not a Big 'No!'")
else:
    print("N"+"O"*number_of_o+'!')
NOOOOOO!
"""
 * Podziel zmienną `text` na słowa, korzystając z metody split.
 * Dodaj do listy `oov`, wszystkie słowa (bez powtórzeń), które nie są zawarte w liście `vocab`.
"""


text = "this is a string , which i will use for string testing"
vocab = [',', 'this', 'is', 'a', 'which', 'for', 'will', 'i']

oov = []
text_splitted = text.split()
text_splitted_no_repeats = set(text_splitted)

for item in text_splitted_no_repeats:
    if item not in vocab:
        oov.append(item)
        
oov
['string', 'use', 'testing']
"""
1. Napisz rekurencyjną funkcję, która zwróci n-ty wyraz ciągu Fibonacciego.
2. Napisz funkcję, która obliczy n-ty wyroz ciągu Fibonacciego nie korzystając z rekurencji.
Np. możesz wykorzystać listę do obliczania kolejnych wartości ciągu.

Ciąg Fibonacciego:
a[0] = 1, a[1] = 1, a[n] = a[n-1] + a[n-2] dla n>=2

"""
'\n1. Napisz rekurencyjną funkcję, która zwróci n-ty wyraz ciągu Fibonacciego.\n2. Napisz funkcję, która obliczy n-ty wyroz ciągu Fibonacciego nie korzystając z rekurencji.\nNp. możesz wykorzystać listę do obliczania kolejnych wartości ciągu.\n\nCiąg Fibonacciego:\na[0] = 1, a[1] = 1, a[n] = a[n-1] + a[n-2] dla n>=2\n\n'
def fib(n):
    if n == 0:
        return 1
    elif n == 1:
        return 1
    else:
        return fib(n-1) + fib(n-2)
fib(10)
89

"""
Napisz funkcję sum_div35(n), która zwraca sumę wszystkich liczb podzielnych
przez 3 lub 5 mniejszych niż n.
"""

def sum_div35(n):
    pass

input = 100
# dla n =100 poprawna odpowiedź to 2318
def sum_div35(n):
    all_numbers = []
    for i in range(n):
        if i % 3 == 0 or i % 5 == 0:
            all_numbers.append(i)
    return sum(all_numbers)

sum_div35(100)

# alternatywnie:
def sum_div35(n):
    return sum([i for i in range(n) if i % 3 == 0 or i % 5 == 0 ])
sum_div35(100)
2318
"""
Otwórz plik `zen_of_python.txt` i zlicz liczbę linii i słów w tym pliku. 
Następnie przerób kod na funkcję, która jako argument będzie przyjmować ściężkę do pliku i będzie zwracać 
słownik z dwoma kluczami: `liczba_linii` i `liczba_slow`.
"""
'\nOtwórz plik `zen_of_python.txt` i zlicz liczbę linii i słów w tym pliku. \nNastępnie przerób kod na funkcję, która jako argument będzie przyjmować ściężkę do pliku i będzie zwracać \nsłownik z dwoma kluczami: `liczba_linii` i `liczba_slow`.\n'
print(len(open('zen_of_python.txt').readlines()))

def count_lines_and_words(path):
    lines = 0
    words = 0
    with open(path) as f:
        for line in f:
            lines += 1
            words += len(line.split())
    return lines, words

count_lines_and_words('zen_of_python.txt')
19
(19, 137)
"""
Zadania: Zaimportuj bibliotekę statistics, która zawiera funckje do obliczenia podstawych wielkości statystycznych (średnia, mediana, moda):
    statistics.mean -- obliczenie średniej
    statistics.median -- obliczenie mediany
    statistics.variance -- obliczenie wariancji
    statistics.stdev -- obliczenie odchylenia standardowego Oblicz te wielkości dla wartości z poniższego słownika.
Każda z tych funkcji przyjmuje jeden argument: listę wartości.
"""

members = {
    'April': 211819,
    'May': 682758,
    'June': 737011,
    'July': 779511,
    'August': 673790,
    'September': 673790,
    'October': 444177,
    'November': 136791,
}
import statistics

values = members.values()

print(statistics.mean(values))
print(statistics.median(values))
print(statistics.variance(values))
print(statistics.stdev(values))
542455.875
673790.0
61681755885.83929
248358.12023334226
"""
Biblioteka random posiada funkcję random, która zwraca losową licznę z przedziału [0, 1) (nie przyjmuje żadnych argumentów).
Biblioteka math posiada funkcję hypot, która oblicza odległość punktu od środka układu współrzędnych (punktu [0, 0]) i przyjmuje dwa argumenty: współrzędne punktu.
* Zaimportuj biblioteki random i math
* korzystając z funkcji random wylosuj dwie liczby i przypisz wyniki do zmniennych x i y.
* Korzystając z funkcji hypot oblicz odległość punktu o współrzednych (x,y).
* Dodaj pętlę, która będzie wykonywać te czynności n = 10 razy i będzie zliczać ile razy obliczona odległość jest mniejsza od 1.
* Oblicz stosunek liczby punktów, dla których odległość wynosiła mniej niż 1 do całkowitej liczby punktów. Pomnóż tę wartocść przez 4.
* Podstaw za n wartości 100, 1000, 1000000. Do jakiej wartości zbiegają wartości?
"""
import random
import math

x,y = random.random(), random.random()
print(math.hypot(x,y))

n = 1000000
lower_than_1_number = 0
for i in range(n):
    x,y = random.random(), random.random()
    if math.hypot(x,y) < 1 :
        lower_than_1_number +=1
print(lower_than_1_number)

print((lower_than_1_number / n )*4)

# zmierza do stałej PI
1.023482041105784
785667
3.142668