Lista 1
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.
Lista 2
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).
Lista 3
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)})
{'Gorzów Wielkopolski', 'Gdańsk', 'Katowice', 'Olsztyn', 'Łódź', 'Zielona Góra', 'Opole', 'Toruń', 'Kielce', 'Poznań', 'Rzeszów', 'Bydgoszcz', 'Wrocław', 'Warszawa', 'Kraków', 'Szczecin', 'Białystok', 'Lublin'}
{'opolskie', 'dolnośląskie', 'lubuskie'}
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.
Lista 4
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.
Lista 5
Python lista 5 - numpy, matplotlib.
Lista 6
Python lista 6 - testowanie, wyjatki