Laboratoria komputerowe do wykładu Andrzeja Giniewicza.
Zasady zaliczenia
Ogólne zasady zaliczenia kursu można znaleźć na stronie kursu u wykładowcy.
Doprecyzowania obowiazujace w moich grupach:
Conajmniej pierwsze 4 listy będziemy robić na zajęciach, w systemie deklaracyjnym. Po zajęciach proszę o przesłanie rozwiązań. Kolejne listy zadań będą w formie zadań domowych, do zrobienia i przesłania przed zajęciami. Rozwiązania będą omiawiane i wyrywkowo sprawdzane w trakcie zajęć.
Wyobraź sobie, że pomagasz młodszemu koledze lub koleżance, którzy dalej są w liceum. Chcesz przygotować interaktywny notebook tłumaczący jakieś zagadnienie z zakresu matematyki, fizyki, informatyki lub chemii. Wybrany temat może, ale nie musi pochodzić z zakresu nauczania w szkole średniej. Ma być zrozumiały i dostępny dla ucznia liceum. Kod Python nie musi być zrozumiały dla licealisty. Polecam wybrać temat, który Ciebie też interesuje.
W Twoim dokumencie powinny znaleźć się prawidłowo sformatowane komórki tekstowe, z nagłówkami oraz wzorami. Umieść również obliczenia wykonane w języku Python, jako ilustrację do niektórych przykładów, rozwiązanie zadań, lub wizualizację. Można, ale nie trzeba używać modułów Python nie przedstawionych na kursie.
Za zadanie domowe można dostać maksymalnie 10 punktów. Po 3 za użycie Pythona, skład i formatowanie komórek Markdown oraz treść tłumaczaca zagadnienie. Dodatkowy punkt za ogólna schludność i estetykę zeszytu.
Gdybyś chciał wydrukować notatnik, powinien zająć przynajmniej dwie strony A4 przy standardowym rozmiarze kroju pisma (podpowiedź - możesz sprawdzić podgląd wydruku w menu File w narzędziu Jupyter Lab, jeśli trudno ocenić Ci ile już napisałeś).
Termin oddania do 19 listopada (grupa wtorkowa) / 21 listopada (grupa czwartkowa). Zadanie domowe proszę przesyłać mailowo. Proszę załaczyć informację czy zgadzasz się na pokazanie Twojej pracy innym studentom i opublikowanie jej tutaj jako przyklad.
Od 7-mych zajęć można zgłaszać się na ochotnika, co najmniej 3 ochotników jest wymaganych na jednych zajęciach.
Można się łączyć w grupy w obrębie moich 2 zajęć (wtorek 7:30 i czwartek 7:30), ale nie poza. Zakładam w sumie 5-8 grup projektowych.
Punkty zostaną przydzielone na zasadzie normalizacji rozkładu aktywności na zajęciach. Gwarantuję, że jedna duża aktywność (np. przedstawienie pełnego rozwiązania z listy) będzie dawała co najmniej jeden punkt.
Python
Przykłady ilustrujące wachlarz możliwości zeszytów Jupyter i Markdown w zastosowaniach matematycznych. Wymagają one osobnych ustawień środowiska programistycznego i zewnętrznych narzędzi. Polecam zapoznanie się z nimi czysto ilustracyjnie jako motywacja do nauki.
- Wizualizacja zbioru Mandelbrota obliczana na karcie graficznej - link
- Pobieranie i analiza danych o cenie akcji spółki giełdowej - link
- Numeryczne rozwiązanie równań różniczkowych cząstkowych - link
- Rozwiązania zadań z podstaw algebry liniowej - link
- Cała obecna strona została utworzona z wykorzystaniem Markdownu i Pythona korzystając z technologii [Quarto]](https://quarto.org/) - link
Python lista 1 - wyrażenia matematyczne
Zamiast
warto użyć
Zmniejszamy ilość pisania przy wielokrotnym użyciu, a sam import jest wydajniejszy co może mieć znaczenie przy bardziej zaawansowanych zadaniach.
Funkcje pierwiastka kwadratowego i podnoszenia do potęgi \(1/2\) są oczywiście równoważne, natomiast polecana jest
math.sqrt
. Mniej ogólne algorytmy są zazwyczaj lepiej zoptymalizowane (przy naszych zastosowaniach nie ma to jednak znaczenia).W zadaniu 4 występuje funkcja podłoga $ x $. Jest to największa liczba całkowita mniejsza niż \(x\). W Pythonie można używać funkcji
math.floor
.Zadanie 5 pokazuje, jak ważne jest umiejetne korzystanie ze zmiennych pomocniczych.
from math import sqrt, pi suma_w_nawiasie = 5 ** 4 + 53 * sqrt(89) mianownik = 80 * sqrt(15) * suma_w_nawiasie ** (3/2) licznik = 3308 * suma_w_nawiasie - 3 * sqrt(89) pi_przyblizenie = mianownik / licznik print(round(pi_przyblizenie, 10)) print(round(pi_przyblizenie, 10) == round(pi, 10))
3.1415926536 True
W powyższym kodzie dużo łatwiej wyłapac bład niż w jednolinijkowym gigancie.
Do zadania 6 wrócimy jeszcze raz po funkcjach i pętlach aby zaimplemetować dużo czytelniejsze rozwiązanie.
Python lista 2 - napisy
W razie gdy chcemy sprawdzić, gdzie w systemie zapisany jest dany plik Python albo zeszyt Jupyter poniższe drukuje obecna ścieżkę robocza (Current Working Directory).
Python lista 3 - listy i słowniki
Komentarze dla zaawansowanych:
Zadanie 2
Kluczem do pisania szybkiego kodu w Pythonie jest jak najczestsze kożystanie z wbudowanych funkcji, które wykonywane sa bezposrednio w języku niskopoziomowym.
Przykładowo, to zadanie można elegancko rozwiazac za pomoca wbudowaniej biblioteki itertools
. Składaja się na nia pomocnicze funkcje rozwiazujace często potrzebne funkcjonalności dookoła iteratorów:
from itertools import accumulate
L = list(accumulate((-1) ** i / (i) for i in range(1, 101)))
print(L)
[-1.0, -0.5, -0.8333333333333333, -0.5833333333333333, -0.7833333333333332, -0.6166666666666666, -0.7595238095238095, -0.6345238095238095, -0.7456349206349207, -0.6456349206349207, -0.7365440115440116, -0.6532106782106782, -0.7301337551337552, -0.6587051837051838, -0.7253718503718505, -0.6628718503718505, -0.7216953797836152, -0.6661398242280596, -0.718771403175428, -0.6687714031754279, -0.7163904507944756, -0.6709359053399302, -0.7144141662094954, -0.6727474995428288, -0.7127474995428288, -0.6742859610812904, -0.7113229981183273, -0.6756087124040416, -0.7100914710247312, -0.6767581376913979, -0.7090162022075269, -0.6777662022075269, -0.7080692325105572, -0.6786574678046748, -0.7072288963761034, -0.6794511185983256, -0.7064781456253526, -0.6801623561516684, -0.7058033817926941, -0.6808033817926941, -0.7051936256951331, -0.6813841018856093, -0.7046399158390977, -0.681912643111825, -0.7041348653340472, -0.6823957348992646, -0.7036723306439455, -0.6828389973106122, -0.7032471605759183, -0.6832471605759183, -0.7028550037131732, -0.683624234482404, -0.7024921590107058, -0.6839736404921873, -0.7021554586740055, -0.6842983158168626, -0.7018421754659854, -0.6846007961556405, -0.7015499486980133, -0.6848832820313466, -0.7012767246542975, -0.685147692396233, -0.7010207082692488, -0.6853957082692488, -0.7007803236538641, -0.685628808502349, -0.7005541816366774, -0.6858482992837363, -0.7003410529069246, -0.6860553386212104, -0.7001398456634639, -0.686250956774575, -0.6999495869115613, -0.6864360733980478, -0.6997694067313811, -0.686611511994539, -0.699598524981552, -0.6867780121610392, -0.6994362400091404, -0.6869362400091404, -0.6992819190214861, -0.6870867970702665, -0.6991349898413509, -0.687230227936589, -0.698994933818942, -0.6873670268421977, -0.698861279715761, -0.6874976433521246, -0.6987335984083044, -0.6876224872971933, -0.6986114982862043, -0.6877419330688129, -0.6984946212408559, -0.6878563233685155, -0.6983826391579893, -0.6879659724913226, -0.6982752508418381, -0.688071169209185, -0.698172179310195, -0.688172179310195]
Stosujemy tu potrójne złożenie generatorów. Generatory to obiekty, po których możemy iterować, a zwaracaja wartości pojedynczo. Często wykonywane jest to leniwie, dopiero kiedy sa o to zapytane.
range(1, 101)
tworzy generator liczb od 1 do 100, nie trzyma tych liczb od razu w pamięci, tylko wie która jest następna.(func(n) for n in range(1, 101))
tworzy generator liczb od 1 do 100, a potem wykona operacje na nich.accumulate
bierze coś po czym moźna iterować i operator binarny (domyślnie+
) i zwraca generator częściowych wartości używania tego operatora na wszystkich elementach generatora.list
tworzy listę zawierajaca elementy złożonego generatora, zmusza do materializacji wynikow. Wszystko powyżej było tworzone leniwie.
Zadanie 5
Iterowanie się po wszystkich elementach zbioru często da się zastapić za pomoca matematycznych operacji na zbiorach, które sa dobrze zoptymalizowane.
S = {"dolnośląskie", "lubuskie", "wielkopolskie"}
M = {"Wrocław", "Opole", "Zielona Góra", "Gorzów Wielkopolski"}
D = {
"dolnośląskie": {"Wrocław"},
"kujawsko-pomorskie": {"Bydgoszcz", "Toruń"},
"lubelskie": {"Lublin"},
"lubuskie": {"Gorzów Wielkopolski", "Zielona Góra"},
"łódzkie": {"Łódź"},
"małopolskie": {"Kraków"},
"mazowieckie": {"Warszawa"},
"opolskie": {"Opole"},
"podkarpackie": {"Rzeszów"},
"podlaskie": {"Białystok"},
"pomorskie": {"Gdańsk"},
"śląskie": {"Katowice"},
"świętokrzyskie": {"Kielce"},
"warmińsko-mazurskie": {"Olsztyn"},
"wielkopolskie": {"Poznań"},
"zachodniopomorskie": {"Szczecin"},
}
print(set.union(*D.values()))
print({key for key, value in D.items() if value.intersection(M)})
{'Łódź', 'Gorzów Wielkopolski', 'Toruń', 'Kielce', 'Zielona Góra', 'Gdańsk', 'Katowice', 'Kraków', 'Opole', 'Białystok', 'Wrocław', 'Poznań', 'Bydgoszcz', 'Lublin', 'Warszawa', 'Rzeszów', 'Olsztyn', 'Szczecin'}
{'lubuskie', 'opolskie', 'dolnośląskie'}
Zadanie 6
W Pythonie 3.8+ jest to możliwe za pomoca operatora :=
(walrus operator). Pozwala na tworzenie zmiennych pomocniczych wewnatrz wyrażeń języka.
from math import sin, cos, radians
n = 101
punkty = {
(angle:=i * 360 / n): (cos(radians(angle)), sin(radians(angle)))
for i in range(n)
}
print(punkty)
{0.0: (1.0, 0.0), 3.5643564356435644: (0.9980655971335943, 0.06216963743148053), 7.128712871287129: (0.9922698723632765, 0.12409875261325935), 10.693069306930694: (0.9826352482222637, 0.18554775382949326), 14.257425742574258: (0.9691989991996661, 0.24627890683200138), 17.821782178217823: (0.9520131075327299, 0.30605725458788735), 21.386138613861387: (0.9311440620976595, 0.3646515262826552), 24.95049504950495: (0.9066726011770726, 0.4218350320620623), 28.514851485148515: (0.8786934000992688, 0.4773865400511271), 32.07920792079208: (0.8473147049577775, 0.531091132257275), 35.64356435643565: (0.8126579138282503, 0.5827410360463009), 39.20792079207921: (0.7748571071028898, 0.6321364279743265), 42.772277227722775: (0.7340585287594601, 0.6790862068658859), 46.336633663366335: (0.6904200205717468, 0.7234087331472497), 49.9009900990099: (0.6441104114503977, 0.7649325315746477), 53.46534653465346: (0.5953088642766661, 0.8034969546386757), 57.02970297029703: (0.5442041827560273, 0.8389528040783012), 60.59405940594059: (0.4909940809733222, 0.8711629080999505), 64.15841584158416: (0.4358844184753712, 0.90000265206853), 67.72277227722772: (0.3790884038403794, 0.9253604606172415), 71.2871287128713: (0.3208257698153676, 0.9471382293110002), 74.85148514851485: (0.26132192321286074, 0.9652517041934356), 78.41584158415841: (0.20080707285571844, 0.9796308077490816), 81.98019801980197: (0.13951533894392312, 0.9902199100196695), 85.54455445544555: (0.07768384728900624, 0.9969780438256293), 89.10891089108911: (0.015551811920350793, 0.9998790632601495), 92.67326732673267: (-0.046640390387417484, 0.9989117448426108), 96.23762376237623: (-0.10865215008547437, 0.9940798309400526), 99.8019801980198: (-0.17024355572239872, 0.9854020152886813), 103.36633663366337: (-0.23117632211496966, 0.9729118706714375), 106.93069306930693: (-0.2912147122272519, 0.9566577190314197), 110.4950495049505: (-0.3501264491913907, 0.936702444523675), 114.05940594059406: (-0.40768361494168887, 0.9131232502286187), 117.62376237623762: (-0.46366353198532706, 0.8860113594683149), 121.18811881188118: (-0.5178496248983254, 0.8554716628811638), 124.75247524752476: (-0.5700322582137827, 0.8216223126204006), 128.31683168316832: (-0.620009547460775, 0.7845942652463661), 131.88118811881188: (-0.6675881402161536, 0.7445307750810152), 135.44554455445544: (-0.7125839641475069, 0.7015868399847767), 139.009900990099: (-0.7548229391532569, 0.6559286016999402), 142.5742574257426: (-0.7941416508447535, 0.6077327030805316), 146.13861386138615: (-0.8303879827647975, 0.5571856046954285), 149.7029702970297: (-0.8634217048966635, 0.5044828634486399), 153.26732673267327: (-0.8931150161867917, 0.44982837600763564), 156.83168316831683: (-0.9193530389822364, 0.3934335899667523), 160.3960396039604: (-0.9420342634699891, 0.335516685797525), 163.96039603960395: (-0.9610709403987245, 0.2763017327508305), 167.52475247524754: (-0.976389420563607, 0.2160178219764834), 171.0891089108911: (-0.9879304397407567, 0.1548981802140847), 174.65346534653466: (-0.9956493479690186, 0.09317926748407171), 178.21782178217822: (-0.9995162822919881, 0.031099862269836753), 181.78217821782178: (-0.9995162822919881, -0.03109986226983695), 185.34653465346534: (-0.9956493479690186, -0.09317926748407147), 188.9108910891089: (-0.9879304397407568, -0.15489818021408447), 192.47524752475246: (-0.9763894205636071, -0.21601782197648314), 196.03960396039605: (-0.9610709403987245, -0.27630173275083025), 199.6039603960396: (-0.9420342634699891, -0.33551668579752525), 203.16831683168317: (-0.9193530389822363, -0.3934335899667525), 206.73267326732673: (-0.8931150161867916, -0.4498283760076358), 210.2970297029703: (-0.8634217048966636, -0.5044828634486397), 213.86138613861385: (-0.8303879827647976, -0.5571856046954283), 217.4257425742574: (-0.7941416508447537, -0.6077327030805314), 220.990099009901: (-0.754822939153257, -0.6559286016999399), 224.55445544554456: (-0.7125839641475068, -0.7015868399847768), 228.11881188118812: (-0.6675881402161534, -0.7445307750810153), 231.68316831683168: (-0.6200095474607752, -0.7845942652463659), 235.24752475247524: (-0.5700322582137832, -0.8216223126204003), 238.8118811881188: (-0.5178496248983256, -0.8554716628811637), 242.37623762376236: (-0.4636635319853273, -0.8860113594683149), 245.94059405940595: (-0.40768361494168853, -0.913123250228619), 249.5049504950495: (-0.3501264491913909, -0.9367024445236749), 253.06930693069307: (-0.291214712227252, -0.9566577190314197), 256.63366336633663: (-0.2311763221149701, -0.9729118706714374), 260.1980198019802: (-0.17024355572239874, -0.9854020152886813), 263.76237623762376: (-0.10865215008547438, -0.9940798309400526), 267.3267326732673: (-0.04664039038741795, -0.9989117448426108), 270.8910891089109: (0.015551811920350768, -0.9998790632601495), 274.45544554455444: (0.07768384728900554, -0.9969780438256294), 278.019801980198: (0.13951533894392268, -0.9902199100196695), 281.58415841584156: (0.20080707285571756, -0.9796308077490818), 285.1485148514852: (0.2613219232128609, -0.9652517041934355), 288.71287128712873: (0.3208257698153682, -0.947138229311), 292.2772277227723: (0.37908840384037934, -0.9253604606172415), 295.84158415841586: (0.4358844184753714, -0.9000026520685299), 299.4059405940594: (0.490994080973322, -0.8711629080999506), 302.970297029703: (0.5442041827560273, -0.8389528040783011), 306.53465346534654: (0.5953088642766663, -0.8034969546386754), 310.0990099009901: (0.6441104114503976, -0.7649325315746478), 313.66336633663366: (0.6904200205717469, -0.7234087331472497), 317.2277227722772: (0.7340585287594598, -0.6790862068658863), 320.7920792079208: (0.7748571071028897, -0.6321364279743266), 324.35643564356434: (0.8126579138282498, -0.5827410360463015), 327.9207920792079: (0.8473147049577773, -0.5310911322572754), 331.48514851485146: (0.8786934000992683, -0.4773865400511279), 335.0495049504951: (0.9066726011770727, -0.4218350320620621), 338.61386138613864: (0.9311440620976598, -0.3646515262826547), 342.1782178217822: (0.9520131075327298, -0.30605725458788735), 345.74257425742576: (0.9691989991996662, -0.2462789068320011), 349.3069306930693: (0.9826352482222637, -0.18554775382949354), 352.8712871287129: (0.9922698723632765, -0.12409875261325934), 356.43564356435644: (0.9980655971335943, -0.0621696374314802)}
Inna metoda jest użycie generatora wewnatrz listy składanej.
punkty = {
angle: (cos(radians(angle)), sin(radians(angle)))
for angle in (i * 360 / n for i in range(n))
}
print(punkty)
{0.0: (1.0, 0.0), 3.5643564356435644: (0.9980655971335943, 0.06216963743148053), 7.128712871287129: (0.9922698723632765, 0.12409875261325935), 10.693069306930694: (0.9826352482222637, 0.18554775382949326), 14.257425742574258: (0.9691989991996661, 0.24627890683200138), 17.821782178217823: (0.9520131075327299, 0.30605725458788735), 21.386138613861387: (0.9311440620976595, 0.3646515262826552), 24.95049504950495: (0.9066726011770726, 0.4218350320620623), 28.514851485148515: (0.8786934000992688, 0.4773865400511271), 32.07920792079208: (0.8473147049577775, 0.531091132257275), 35.64356435643565: (0.8126579138282503, 0.5827410360463009), 39.20792079207921: (0.7748571071028898, 0.6321364279743265), 42.772277227722775: (0.7340585287594601, 0.6790862068658859), 46.336633663366335: (0.6904200205717468, 0.7234087331472497), 49.9009900990099: (0.6441104114503977, 0.7649325315746477), 53.46534653465346: (0.5953088642766661, 0.8034969546386757), 57.02970297029703: (0.5442041827560273, 0.8389528040783012), 60.59405940594059: (0.4909940809733222, 0.8711629080999505), 64.15841584158416: (0.4358844184753712, 0.90000265206853), 67.72277227722772: (0.3790884038403794, 0.9253604606172415), 71.2871287128713: (0.3208257698153676, 0.9471382293110002), 74.85148514851485: (0.26132192321286074, 0.9652517041934356), 78.41584158415841: (0.20080707285571844, 0.9796308077490816), 81.98019801980197: (0.13951533894392312, 0.9902199100196695), 85.54455445544555: (0.07768384728900624, 0.9969780438256293), 89.10891089108911: (0.015551811920350793, 0.9998790632601495), 92.67326732673267: (-0.046640390387417484, 0.9989117448426108), 96.23762376237623: (-0.10865215008547437, 0.9940798309400526), 99.8019801980198: (-0.17024355572239872, 0.9854020152886813), 103.36633663366337: (-0.23117632211496966, 0.9729118706714375), 106.93069306930693: (-0.2912147122272519, 0.9566577190314197), 110.4950495049505: (-0.3501264491913907, 0.936702444523675), 114.05940594059406: (-0.40768361494168887, 0.9131232502286187), 117.62376237623762: (-0.46366353198532706, 0.8860113594683149), 121.18811881188118: (-0.5178496248983254, 0.8554716628811638), 124.75247524752476: (-0.5700322582137827, 0.8216223126204006), 128.31683168316832: (-0.620009547460775, 0.7845942652463661), 131.88118811881188: (-0.6675881402161536, 0.7445307750810152), 135.44554455445544: (-0.7125839641475069, 0.7015868399847767), 139.009900990099: (-0.7548229391532569, 0.6559286016999402), 142.5742574257426: (-0.7941416508447535, 0.6077327030805316), 146.13861386138615: (-0.8303879827647975, 0.5571856046954285), 149.7029702970297: (-0.8634217048966635, 0.5044828634486399), 153.26732673267327: (-0.8931150161867917, 0.44982837600763564), 156.83168316831683: (-0.9193530389822364, 0.3934335899667523), 160.3960396039604: (-0.9420342634699891, 0.335516685797525), 163.96039603960395: (-0.9610709403987245, 0.2763017327508305), 167.52475247524754: (-0.976389420563607, 0.2160178219764834), 171.0891089108911: (-0.9879304397407567, 0.1548981802140847), 174.65346534653466: (-0.9956493479690186, 0.09317926748407171), 178.21782178217822: (-0.9995162822919881, 0.031099862269836753), 181.78217821782178: (-0.9995162822919881, -0.03109986226983695), 185.34653465346534: (-0.9956493479690186, -0.09317926748407147), 188.9108910891089: (-0.9879304397407568, -0.15489818021408447), 192.47524752475246: (-0.9763894205636071, -0.21601782197648314), 196.03960396039605: (-0.9610709403987245, -0.27630173275083025), 199.6039603960396: (-0.9420342634699891, -0.33551668579752525), 203.16831683168317: (-0.9193530389822363, -0.3934335899667525), 206.73267326732673: (-0.8931150161867916, -0.4498283760076358), 210.2970297029703: (-0.8634217048966636, -0.5044828634486397), 213.86138613861385: (-0.8303879827647976, -0.5571856046954283), 217.4257425742574: (-0.7941416508447537, -0.6077327030805314), 220.990099009901: (-0.754822939153257, -0.6559286016999399), 224.55445544554456: (-0.7125839641475068, -0.7015868399847768), 228.11881188118812: (-0.6675881402161534, -0.7445307750810153), 231.68316831683168: (-0.6200095474607752, -0.7845942652463659), 235.24752475247524: (-0.5700322582137832, -0.8216223126204003), 238.8118811881188: (-0.5178496248983256, -0.8554716628811637), 242.37623762376236: (-0.4636635319853273, -0.8860113594683149), 245.94059405940595: (-0.40768361494168853, -0.913123250228619), 249.5049504950495: (-0.3501264491913909, -0.9367024445236749), 253.06930693069307: (-0.291214712227252, -0.9566577190314197), 256.63366336633663: (-0.2311763221149701, -0.9729118706714374), 260.1980198019802: (-0.17024355572239874, -0.9854020152886813), 263.76237623762376: (-0.10865215008547438, -0.9940798309400526), 267.3267326732673: (-0.04664039038741795, -0.9989117448426108), 270.8910891089109: (0.015551811920350768, -0.9998790632601495), 274.45544554455444: (0.07768384728900554, -0.9969780438256294), 278.019801980198: (0.13951533894392268, -0.9902199100196695), 281.58415841584156: (0.20080707285571756, -0.9796308077490818), 285.1485148514852: (0.2613219232128609, -0.9652517041934355), 288.71287128712873: (0.3208257698153682, -0.947138229311), 292.2772277227723: (0.37908840384037934, -0.9253604606172415), 295.84158415841586: (0.4358844184753714, -0.9000026520685299), 299.4059405940594: (0.490994080973322, -0.8711629080999506), 302.970297029703: (0.5442041827560273, -0.8389528040783011), 306.53465346534654: (0.5953088642766663, -0.8034969546386754), 310.0990099009901: (0.6441104114503976, -0.7649325315746478), 313.66336633663366: (0.6904200205717469, -0.7234087331472497), 317.2277227722772: (0.7340585287594598, -0.6790862068658863), 320.7920792079208: (0.7748571071028897, -0.6321364279743266), 324.35643564356434: (0.8126579138282498, -0.5827410360463015), 327.9207920792079: (0.8473147049577773, -0.5310911322572754), 331.48514851485146: (0.8786934000992683, -0.4773865400511279), 335.0495049504951: (0.9066726011770727, -0.4218350320620621), 338.61386138613864: (0.9311440620976598, -0.3646515262826547), 342.1782178217822: (0.9520131075327298, -0.30605725458788735), 345.74257425742576: (0.9691989991996662, -0.2462789068320011), 349.3069306930693: (0.9826352482222637, -0.18554775382949354), 352.8712871287129: (0.9922698723632765, -0.12409875261325934), 356.43564356435644: (0.9980655971335943, -0.0621696374314802)}
Plusem użycia generatora, a nie osobnej listy jest to, że jest on leniwie ewaluowany - jeden element na raz. Nie trzymamy katów w pamieci dwa razy.
Python lista 4 - funkcje.
Na zajęciach zobaczyliśy jak zapisać zadanie Fizz Buzz bez porównania modulo 15:
def fizz_buzz( liczba: int, ) -> str: """Wyznacz FizzBuzz dla liczby.""" msg = "" if liczba % 3 == 0: msg += "Fizz" if liczba % 5 == 0: msg += "Buzz" return msg or str(liczba) print([fizz_buzz(i) for i in range(1, 16)])
['1', '2', 'Fizz', '4', 'Buzz', 'Fizz', '7', '8', 'Fizz', 'Buzz', '11', 'Fizz', '13', '14', 'FizzBuzz']
Jest to szczególnie istotne, jeżeli dodamy dodatkowo
Mizz
dla liczb podzielnych przez 7 iDuzz
dla liczb podzielnych przez 8. Funkcję można wtedy jeszcze bardziej uprościć za pomoca słownika i listy składanej:def fizz_buzz( liczba: int, ) -> str: """Wyznacz FizzBuzz dla liczby.""" msg = "" mapa = { 3: "Fizz", 5: "Buzz", 7: "Mizz", 8: "Duzz", } lista_slow = [mapa[i] for i in mapa if liczba % i == 0] msg = "".join(lista_slow) return msg or str(liczba) print([fizz_buzz(i) for i in range(1, 16)])
['1', '2', 'Fizz', '4', 'Buzz', 'Fizz', 'Mizz', 'Duzz', 'Fizz', 'Buzz', '11', 'Fizz', '13', 'Mizz', 'FizzBuzz']
Sprawdzanie wszystkich podzielności miesznych było by bardzo niekomfortowe.
Python lista 5 - numpy, matplotlib.
Python lista 6 - testowanie, wyjatki
Bash i git
Przyklady komend uzytych na zajeciach (rozszyfrowanie ich jako zadanie dla czytelnika):
Przykladowy skrypt zapisany jako plik hello.sh
:
#! bash
echo "Hello $1 !"
if [ "$1"=="Flip" ] ; then
echo ”Long time no see ! ”
elif [ "$1"=="Flap" ] ; then
echo "What do you want?"
else
echo "Who are you again ?"
fi
if ! [ -f log.txt ] ; then
touch log.txt
fi
echo "$(date) User $1 visited." >> log.txt
for i in $(seq 5 -1 1)
do
echo "Konczymy za $i"
done
Jego wykonanie:
Skrypt w pythonie:
#! python3
import sys
print(f"Hello !")
if __name__ == "__main__":
if len(sys.argv) > 1:
for x in sys.argv[1:]:
print(f"Nice to meet you {x}")
Hello !
Nice to meet you -f
Nice to meet you /private/var/folders/cp/8hw2xqrd443d0znxcbb7vjmm0000gn/T/tmpvs1c_4hq.json
Nice to meet you --HistoryManager.hist_file=:memory:
Jego wykonanie:
Generowanie klucza SSH (warto przeczytać oficjalne instrukcje)
Klucz publiczny powinien byc w pliku ~/.ssh/id_ed25519.pub
. Na koncie GitLab powinien byc dodany klucz publiczny SSH.
Ustawienie klucza SSH w systemie lokalnym:
Tworzymy repozytorium lekcja-1
na stronie GitLab. Klikamy na niebieskie przycisk Code
i kopiujemy to co pod SSH.
Klonujemy repozytorium GitLab, ustawiamy uzycie klucza SSH, tworzymy gałąź main
.
git clone <sciezka ssh>
git config --local user.name "<imie nazwisko>"
git config --local user.email "<email pwr>"
git config --local gpg.format ssh
git config --local user.signingkey /ścieżka/do/klucza/id_ec25519.pub
git switch --create main
Tworzymy plik README.md, dodajemy go do repozytorium, commitujemy i pushujemy.