Python – ćwiczenia

Poniżej znajduje się zbiór prostych zadań polegających na napisaniu różnych funkcji w języku Python. Proszę zadania wykonać (w miarę możliwości) indywidualnie tak aby każdy przekonał się czy umie pisać tego typu programiki (i ewentualnie czego musi się dowiedzieć).
Oczywiście, nie należy używać nietrywialnych funkcji “rozwiązujących całe zadanie”.

Uwaga: pod koniec zajęć proszę każdego o podesłanie kodu wszystkich rozwiązanych przez siebie zadań (jeden plik) na mojego maila:

adres: imię.nazwisko@cs.put.poznan.pl
temat: [PO] Python – zadania
treść: swoje imię i nazwisko oraz nr indeksu, (np.: Jan Kowalski 12345)
numery zadań które udało się zrobić (np.: 1-4,6)
załącznik: kod źródłowy

Zadania

Cały kod dla wszystkich poniższych zadań proszę zapisywać w jednym pliku.

  1. Napisz funkcję przyjmującą 3 argumenty liczbowe i zwracającą wartość środkową co do wartości (czyli medianę z tych trzech liczb). Proszę nie używać sortowania.
  2. Napisz funkcję przyjmującą jeden argument będący listą liczb i zwracającą medianę z podanych liczb. Dla jednoznaczności definicji mediany można założyć, że podana lista ma nieparzystą liczbę elementów. Można użyć metody sortującej podaną listę.
  3. Napisz funkcję przyjmującą listę liczb (jeden argument) i zwracającą sumę wszystkich liczb.
  4. Napisz funkcję przyjmującą listę liczb (jeden argument) i zwracającą dwie liczby (krotka): sumę wszystkich liczb ujemnych oraz sumę wszystkich liczb dodatnich.
  5. Napisz funkcję przyjmującą 2 argumenty: listę liczb oraz liczbę k. Funkcja ma zwracać sumę wszystkich liczb podniesionych do potęgi ktej.
  6. Napisz funkcję przyjmująca 2 argumenty – 2 listy liczb o tej samej długości. Funkcja ma zwracać odległość Euklidesową (norma L2) pomiędzy wektorami reprezentowanymi przez te dwie listy.
  7. Napisz funkcję przyjmującą 3 argumenty: listę liczb oraz liczby x i r. Funkcja ma zwrócić sumę liczb o indeksach od x-r do x+r włącznie. Rozważamy dwa warianty:
    a) Przyjmujemy, że elementy “poza” listą (np. o ujemnych indeksach) mają wartość równą zero (czyli je ignorujemy).
    b) Przyjmujemy, że elementy “poza” listą (np. o ujemnych indeksach) mają wartość równą trzy (3).
  8. Napisz funkcję przyjmującą 2 argumenty – 2 listy liczb (niekoniecznie o tym samym rozmiarze) interpretowane jako wektory x oraz y. Funkcja ma obliczyć sumę elementów macierzy M=x*yT (gdzie * to mnożenie macierzowe). Macierz M ma liczbę wierszy równą długości listy x oraz liczbę kolumn równą długości listy y.

Przykładowe rozwiązanie

Poniżej znajduje się przykładowy kod do powyższych zadań. Przedstawiona implementacja jest bez wątpienia jedną z wielu różnych możliwych…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#1
def mediana3(a,b,c):
    if b <= a <= c or c <= a <= b:
        return a
    if a <= b <= c or c <= b <= a:
        return b
    return c
 
assert mediana3(1,2,3) == 2
assert mediana3(3,2,1) == 2
assert mediana3(2,1,3) == 2
assert mediana3(2,3,1) == 2
assert mediana3(1,3,2) == 2
assert mediana3(3,1,2) == 2
 
#2
def mediana(l):
    return sorted(l)[len(l)//2]
 
assert mediana([1,2,3]) == 2
assert mediana([3,1,2,4,5]) == 3
 
#3
def sumaElementow(l):
    #return sum(l)
    suma = 0
    for x in l:
        suma += x
    return suma
 
assert sumaElementow([1,2,3]) == 6
 
#4
def sumaDodatnieUjemne(l):
    sumap = 0
    suman = 0
    for x in l:
        if x > 0:
            sumap += x
        else:
            suman += x;
    return sumap, suman
 
assert sumaDodatnieUjemne([1,2,3,-1,-2,-3]) == (6,-6)
 
#5
def sumak(l,k):
    return sum([x**k for x in l])
 
assert sumak([1,2,3],2) == 14
 
#6
def euklid(a,b):
    return sum([(x[0]-x[1])**2 for x in zip(a,b)]) ** 0.5
 
assert euklid([1,100],[3,100]) == 2
 
#7a
def sumR1(l,x,r):
    i1 = max(0,x-r)
    i2 = min(len(l),x+r+1)
    return sum(l[i1:i2])
 
assert sumR1([1,2,3,4], 1, 1) == 6
assert sumR1([1,2,3,4], 2, 1) == 9
assert sumR1([1,2,3,4], 0, 1) == 3
assert sumR1([1,2,3,4], 2, 100) == 10
 
#7b
def sumR2(l,x,r):
    suma = 0
    for i in range(x-r,x+r+1):
        suma += l[i] if 0 <= i < len(l) else 3
    return suma
 
assert sumR2([1,2,3,4], 1, 1) == 6
assert sumR2([1,2,3,4], 2, 1) == 9
assert sumR2([1,2,3,4], 0, 1) == 6
assert sumR2([1,2,3,4], 2, 100) == 10+3*(201-4)
 
#8
def sumaMacierz(x,y):
    suma = 0
    for a in x:
        for b in y:
            suma += a*b
    return suma
 
assert sumaMacierz([1,2,3],[4,5]) == 9*6