Wstęp do programowania (PWr Zima 2024)

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.

Python lista 1 - wyrażenia matematyczne

Lista zadań

  • Zamiast

    import math
    pole = math.pi * 10**2

    warto użyć

    from math import pi
    pole = pi * 10**2

    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).

    from math import sqrt
    x = 2
    y = sqrt(x)
    z = x**0.5
    print(y, z, y == z)
    1.4142135623730951 1.4142135623730951 True
  • 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.

    from math import floor
    x = 2.5
    y = 2.9
    z = -3.1
    print(floor(x), floor(y), floor(z))
    2 2 -4
  • 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

Lista zadań

  • 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).

    import os
    print(os.getcwd())
    /Users/bwrob/repos/bwrob.github.io/pages/courses

Python lista 3 - listy i słowniki

Lista zadań

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.

Lista zadań

  • 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 i Duzz 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.

Lista zadań

Python lista 6 - testowanie, wyjatki

Lista zadań

Bash i git

Przyklady komend uzytych na zajeciach (rozszyfrowanie ich jako zadanie dla czytelnika):

history -c
pwd
cd ~
mkdir test
cd test
touch test.txt
code test.txt
cp test.txt test2.txt
mv test2.txt test3.txt
rm test2.txt
echo "Hello World" >> test3.txt
cat test3.txt
wc < test3.txt
cat test.txt test3.txt > test4.txt
cd ..
rm -ri test
ls -la
history 1 > notatki.txt

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:

chmod +x hello.sh
./hello.sh Flap

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:

chmod +x hello.py
./hello.py Flip Flap Flop

Generowanie klucza SSH (warto przeczytać oficjalne instrukcje)

ssh-keygen -t ed25519 -C "imie nazwisk, indeks"

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:

eval $(ssh-agent)
ssh-add <sciezka klucza>
ssh git@gitlab.com

Tworzymy repozytorium lekcja-1na 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.

touch README.md
git add README.md
git commit -S -m "puste readme"
git status
git push
Back to top