Zadania

Przygotować funkcję przeliczającą jednostki metryczne na imperialne

  • metryczne: ($metry$, $metry^2$, $metry^3$)
  • imperialne: ($stopy$, $stopy^2$, $stopy^3$)

Jako parametry podajemy ilość jednostek oraz ilość wymiarów (długość, powierzchnia, objętość). Ilość jednostke musi być nieujemna a liczba wymiarów to (1,2,3). Jeżeli warunki nie są spełnione funkcja podaje jedynie informację o problemie i kończy działanie

In [1]:
def m2feet(m,unit=2):
    if m < 0:
        print("Wartość nie może być ujemna")
        return
    if unit not in (1,2,3):
        print("Nie znana wielkość")
        return
    feet=1/0.3001
    return m*feet**unit
    
m2feet(3.1413)
Out[1]:
34.88007607372018

Funkcja obliczająca pole trapezu

Napisać funkcję obliczającą pole trapezu. Do obliczenia przekazać słownik a nie pojedyncze wartości. Funkcja musi sprawdzać czy przekazano wartości nieujemne.

In [2]:
def poleTrapezu(a,b,h):
    return (a+b)/2*h

trapez={"a":10,"b":12,"h":7}

poleTrapezu(**trapez)
Out[2]:
77.0

Obliczanie pola pierścienia

Obliczyć pole pierścienia jako różnicę pomiędzy polem koła zewnętrznego a wewnętrznego. Koło wewnętrzne może mieć zerowy promień (domyślnie). Co zrobić w sytuacji jeżeli użytkownik funkcji pomyli kolejność promieni?

In [3]:
def polePierscienia(outer,inner=0):
    
    if outer == inner :
        return 0
    pi=3.141 
    return pi * abs(outer**2 - inner**2) 

polePierscienia(10,20)
Out[3]:
942.3

Funkcja obliczająca średnią z nieokreślonej liczby argumentów różnego typu

Funkcja sprawdza argumenty z listy, która jest przekazywana albo jako lista albo ciąg wartości i jeżeli wartość jest typu numerycznego używa do wyliczenia średniej inaczej pomija. Funkcja musi być odporna na sytuacje, gdy liczba elementów do obliczenia średniej wynosi 0 (dzielenie przez 0)

In [4]:
def srednia(*values):
    suma = 0
    num = 0
    for i in values:
        if type(i) in (int,float):
            suma += i
            num += 1
    
    if num>0:
        return suma/num
    else:
        return 0
    

lst =[20,11,10.5,"3",True,"1210a","lupa",5.4,3.1]
srednia(*lst)
Out[4]:
10.0

Funkcja zamykająca pierścień

Do funkcji przekazywana jest linia jako lista krotek, gdzie każda krotka to wspórzędne punktu. Linia tym się różni od pierścienia, że jest otwarta, tj ostatni element różni się od pierwszego. W pierścieniu pierwszy i ostatni element mają tę samą wartość. Do wykoania funkcji wykorzystać możliwość przekazywania obiektów złożonych przez referencję.

punkty = [(1,3),
          (2,4),
          (5,5),
          (6,2),
          (4,6)]
In [5]:
punkty = [(1,3),
          (2,4),
          (5,5),
          (6,2),
          (4,6)]

def closeLine(line):
    line.append(line[0])

closeLine(punkty)
punkty
Out[5]:
[(1, 3), (2, 4), (5, 5), (6, 2), (4, 6), (1, 3)]

Napisać funkcję, która identyfikuje liczbę sztorów i wypisuje komunikat.

Funkcja pobiera listę stanów morza i zwraca listę wartości logicznych (True), gdzie występowały sztormy oraz False jezeli nie wystąpił oraz podaje ich liczbę w formie komunikatu końcowego. Zastanowić się w jaki sposób zastosować operator trójkowy.

morze = [501,509,531,555,529,511,535,538,505,517]
In [6]:
morze = [501,509,531,555,529,511,535,538,505,517]

def sztormy(morze,sztorm=530):
    sztormy=[]
    for m in morze:
        sztormy.append(False if m < sztorm else True)
    
    print("liczba sztormów to " + str(sum(sztormy)))
    return sztormy

sztormy(morze)
liczba sztormów to 4
Out[6]:
[False, False, True, True, False, False, True, True, False, False]

Przeliczanie współrzędnych dziesiętnych na geograficzne

Napisać funkcję przeliczającą parę wspórzędnych w stopniach dziesiętnych na system geograficzny, gdzie minus oznacza półkulę zachodnią i południową. Ponieważ proces przeliczania stopni dziesietnych na geograficzne wykonywany jest dwa razy rozważyć rozbicie funkcji na dwie: funkcji głównej i funkcji przeliczającej stopnie dziesiętne na geograficzne. Jak rozpoznać półkulę i co zrobić ze znakiem minus.

In [7]:
def d2g(x):
    dec = int(x)
    m = (x*60)%60
    mnt = int(m)
    s = (m*60)%60
    sec = int(s)
    return str(dec) + "d" + str(mnt) + "m" + str(sec) +"s"    


def decimal2geographic(x,y):
    lnh = "W" if x < 0 else "E"    
    x=abs(x)
    lon = d2g(x)
    lon = lnh + lon
    
    lth = "S" if y < 0 else "N"
    y=abs(y)
    lat = d2g(y)
    lat = lth + lat

    return lon + " " + lat

   
decimal2geographic(153.981,-33.211)
Out[7]:
'E153d58m51s S33d12m39s'

Funkcja obliczająca odległość euklidesową poiędzy dwoma punktami

Funkcja musi sprawdzić czy argumentami funkcji są punkty tj krotki dwóch wartości a następnie zaostosować wzór na odległość euklidesową. W funkcji warto zastosować zmienne pomocnicze, które obliczą długości x i y

In [8]:
def distance(p1,p2):
    if len(p1) != 2 or len(p2) != 2:
        return "Wrong point format"
    x=p1[0]-p2[0]
    y=p1[1]-p2[1]
    return (x**2+y**2)**(1/2)

    
distance((21.13,14.55),(66.33,10.01))
Out[8]:
45.42743224088282

Oblicz długość linii

mamy linię zapisaną jako listę punktów (krotek) aby obliczyć jej długość, należy dodawać do siebie odległości pomiędzy kolejnymi punktami, zaczynając od odległości pomiędzy punktem poprzednim a następnym. Aby to wykonać, każdy punkt, który był następny musi zmienić się w kolejnym kroku iteracji w poprzedni.

punkty = [(1,3),
          (2,4),
          (5,5),
          (6,2),
          (4,6)]
In [9]:
punkty = [(1,3),
          (2,4),
          (5,5),
          (6,2),
          (4,6)]

def lineLength(points):
    prev = points[0]
    dist=0
    for point in points:
        dist += distance(prev,point)
        prev = point
    return dist
    

lineLength(punkty)
Out[9]:
12.210904837709434