From a2457c0d645ef8cadf2b1f988970cc53f102e20b Mon Sep 17 00:00:00 2001 From: Eric Wolf Date: Wed, 30 Aug 2023 02:31:58 +0200 Subject: [PATCH 01/17] mention more string operators --- slides/Bytes and Strings.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/slides/Bytes and Strings.md b/slides/Bytes and Strings.md index d4f587e..8230014 100644 --- a/slides/Bytes and Strings.md +++ b/slides/Bytes and Strings.md @@ -33,13 +33,18 @@ --- -### Concatenation +### Operators - - strings can be concatenated by adding them using `+` + - strings can be concatenated by adding them using `+` (using `*` with a string and an integer works too) - doing so with [`str.join(strings)`](https://docs.python.org/3/library/stdtypes.html#str.join) is more efficient when concatenating many strings + - `==` checks whether two strings are equal (`!=` checks the opposite) + + - do not use the `is` operator to perform value comparisions! + + ```python # both are equal to "Hello World!" "Hello" + " " + "World!" From b7e7dc6de474907689943b5fadca83f35fcc61fc Mon Sep 17 00:00:00 2001 From: Eric Wolf Date: Thu, 31 Aug 2023 03:47:34 +0200 Subject: [PATCH 02/17] add slides for exceptions and context managers --- slides/Exceptions and Context managers.md | 149 ++++++++++++++++++++++ 1 file changed, 149 insertions(+) create mode 100644 slides/Exceptions and Context managers.md diff --git a/slides/Exceptions and Context managers.md b/slides/Exceptions and Context managers.md new file mode 100644 index 0000000..06a4f70 --- /dev/null +++ b/slides/Exceptions and Context managers.md @@ -0,0 +1,149 @@ +# Exceptions and Context managers + +--- + +## Error handling + + - errors are a common occurrence + + - robust programs have to handle errors gracefully: + + - fatal errors should cause a controlled appplication shutdown + + - not all have to be fatal (a network timeout can be retried) + +--- + +## Return values + + - old method primarily used by languages like C + + - depends on failed functions returning special values like `None` on error + + - does not protect against the returned values being ignored + +```py +values = {} +if values.get(42) is None: + print("Value 42 does not exist!") +``` + +--- + +## Exceptions + + - alternative method which makes it impossible to ignore errors + + - uses instances of the [`Exception`](https://docs.python.org/3/library/exceptions.html#Exception) class to represent errors + + - custom exceptions can be created by subclassing existing ones + + - multiple exceptions are already [defined](https://docs.python.org/3/library/exceptions.html) + +--- + +### Raising exceptions + + - to signal that an error occured use the `raise` statement + + - raising an exception exits the current function (like `return`) + + - when a function raises an exception it raises it in its caller when returning + +```py +def test(): + raise Exception("something went wrong!") + print("Wont be executed") + +test1() +print("Wont be executed") +``` + +--- + +### Handling exceptions + + - to catch a raised exception use the `try` statement with `except` + + - `except` prevents exceptions inheriting from a certain class from exiting the current function + + - multiple `except` are allowed and they can be empty to catch all exceptions (not recommended!) + +```py +try: + raise Exception("something went wrong!") + print("Wont be executed") +except Exception: + print("An error occured!") +print("Will be executed") +``` + +--- + +### Performing cleanup + + - sometimes code like closing files should be executed no matter what happens + + - the `try` statement supports this using `finally` + + - after executing `finally` the program continues undisturbed + +```py +try: + raise Exception("something went wrong!") + print("Wont be executed") +finally: + print("Will be executed") +print("Wont be executed") +``` + +--- + +### Nesting exceptions + + - when handling an exception other exceptions can be raised + + - when they are not handled they are propagated with the original exception in `__context__` + + - when the new exception was raised intentionally using `raise ... from ...` it is stored in `__cause__` + +```py +try: + try: + raise ValueError("something went wrong!") + print("Wont be executed") + except ValueError: + raise Exception("oops") + finally: + print("Will be executed") +except ValueError: + print("Wont be executed") +``` + +--- + +## Context Managers + + - objects support the `with` statement by having `__enter__` and `__exit__` methods + + - `__enter__` returns the value produced by the `with` statement + + - `__exit__` receives the exception class, its instance and traceback (information where it was raised) which may be `None` + + - is always executed when exiting the `with` stement like `finally` + + - can handle the exception by returning `True` + +```py +class Example: + + def __enter__(self): + print("We enter the statement") + return self + + def __exit__(self, type, value, traceback): + print("We exit the statement") + +with Example() as example: + print("We are inside the stement") +``` From 52b48330feb5e5ba5df9e601eefe88e5855def13 Mon Sep 17 00:00:00 2001 From: Eric Wolf Date: Thu, 7 Sep 2023 06:36:19 +0200 Subject: [PATCH 03/17] add examples for `except ... as ...` and `try ... else` --- slides/Exceptions and Context managers.md | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/slides/Exceptions and Context managers.md b/slides/Exceptions and Context managers.md index 06a4f70..ec23a39 100644 --- a/slides/Exceptions and Context managers.md +++ b/slides/Exceptions and Context managers.md @@ -73,13 +73,32 @@ print("Wont be executed") try: raise Exception("something went wrong!") print("Wont be executed") -except Exception: - print("An error occured!") +except Exception as error: + print(f"An error occured: {error}") print("Will be executed") ``` --- +#### Prevent exceptions from being handled accidentally + + - `except` handles all exceptions being raised in the `try` statement + + - some exceptions can be raised by multiple functions, which should not be in the `try` statement + + - `else` executes only when no exceptions where raised + +```py +try: + value = parse_value(string) +except Exception: + print("Parsing failed") +else: + process(value) +``` + +--- + ### Performing cleanup - sometimes code like closing files should be executed no matter what happens From ff3b6b27428fec7e915edb8fbfcbd13585002faf Mon Sep 17 00:00:00 2001 From: Eric Niklas Wolf Date: Wed, 1 Nov 2023 10:58:36 +0100 Subject: [PATCH 04/17] fix number slides display --- img/numbers.png | Bin 0 -> 31901 bytes slides/int and float.md | 6 ++++-- 2 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 img/numbers.png diff --git a/img/numbers.png b/img/numbers.png new file mode 100644 index 0000000000000000000000000000000000000000..0a2455a86a5f4817de4f9ef81145a26663797a01 GIT binary patch literal 31901 zcmbqaV|yk|6OHZMF*eQ}+qP}n+Sst|Mn67P2hn6Zq6D9BfM{8TRp zhYsQpE~@kLog zkf!AXG>o(ZHC)iWd>Lrs)YGUuJBx++`Oj4^~h20>&nxpkDOer(hhd{X?(Uc9P((>8m%H&KkAiivbe~ef=}!!&?g=p_GB6jf@Iq&6v+nZz^GHCKrcFe)0%}+uM0}4GKADQG?fk{ z|K(FQWYh%L!>vpwby*qlP-RL!sW~D2S*R)B4A4Z2jLdK;q0u`P=E+cx;Nc&${#_q3 zOl#f_(ElF)nc%dkkVaxIl)lNu%|5ZckX_u7WXD3Nd<$IghpjPQs1UL~apzk8>n+^+us!@aeY7@iuSv;SJi@z1 zJXDMJvRgwMIju4O9TzY)`dffLQ7n>6DOUHXV8zkO``;v%SGr8)NvFzTS_^KLv`OYu zhh#9B0Yv-}M|=r|4lU+vXdgQo&GFtUlO)`YQwP(9WQryvFHRP^rsl}?DRazT9ZpJV z$v|>cFr52CkGSJCPQ;UNO#*-tjb?uj8FtcZ#UHpX+|gxms>!rz+RymjLz1NL0Xp{G zSxe_q(aQgeen-oHe}}dCsL%V-AFjsg zkG~sYifK*g-)K(OmJ1NGPvt4&iu|SyII^XD7<{9@7gaQv{r(6bpKpZFOJz>gsMUvt zSxF3uW@agm)v*wpgHO14^_w}g{JpBgR_1%!#AU3$I72v0c9jp`$~2}A>T?C4&Zp&k zEALgdg*Km;?CCSg`B$p8;Ct;rmyQu;_FdSfn3<94BXFk7=w*)n3pTZK`pgn?`6wHz>EaJ-Wy!?@kB!g;SYowk6RjxOiIYsY;`p-!m&3d@McD+tZbnqLC>zwT*;nAOx($~hS|oMFXKdRLGIQkSA&CM=(R{S-Z_%uI<&ryrvkA~7Nx;${ zZNJ#II`?Z-ESU#}y}2lS3P<3;1?COahh5&suY{j~?Qsi@km0U)M^j3~TCZVIf(9H3 z$B=Y=5&G$)?|%YS3&G59==hSe!9)__*EL5*;-HK4;EX3MIu31h(zpG?b&p#(teNRd zxr9kWGE&WF;g?8wsM-<5&p4Hlb%}#tnuvu^UZ~pV<=|J4NmvjbT*3T(F4rZQ)kf3b zgV{0jUn74-ep(PkQiT+rjbNW@-lFl1K)WPK`HX?L=>!_Hewejrg^FT8u`mss0rR5q zfv_Bk!TGfCZwPuLFy&y{Lwdj|nG+sM1^bYTuv3J@cve`-`LtiQ@Qo1eN`n4evh05} z0EDv7on=Er;^ByXn)34awjXF{sPoYb17YwphqyR(D3~@%iky5=4(#~=a;q+DI*(*F zBNoZrs7B1hkPs>_7B1S(0n0d<{Z0j=wlm$6e~Ep#VFOOv24_yt0u4DNkM&`&2nvjY zuGGP4*z97J0d7u(QkoL}=Al}and3)wMLl1b@AzFhtq?0@04KJq@C=U~xOVEjkp?_S zd<1k5mJB4PL8&4C2J9gRqmbp?Lo(l>>1J*vBRNC05;(PjvD(T(VgMrBPH?}<7%SYf zYLWsYE2u;hD(O0!xMgf%=9U-Q4gTJ7m|Ux*AF=}JNM(CGM+JU)w_f{Y3a|<>&fbAd z(6Fkcj0xl>B33%}wLvX_dSJDDv=h_-+y zrO~{-tB834^V)-4=oXqyJ1x)thgm1!C1Ko$}L?$7k*sSCNrVww`PGuzFV{U=Vk}54i z@hpmK1ddZG9k3N!CPP=^gXrWiw$WGX(xqEI3t=8FzS5Gh9}ToiT6Vu3n|uTt$q28!4#QZ77>w$46EF}zo=HsupLLm!K*Xr(UPYCvYg>g3Q;6|G zT{F-J$AS1TT(3u9HaxTQJg4C9nJOsE@-_vs`{kURF+mAbWiPCW;D;G~75#*OSIFJo zkO6n%w`+g^OR$;sSlNJXob0QkKo}LV%H)16@qqTN z%N0XDDBg?iQ>&}d&>v0u11E~gt69h%q?do*!OkAs$cwS|Q-4hVQan6=${W1iWkp)n z3{_{%egMYAG*L17ap;f6$v0tTM5~MtOY;@W!eZ|Q^Fv;h_&xjtg^V0S8HGxj(^81l zFUiXBDJZoo#_>m1NuW0TE+c+R78k%*v91*ULPN%*AZHAP!q2kbosbE zM#Z5@vyC#8hmp8Ja>7@PDejB%Q_T_C(*gMuB&H1Gua*#!5>&5xRto2p7G6r5`Mt@j z^%LqVB<}`WOhlpv2&sNw=mY@=T`mI+03c!UcSnZW8YfzLXHsYNfpO+|60?ThG$m*9 z&Hobfi#XN$lebK*UBOLN2ZCAf6a6Wlar9cN1=rQAO4uchJ07FE7=+TAcg1ob$BZAHGG!EUOc^^QqKvK_4$5@nf(DX^{WM~I76B=<<)m0V4==zWu5)?M8EFUv zbLWVGKbOnCNnkWBO64>5$#tPv8#mZ0>yoI@YeNW&YgbXxEW&Hn7V}a_alNzZ2H`+_ z$HvO?hHnhoqC z(2S#F8y{LWxz`1@Ss{~v~gR2ygUZSt3P<>I{jBdb#TN4ev*B>cY~SggA3 zWSG1ZeB9%QThtPI9e=U(Z^X05z>4goZ)vc}sfHArG{#CtrZm>he_r~HZ~R1{X45aS z_lFwH$uZB(d3xB#`M)xqwJ25#Lqt&?PG(V;O8JLvEif9>ru8om-FGl(HLQ3?nRF-h zxh&lVx188^u=IsI2NJL0p%@3ra({AMIkEnPppkW(7q*&iz@p+cW`-r_z0kUi{SV5D zh)@*f)di)tM9>L1GG0b3mu> z(W_5Jofx$9FKeQ~$Y~i`w^xvdiwg^r#!wVoGu2TR^(_o;Ww1pdaHZWG0MU`=(FhY~ zL1AGD=tYgl)0tps%O({lNY1^jC-!2HKh~@Ulzb!cv0-6B8*HAygZ&x72Xaxu`RosC;YbF*CZzHm zzO3OS^^Na|1>8`fMEX7WJc7i_);oc5j?Fe}gB!Wxcr##5r!hju)0(ANsZVdNGK1tfY8r|`4>UOV zbOptGR!)1`c$Z`^{PuD&(moR}VZHMEU~c0nRyb;w1U}6Lp%qh}l#H2kA@&`;b|&OB zLA4J+rv;J%y1J!-E6RmvSk}dlYUbSeh}5G$;%FM?#frPBGwSeT`=a*yh<@te+UTdv zxy3PiN>Gc${mcg2L%4uAwJ(C`dA(=~3Q*DFEplj%uGi~A1dB#U92av&Qk-e!MQPW_ zXYMg&ah61(rbHUya6VvDBe0Gry1b-wR^ocKNy7ra6vm&%9C$T}fzuqd9D2YRN7&T* zBCB15JLRrigzN5J=8xRPBWSk#h^ok2S)r2`WnDMh;8|^F0@|29P0K!MWr4+ZTEtys z{D5}0+^2-V^!`9@{}gR}St{a2u{*ExyeUL~MAJ@4TEH|qpLB3y^y|@008i@&YcQ6w zBr(sr7%{Y6+Agz$2_5cSLdlsw;y#+0>#2kQ$fwzNoH6Z#q`LO9D=(*`DTDMAho@cX z`P@$Rh{8XD_6w$pw&$2LxUD0tUKux3lv-jT{NNPF!uQ;G1wwA~e0>Z`g3qOM&8(uT zXfc6;wSZ|_O+(PutW0|$Q6>O<%7T6ICA}KMp4_&O>%rElJlW`iU9-lXC_A4Sq8PvV zWjc@N>VTDtk$5i9$Y*>dty=I+b7+-!lo4ufq%|&P}w+6eH0+(+oIK)L_oY!pf;t z8;E{{rmMyh)fuauPKmDAVYr&~IABL*xV?Sd|NuUcA z^GcIUR5$~k$_9J@C5-|_eHF73_&Cm;gR*FDH5C!?=VF6`7u9_wkB_`lKa@hqW&gOv zCGKPZ6Nb4CZ!CtG==N>s<>6LE_56f{j2a_R>}Q-Wgd;@^`$Z@yml~-zoV*4YVW6ok zQ_=_9Gd)pTm!Wq4W)p`*57Xv~1b0+RmNGD0 zJ3!R4Wmlqo(r(7Vw?{&^rQ&fehvBMN#jwXLVsfj8h_Q?v$~sCwZm_ChPYu;2Gmy(t zhKDKlaE8qsHt<)?QIi=!F`O%=ONA+E6C}#8Tg}C8hi&>*4ajO;llz_uOo>5(y^lHO%0M$a<&$ zLEggOJY4spbG$S-83s1s+Ws56!@IsyV-m7B;*!S-G{c@Fw7R<{=2StYUwfx?t1}B% zQbtsgH3VQLQ?~!qxqA@%29Wb z>SSNAyL1$G`oVJgO!yY63Qp6okdOuUbw&I`<^_W>eZn$xN4`?DC%+JJs5w*$lWl99 zj7l}bED0xHkGgZbT5)(7#GYAdMQTm6d83LEA7@skVBA{VFCrqF%D+ONU~iLahw=Ns!PKBnyyNV+~rpzIIOx+x0r`dnYC9M-S5>*FBOwWnNjo;dTDz; z((Y$+1UMA}k`ntNiYGhDF*(!>3t8N(6m7>TH7#pV;k`^yq?M>pMAl~{{=Yp-gW1(8 zV}>`)Y0j{57i*1Q{fg`%hWoQML@BYi2v46rB(7i6WC&C;l%qfI>AW*MsAAsIf5ucF zs8UJjin)r17%pe16DJQ&K*^|6fuk4Sfg_YAXu%qgyo(N|*H?kOlIQS?%&MPX*&RaG z9BJpMC%MsBBa$%8r}-?N@rHZUg8{?s5Wu|A5z+Dw9uP(k2%02M%F8C9OQQbh6JDpy zRz^zS@aUs|sYD{Hk|djMl3_7NKPUkt)fC(23;EsDY`}3-28pE@8X6GYKU_&%ykqh= zvB>UOv&<4Zs`D6Upii-9^YiL->$J?u>;p|{{@p067EI^_LNbntN@*xQ)1R8$@iTAT zVfbC$E{DF8v$+gjfzjlVrQ>1rC~OQpPtdZX5I*0^t_$ihZ)8=7PHoPxG7(S% zV;=Qx0(nT`swxwmWU|U`TPcFRgT?J8%-NZu2RuTPJc#F&nv#E0|GZN=I-ZJk6_mh` z9w{jh)HB=CYkgK%w<~U+evUc3=Op75Kna3XSN}MfV9{k*bF#jn0&kD(mf{fTy(4iy z`(%!gd0sNe#y9l{>Pq|xo-G_#?qJcRfS$p?+I&PN0LDM}C6k7(4pN%FvZwVsncSta zLAPyodg(?3S_8K$I8xkfB>=Vr)c>;?yjkr{bN-q5Qbfo|HVBq>jBK_@{>aZMk#YCh zRHW=7)9-92Da;Bx!4TZ1BQRH6XwNx!k;_3;h`2Kdwn{@uaZG_T5QEbq{RMIK`TX4o zeuq&M0slC)rkO=G=z}ajj6L{RR@ve4b(H{5w5CEm0#;a}F+(ZR0EGx*q#*BF^E)YE z+4n?2V&e*S&%1J0lt$bz#^B?TglIoS0n1wVAe&B_y1)kdx}!Nwj$a9n`maP=hLD^K zwM^gHE(oqlv1LIdMzX=PW9nx-m*2?>ib$)yRGtuDh8o3w1(6YUF;w|@pN?mePFtiz zT0st`{~agOCRI^+=Eq?Oh9<~1qPZ1hXna|Qsx#X<%ETU*zlhpkSZsC&I|Qjal?dF*zI{T$qoDtAG^s>Mv#fl?d;H)Of`q|#_J@?+bcJ~Yf99nb z$|!W0HBO|F{gqK7ZGG=RC^T7v-k~S@Lyr&rl~mqax!oC?4^Mp*XGlNB=iVsK1`3qB zzc9ky`UM-pK5kq}0}*J#1U&#i&;D{Dj_DlGO?&Vj(oqT!PYYR=z41gaymzNmpZMIQ z;rmOOPx?h3;_y!!ednK*lyZ-oHd&P)l*amgW_mjBk)2t$}5Ks zVGj|xZ96m?QDk%XI9PpfsI7ev#ScilN3bAw@`*$)7^P_%K`h$2g-9%SpdfN&;$H}R zCpQsGNc9vEGRrtnCohAOe(kl3Bt)0TzodW8{ZR1+UwiI{{4H5H0r+P(Dy zEv~>b0vCk*!kouOQI@~+HwU8CfF}aShyDH^RKkVsT^SnoPS>8-K|#l3izbWey>hm4 zu%-Q!YeM9Z;<}yjCtX|PH@@W|i|5~0c0+r=tnw87H>za}%sCqf_YMNjER|s%z)!J~ zf65v94jk~x^TYMtd0an`g#wcct}CTJ|DaMJug9YSWmXZM;GY^t33z_r_&l`7L!SbZ zUOD0^i3bZq{2|qel*-`YYR~v}#83%dU_+0V*xwt9`{k>yjfA7CaKpNvlkrl!#}Y2L zhFe9Jrhg(l^yO0%L#j&#LYB)i%CQAO(Xy5^B#d?Re}t*>W2LDdlf`^ggiAY=s_8o< zc}osxfWd43jL0srDBXBBN6|V!OFO1rtRp25;J;^y0O<{b$|^I@wwev%7$YFt;|YXh zQ9Lnv^>+UC%>&LO!#*`IwQLmEzY$zw?)c9N8z4>n@}XJ!N43W-vIhnWD`1F&4Fe0l zCS>4;`RRt4`xZ*TXWlhIxcwGZkMSlKtA!8|6Zc6gzWe(}sO}S5&7N;N%eT$=qA+*b zBU>NIvF8=@|~0)(Bq2j4$|BbgNR^(aoM`OrRzO^xNzHYUW3jf+3X z35-Xg5f;a@)w8BoXJD$J5HLS)n~PJ^o4!czWw1s(YPF8GbaN*hca8?z{>spccUMp>`+E7nAEqk|RW4 z$7i=2+Fo@lNg7r3qLdA6K0#TRSqqc{Dq(b2k17Z6dP@q&O}K!QW`k2!!9xg)@Qc6L zVlO;z31TIktF#8ZQO=rhVvg>pV*JU6=j3QJGzald?Kk3ckIDE{0DVs>YLk$bhR}lc)b?0Fxg?o+XekZf^ zui2bC*2RBaj)4+DE%B?Lx?l7sG{c&A%2DYdID z*4;~xZp{H8gNHC#Go=N=5S!r|QD*&z8uIEL)oK`#wG>&(Plszi0q!o93X_wzOARyFu$dx~k%2d}hv|R-lnVOtFeL-dW0*!9ejjEAz#w z{v+WYJIu7fUgf5P*%-KicK>q?^N9qZzr@-#%}cU3_Q|3(ZF$okm^kxF-Nukh-3#vw z6D%sXmA#9@l(jS$Vt_4RWkhq~94xr!PH3QdjYbzO2r9kSFG;Xfk{j?YVy4b zv0N*|(FUd}^Psus^B!&;Su`*AyrAUYmVJzVhl1GrlMZbum#~@cm~|cxfAuLs>s|l- zm7&MF75`wU15;bPQu)!w!--uON*@}JK#X)uu{2duFWwe>{%;f8_;lW$zvG4j5pEDe zilL%{In5D@M$j`m<(s7tD7W=Eb+Ldz7umV<8~OEb5W8j$tP&D>y&Uan8!KE|by(5T zK_Li3&2!2yvJsX`c<|2GWl;n{<|(oWQ!RxnbsnnFX8rt!ex86@((`8{XMC#&H%7}H zd+Br38?Wx4lT9Eml%QOTQ-nHG%XY+a7|C@yENf~tgp4i~-G!B=>0$dIN9)#1pXY;G zkjg{22*(bLQ6;q*`_oI>%d&lu6R$!&ZOEGTWD=8u9|MFsJW@k+2gnwB>Uw))zUJ^T zEL%KF$j+{fM4=r7m*#*GfBUvIEvCJPej>SBaz2F!qHL|%+3piUF%t&5U0W~?RJ@j9 z%IA>b58&_~g!-Qt3`xV9eoUm{J!nd><%Er%$d-)^suS_rvQB&a; z5uGZxE~Haz9aTZ>QMa%BIc*Kt3>hhT{R3rF$4q~|%n0~>{;8a9J5m?r3#bnq=lx^k z5zt;#Pz|~nJ_}+R}CUuS>B)M>MnfW z$v-UIt24B_rXZ}+`Yn7H<@H`8`8Zw*cxb(oYrC(qaWzgr*pK}kJw~|OAwt;Y6UWDi z86vWAasc4utjE{CMb3viAR>o=cS$vpp=n`JmT7Y?)4%Ds1`AESStuKbV4p`SebgX@ zE1ux^2r#Cxb|ol0N38d|ZO0x6#5^J5S^Z$x@LB0pr=%#r(nN-uC0zvmQHiDUE-T!1 zh9Y=bGp)*%CLt-9AK0EICk6HL4WB!AIIugR?bM6=t(1)+oSPGQo2pSz$6lt-rmThc zb*MS*q+iCLn$hXTL5gr3OLA-XXv(HMo$=PD#3n33Q|DDF>{BJ~Ls+f+axs6uaCyZQ zseXv3{L;!yvIlcLr8Jvh=BWU7-%&^$$uqO=A!m6aHtRrVa5DcxDYLM5e!U|{RLCf^ zP71ej|9~Isk}NwPDueqi6eIa1{_i5HF+dYkIiD)%rX|*ko#1lqsS8DW5+^IKIr)Ke zw63IsLa=t&WUTy#?Jj<9%8FkFI+}}~;;6;p`Xd(z@AtoZsc;IS!HW56$x1 z0(`+LlaH6HIy52FFZ=49V>}dykPeST+nf-UZ^M!G1lY|J3Lu2O$WsOpU7~ z60-?zxvF;N%NBDCzcGjySRwkQ2d8iYDlj*A-HloyvL?lv-)HESbCTzIul@@C&Aszv#ac;KQ|&iP#3$RTpn zwMf*S`k|RE459;pNGqP-w1gncEgoe%dzkk=j19~K@B7@t6<44TE!JNX@O9W4{2T`u zo|=O@!c`QsWa;IQ>$L0qTFyee29*c<7=vn-kHL@3g`dH>AR^emneEcDqVbK2=eOfAUoh zbtABjeo0RQR*4qw965p7P8!oWczM+xYCpxUsT?P-`RgH#*kWMU`Vyp4otA0PA}E|A z$y!sIR5o{6%k>o+mfInrhLkTxKZ{;*$O?<+O=9DubwZIDGid#;h`&eo7x4a**FQS@uji<>8BsO*Z>3&Ubo7g`N*=(65w9Ej^k`x1gMjq$FN(edMSWdXvwX*JSX|Zx3I!$I^<(4-Y|@&R&s~ zX?0rtIoOFR-(-TsdT2~49NAx3r`N>T5PhGv0s<H}WaV&Q$@J%SM9i+b>h;poVt}oa{ z9Y!;i-YH@qfVvP6!b1MAFVj5BioqOqY}M*VbbGcb$LQ83-e3|s6@_k9le^A%h|k({ zEQFGE6{!!QUNUd8UFV;HX*zh|qn8>33bl_Xm}juIP-052NjdNpasGJ;==(az6{py( zn;XY*!f^ALGxyVpbrOdCUVvnvX4Us1zF|{{vXW<5KR4AS-T7>-)(aajM1PhVKQ?LL z?9Re{cu-C35(Ewioh^Vul0$?)F{%yo?ye9b14wQyHr4z#T?1Xw;n#=A7H8S5AY!(6 z@9?al>KRGLByw(p0~hqwD1l!-9m~VlIqjSblMRrwea$-^fpgm8IUz@dK3} zid+foJa|QZVHnWQeoFFC(t{lcE|X$x7^H%wGJPyRw@%7!toQ~}llPB!>#~w`{ay_W zY7>zz?GcY^ec_(3@Elbfb`h*?U&xT>?@EX`n8ue%Mm|eG+IXqY#Qh%;(;N!>jms-f z;<|;log&~k;m+I;{qic{76!$(RT?HxO%JAf=SpX^|7&=ZmwT9SKv|}Y1mV`+dUS2z z=-c~S-Ht0!s0BXM78-XftaH2OubGe#&Z}d6%D;tgzb}t*Tsu(%edtB2zqj31NOc~} zO5-~}C?{3|u27rj3|}C?N$lGDRJea3wg=7~G4?Iw#;>pR1CTD^5P4}~6PoLpzol!D zVjpyNA4Lu&=-7v4}qfT8iKo)=~D=L!o-`SXRzJ3c_>!5B^=n%6049pAQ_lYONSO2 zYHlmBXY&|}qG_NMRB*7$DV6H$*muke^Vb5)|CI|Gt~=&T$))MKFqF{coi!iX;LXWn zF~scJ8|-hUnoH3wJY15Lg#t{VEAgP>TD7;S+rmv|%80Fj>yLjStnXqyvd8wM7jOQB zFTc`4oAo+KPyMzmJ>hu5A2}<++fZpK2JqbeuF2^ZHLGC*KR&+k* z%H6dR=sct0i82#rDEvd>t@1psxXMHKH_hO()2N!PX!tL=rgD`ih=i5#)gWw@V8YbF zKxvBF?~R7lJN{msdHSt^aNl?NwKs54#2uJ<%IDnkfj?;5Zx2e>^_|;;^Bu`K;p6$L zm!A-#-)ViF!soxohD0#jeZ@X`p8h-x&lx9IVn$a6dxQKnkwmewb!3ks>D4He6?~UG zjt_RiLrs#RBUl+P@csj55yHP<+1x7>XHOA-L|0LRNo?-&Uz~r`Hx@;O^4oN59Xae< z3_F6J#w8i0$_Cpgdn&Y&Yqx-B5(iqFZPoeqM zO&=kxVp-~0yjpXrgbaJuZr#DgvH^vDe_Vsnpve2$MyTCn*sE>*+kE@?@2zTpKg`Jk zb#5n)`Ux|ERQC(Y0P)zlqvvRhAotH&Fk00OzLX)II4sU`PQ^hQ-9yYZ^DX$(k8QXe z9J#fCN)*!i-%;Rn!bRn~7f#_1sBL0B%x$}a1R3tguNmD+B)G}KORP**0cZ``c)+=c z(AER0=1VYu90RDeW6P{p+j^d(Sb*j2=hE_}8)nUCdTo=9-NeEE2;wk}Y*~|5a(Cw)b%iawa^n@~6x` z=f2h=F;ObJ7xG^x3B@34z+QTV16+Rf5Tnwx2qmAYo-To|gujdsL*40I>tXafn1QY= z%Pw{cOuL_&>Od0I$=ib2R90s5Nj%vH8|iq5BKgRAU2g+w8c^IZU_uucds_^t8A7J> z;@=S?*XpqgOf3bX5FQ)2FWes)6$g9Oqi-l&=5`7N6fGU6ki^Upg@fL>Lo^H&{mc%pKv7H31dSJ)hXnSwrVfc zf7sJgSpL`0&3~})C7b|e5&HFdJg~ZbPx4MXxA-ao>LoXd=q8)o%N-*OSW%kHyFV*D za9(EqK>$14M)-nYC}*>hd)E9d>Fjf`OB!^pGJ55O6l`bjyX_=id6~b0h2Zq>%?k;@5cuR+5WI| zAES!?hLh@F*FV{1B0eM6X@B){h@t0gBE%8=9S<*2cO;1H(5(J=x2?>}gwhxs1oxj$ z^t4SF>Y_B%Y`_6ptOx26EBtRWyo;wM>;N2NqRX4`?$T-K4v?vC{*OTUe{JM44mLmWFpnsjx zH(^W^f0LxxvU0i#<@ZNPepSu;5uDnQd3|e`l($Abb1P5WYPeFG;nvE$YAnjB%fZX7 zc&>5PLflAV~fMgmK@`L?+W8fzW6@M44ZChUd(CynY zESnqlL0uf2m5MmCa`1bQnvMD%wiWhvI{VM`V?BBycLaULMi04Ci9Lj3urMIX%KY`z z2M{&Dh|=yjP%%)>I|;TJbQ7g0=uW(Q3x(`RXW>LPjVM%?KVv)16~)pX7w(zlp!I#Q zBHTNLIbQemMUrVgM;KGo^Z0L@zI#K}L6Wx&7T~MC2j?L=r1_@j2joigo{d=>Z%VI~ zmvTwpw&j{BN5=c(Uq&+nJmshXQJMX*sP9lz&8IM$hNY*4DIKdlu!psgiJdZZ@N_h` zYY3n>ZF*qCVA3|g#v*FUTk&X<0a?%q@SEGp_kWh4I2HGcb}+6V>L|Mk6|f)nAZmnt zRgr~lc0z?S>0LmJ{HK1;hge!m?&x?qRu7dD6yhG3(~?zb*dj#vtLM zg-gN_z{k~pxTPF>#~CjoYlL9XDQjmM77kRFGM+g|YPR?#aTbxWwK*EJAN#^hGH5dcibIsptrTabvfI^b~hZF#a`}q)} zmO|`Pnh_sc`}G`vcXFYmXhN;m9*L}lSKto)^1EM3xQs>C*}#U5D(!Jk)u^lXZd@~z ztpjgQOjCrfzu-11eDI+#RQ8Q$sm$DY*bp5KZ{TxBKX5tIea(s*?(v#{%jJIB?Q-DX zJBqN@wh;d)c~_sbQNiCF{adkIYvn4uQ+Hoxbz@Bt2$EZjZ)Y5l&b7{wk~6z}Z>%6XY%fvp*>&Uds_NbkoPnF z0IU+c7Mogz8d$X_CeKXOHYY4{b`Xv~%=&uW(9ejxnl1k8jye`6&JnEUX+RaJWAa_N`c@g@olrtQNT3P)?< zsH*-9Z_Pb$_aIH;a~FdcWlgVimn1r3dfemu)ss|DRz(FHG_l(QAQ2wW#GbzHH4&8J zT~p76Y9WyPooqAM-!oz%VpnqrhgaM^|47eg?A&PdmVE{S^Cy-6bru81v%NS|6lr_p zq)X1K-@OSt^0R1t6rsVj^W4=|RF>pK+yP3XHc$9Z?Dmf|Gz}rmHicih8g2VYIS4A0 za@{Te9ACtLAe(d`%+cl=KYQoGp#J$F^)qP;bW$?n;t;#Z8!!Imo3iA3?`)U%)q{B? zjjY$W1N}rT9ok(mhRr zk?bxP-Ytb`3O|N3_}aQblE?U+{q`*G{BiEvy~g4xSJ(x`yjWAWN0b{eOsCxb8?mDv z_;*-REZ--PS1vdAx{1=5KmW<>T!nQ>K9EZ;_WpfkcffSCvn;;)Yv+O3x)c@k%WKL7 zm(Ze7oJ0N1bBh9!TdDHK^tS2GsrFHl*WTWoWKv1v;9_zieUD7Q44M}}=>V<#9+PWl zSdXw%y*VX2{MExI4$a&gfzH;3@7H8_vl6)Bq=CcBXV!x?gg#rVq6Bt3G~bW(7UB5c zqOU@9!CZ@4ONb~bO3`d2>_1eF^Xj-M9Poh!a32Qxyc z!0;~4bK<9{pl01gBa+Ex#EqMs`C^3QJ9&|{VnYye<{%l9Z_Srtq~~vnC`1BRxVuV8 zskny*dmi!Po?v?~d-+MFdzkTe%eX|1(JaatMXl5C^ayfT)vbSfu>7FEpb%!?rbaCP zKF{ElMV-}H5+W)3Bw;Z5#??RQH+7FQ9D{Air2JLCZlqc??#dqCS%2-K%; zIEcGTcb=41SQ!5qWdDvoc-7jV=wV0h$@FW+r%HtZbAGkdH@j&3kSF^w=fT8xZTp0O zNJIqSed{VT!etZDBh{vjrxAY4W1wzM)5vi6Q*p638wm}MVicAppua;HD;#?-^A^qv zVfmhUwNbx|c&NiW_6pMTXU6BjJy2egj^JOOWJCS#aKBXBzR%2;g-c2LCr_DAQdV@v0!ERp{XH&C z!B4}OtJXAOHZ|ViwV2L&fvHt}d&S9`lvVp_G;*^Mg4rjCO@Y)Oyl25<{72P=BziD- zbg0Oz=G!{-T@J^VSTx=q105vKwaNx5s8>^*)9o!0Ivx^)l`fgIbcgLOoaKNzsFMjT zA-sRE?-N>tHvu6d;kxBo(Mf!#!5+6&XXV;!$}n5{a!Q9k)Ud4AF5Fq=53Pg-O552v zvspDh`XwfxP4x`NxivTql7_<`AmDn-;7p*iAr*}}uhtrsUldfv$1)99J3~H>|4H4; z=5y@g#T$xWm=T1Z=4emjH|3nf`#@7U+Wo9q;yZs2VtElR{G>BZ5E+*16zw<7usoU2 z!#4!NB@F18CX7n;hwN;~9{QlKXj~~yP{zOzqR$+WBEKpE+ypveA5ojSQPKcA$__NQ zt{T)Xjz1?z>)e#4DP=q&E>#(YL^fibT5mG+;f#syE#PHY%Qou zLjb{TOj1sHrPGt>(5d3l@{V^(%<9g0KB33@`yr_yVG=f%3DiU7fDxeiSr=XCs^K*2 zC?M>-EaOw}Qo9gYshcZ~{DKkQn3-q@TgL?K!g!|*J$B70o%CJ0qGaR4JL!L5KzZy) z6 z`x=2ONx5XmHSP#Y1*JtP|VP}F?yb;$xu#xQVS zks~fSrs2eX!VMxoJNHG8H*xe4oT6S3vC&oPJ5ovpFc{oi3x+7<_pBz}fzR@ro9l!=(Lux*X@q ztl*vvPDqPZ8;$2WKdiS+d89Dq@m;U89jy#!g**HkcrVDCCX}hgJn&GtyI<(^a1hd? zi~FH)h3c1arAgThi%(|(dYh4-k8>`ZWF;vY*aNiHh%}|HM+h}C>iLM7G2R%0{-~{H z>WgvzICFmk{&Y#2OT~7weZ{6u!9hxlkjSz2Y+e*1!@e;rHY!=t-J43#Vs@Y57P|D+?yK(ibrX^a*dXue z`B%6aB zYz%PF=vN6?IX0|lx1qVa2Z|hGXuB=+2-8=%1I$!ll=S(*VBUiYA&Ma_~ z1qgjsCH1KQo(wO{O6L2X@KT;oKEk*GS|PL{&6DcV}^T*TtO>+=IKjFSfY5TX1&>65K-I^83Hthg)^0rfQyg+Iyx?pY#31wm+^G z_Sj zSF8a!ST`he3NK9xf0@sJf7Rm{Z@}X2Z_9K{W)S&n!u`q=ixG2w<{2+Ff0I;#k&wkA z=o{A;^}Cxz+*p5tv_{EKRaDJ(@@(gKvL?!)SEp#r7X*XI&Ik;>IumuAnq6OeVS6e? zO(mKmaRrJg5ZR^GR|;k^<75DA;vhWkR7^kjWon65NUFALs@0+yG-^o!i#EdW#tv2- zWzlO>g)SV?BbZs@#nl!*$verHV@GB%tAJjn?;bsaM{*^L2BW zTX)>t+4oYt4hI3_IHB#?e?&}L;NWjfxDFP%Vw@fU$2GhB+EG<~U>uo-L&AmDEudte0H`VXB!0IFIUM&18w3H)!*BxS^=uy<5>bj)0 zzdQH18dQE#EHjX{@2%(Jysd@{RU!L6_F_J2A74Tq!zcc2`l8&omdWF);!{-!_A)$M zIQ^8=FoP(ESFGzjJmz#6-8o;2Ro7T>` zju{6LmCfaLBCS?#$vOSVjb}CR7V`9}{(=MTJlKaXtccrB$vc|Wf2riT0XmmmhGR|k zT}U*~NQ4Kijo&`PE~?$1`fAx*;}~D>1$GVM^0E*2_FA9q+;Ywq1u|Y+nJ$M^H0F`t zl_}9EC%WD{g^Ssl66rq0q0yr2^L&z?4GD*$Ws+g>)SS>UBU^kC?EA{BfyZhX6{C-% z_1rP8Z+CCT6cKq`^k`i&Ap4;BbNmjkW~WN`;p1fTI#jEp@ahL~=6BHw_ODJjj_lcJ zShh^~S6>ZpXoJuOhyR5qa$19GJ?B2z3+}Ym=)2W9Oj&qyK6fM99)&(;VxM%D@XTzi zUfrM$eYBVO;&Jm3JCpWTiaIH;LfkON0$zeGHJoKUiFi^$5MR&GO8!qaf6Hrm#ueaj z4mck|ct;c5nqQL?Pl1$iyI4z6b9wkb_hb zaQ47m!;7Z^{5ei&q+E$!pP^p$-V`h7XFHfcnNoJQa=A|#^B^&}rQlvv_*XN=!t_7m ze4Swp>ZTsNO5oUG`g}esh5>Ts8?*iC&vONbT9gYf3Z6Q=@ef?u9w7n5BstgNIvz|~ z!?qWfSHYMX0$$10FvY8|lFlFP3y_D)Mz7X;h!}BYGZ>Hj4O#snXHsDJhVCkt?zW34 z@%#w3M_b;$-1bpyOm{LvxH=fcTX_k=9qY-v=8`W29TyfD+9ZWyZVpFElhJ2KUqk14 zF3RfU;jbf^EB;^_w)c!NhdH;wY~cfYnXX(nhH|mM5Zvh)q|^2bTzpBjgRIHTEv(DAHYkvE#Bza)?E8## zM=%;|r1WM)RZWbw`E-VCU@jQsr@Ge`TVhzK-~D{J-4x({66sC0Q=1drN)Tog)VeQ{ zKblLTMO$2R5dFtJD`Do$Oy&3AHg3XbBPB>G4oS^w>ZkxVf5V{V=Beri2UV< zok5+cm+t|Ju(u&B?F|hPDsK9sC`;m`e2SBo-N;OG{Uz~oVH@bdlc&7qGNfOCrE!5- zt!826l$fHtE&CKdLS&U|Sw7>StEuEseQ#y8PJi25!iV2#b5@)D0yT24J)ikdY+Z9* zE|&-r6U(~+yoyl@A`2!Awdm$qen>(`-!w8uWi^do#|#fe-Ef`K9?~3%w33u7P2QnB(*HH^p^F&umUM&)BzG zz6c&wH$I031dJ%?j|&YG&5e_1c!l{3?qsg}%uRU}eU}&&W(7H~^ojSskE#k-IR=t1 zsr01x`-mk7-=;pqNfqlky&TTEZP3ES_Zm!(#^*Xu@d{2|&E1`naGepU_f6}iCs6`5 zJC-$fEBqk5TU2D28%0hr-ir)7DoS#qdgbYL_cE2(qzq@re0pR@uEx`AvSgk$`Ju5J zO#)rG%L>`Mu+D48uZ=@AAi}q8&_ame#HX%&EW61pqmc*?H$bH||0tz?M@_rr!&(T* z#{3;vaP5n#4KE#9ZGG$Ce*N;Phbfd~6N@T2#U5*piD)9F3ImuHu2O zpgB+ba{pHJp{VYZDbq=zS9TT0V@_eoh}|A+#*9>=_&FZDwZ&v7VjUARd~6Alc7dus z*&Ypid&{I$lKT&dt&4Jb%gh?LQq-J_l0*JlnI^@Xkd_MEs-aZ;kYnp=V}6zZwWh}P zsNsI+ye3UL7mviSKFpEvQ=Z1eqlqXT4-LqHL z)+Mc(F1}xC=*zRP22~D&{KJ0q0nkXm-xg>dn$Te6j3Lh#{Lg4RL7k>bsT1# z^nTsy=@qlMS6s6EMT@jh?|KhU$?Nxuu_&t^ zZEz{YZh&UYQ=%JI20`Ks-TZt95k11#g)eZJ8^#U`q*e83*Pkm6krhaCQk-|V2N8}c z`R`oa{FAlBW~FPXaxq4l*kk<%%_&TUb;2RXF=9Y{X4W`Ny1zHGX< zPHRz${>b1KY2K1k@H z@!DDGbz`X(u2yMXs6cPnkQ(kYL6?Uu>uYEB_}(3)5`6T$&sjQ&Fc0fCaZVgI+b8%o z+A0@=%?zAgT-4}Ssu)xM}b*@&}9RIJW&4$#$Ud8C{5QHlT zdUK{4WMuUOIf|?ym7BL3f@XD(>h!T05{Yy01g@X6B7z!nus;)>!Cs-jMBFP z*60ONyDA+3&GU_Z%jS5E%4fqO|i$@8njniC#1HAC?5ADw{$TalAzlcM!f znZAF0E2QH-pn|TbjBWw4aQF>yGjln2kG zZB%LYOL9C01+@|P5d{Snl9kijFfBnB?K4CniiMFwHG6i;$CP~+Bxm&nog1?=w5nN- zPO_xtrl%&=)_*Iv{fX?_mqp&B#U=%^>{^==fik}i2Ae4=J(<*U?w3c!U_RGxar`?I z7@y@kfI+zs*^#;1vdlYHOL7iOE>A)7*=m|BZgS^kqG@UjRO0r`#$9;TGQcjbsDwE+ zHb%p5+mV%-Wqp7(FkD&o*3b8a{`;N86|=@8YGhBH7mBwAAgJ1a{?D6GWJ!uj1a~By z3||USbRTE2feWc>tSXPzN+~OEFSAo6F=IZ40#_C;c}S)*LD!$JI!JQI8KIW)5VI|l z)q>x!RSon=(NB0PO{7ak+33(*EF(8_sF$;P2Owp%wJK7)$<45zSMjsLo#o#pG}hE} zc#`V#JcQx6g($$FOwAMEt-Aaa`mwn~x5ka;qkSd)u z!8Z5vr>fAsOay{qy&AWRfZd+G-!VbUeLTTbV^<4OP?mBD zt6h+ASr8&=mjyEa>U>*M_fSqD?|m|VKz+q0Vx%8lTXYXCDKh(>HfT^XRgsY;aRjp1 zL^Ck08ccabjW@jSs<;RVuwjY4;m79A{%8BV0vN~ge8$0ZElvxuS+>HFvb--2Z z)tHK|+e1jLKL>FF0dG#1ye6=Vek~DSt8;6sh*MJ$Q=45*yZ4=}biIBbkPiQf`txJS zbAH#vKN91ycc4j-f|1W$E($OA(B?O&7#0_L0gbD^LJXCBLpj-f{b`sB$;q2Gx@B?+^Ypn}X<1rLaCHECx>G zxlT2E9otHId6%Z)N?Q;;LMv)yWJ|!Sf4+@Mzeb>X+_{~KX*)<;m`y4TxeD)0EPpwf z-uvJp{Up}lh+b1R3eAa=m=1drv!;u(E1~ade#3uKeuqVAO=Du)kp>aa)d@?f<9&of zoRQ~T1DQnECpXFhP9NG0sP~Y|iBoTVFwx`8bD(Qa{i{KmpJRi<OeNo1A8z2Y=fKTW=-Y2}qwEwD5s?RPPA ze1>YU!!EV@=RapgfJ^lisx^~E`KLizToj5G ziPj;a^Oly%iUTfzpQ<%?n_1}%_1z1VP14PeNq}&jj+ZQ!W#o7)T6Qb)MsV`Kw-D63 z|5Z^9bKdS(r>VB?^%p}!N`l2mVm|Kc4%b{mA(||1DvHF8dGZ92U%5dLARSleH$A$> zm$qtwx1Ou(s{=}xl5_jg>(;Sq2L}YtiIN7>m~B(jk7UZ2RmK97^;?U2M!lYso&vFb zTO}}+pTm@wk36;i-f+5ZPl?E(`8SI#l}!uoSnU{S*Q)vB-(MSY;RFnQV8gV}wa*C~ zgHiam`55i0!kFMg!t*h?d28zsT3IGvvUY6u?A6BW>`qnuZQmzo_pKG}1UDa6gAe^W z^>=G^4ZCqV+=Kt|@`N=w^spwIfvb|KYi=dqmY;SaKQlOCi9lm!#WOS%7diWBrcMOf zu$_=1w26eFjHb}7RNr(UIRTQh3LazT#(@hlv}@lL7CdykheQc^Ed_smH|2kpMxvMF zZlfsbK~}5NJG}h8r~}F#<6Y1|)H|2~+F0#&z+k+!)yRZrgkn!5Ug16f=3LK^$v?-{ z-NR=nEEEZ^O(UxC9Kuw51LTNVOl)ra%A4%&yYz$qHE4UqA&OF^V`qUepFZW9thvGO z_ZtIWx~A!5T2Vdu*I`!I+1%4_Aim|Z_0DP-@dR@O=;=xKc#dN22b&?Tj{oA2|5my6 z1M->_wS=h!|2$WqTYkm{7ckmeFUpVh%p+ZSSuhYzECkGouk}zlXtYshOyXoN#;1x( zAt%ivc+3he#>)<;@D))n-|chR@#pi%?mK>N@F;&ph$9{4<6SpN4ih>XKCj3U^RVM$ZEPYwLur$?F7`s3W8}9jUS#~HKkUS)b(jU7SBg4 z|B(bJ)_!N6ooRZ)5>t=T-x-R-PJSB4^vyMw8&3x`JNAql8Ols<0n<<2Q#CS-bVqDc z+NuicQ2n>PaT`*#wyn+*xW;DE#f|OH`#nfn`xtWAsIpAL9Rd~%qmEqPKWhq^I$cs$ z4^jxRFZaU)Yt75KDgr^X+lIKZ|BRPiKL*CPj@I3O@O*2aB0_rUXY<+DfY zLJ#{*zZ90Tz&!3aencrIt`U&w;9n?~Y;tN#;~Jr~5YhHK-=Fl|MRKg#TR{)0^cDl2 zXCekTtrD3B0ECt;#EQ=;xiNy7v9D2wQ&C=;eSZ^1+Xbu@rAEm|ye;E-yi}VW?1#av zHA%9#BpLr6TvF-%W3Zj)yd(9i_?JkKXCzJ39spsrdu2zKM=aQ_e(0lN3y&h}K0(0A zG@KcgBJ`{KH+2Omx_}Kw)wpS}o$_C6oto44V?FV8J*7dB9%r4kcxa~0(6awxBQ8)w z$Vj9qHx>e@40dylmvaG48clB=dS-a96PPNaOhbw{E`CgGTH+9aDrf+e%ZrFcmZ|ML zL#?2MF{Q`8Ks$wYGM+<%GV2W_5Fy(SaE7V8E``B2eo*b@9~c{xGJfb#$_6)LhO9Ph=SRdBJ6Mrk~$jIPGqS(;5^^MTqj-j>r)hoPM+QY?EYd z|Dkq`5b5%_OYAhMoVl=uHtMQUYPm009K7M#Es?OVjwNwh&0c+ldAVlcnRDksd18S! zZx}RGr*b>pKPfIVILwk;UgZY1ccyRQ&sxIAn=7IIsfGuz`i$9ipDF(q_J=H_*F^j9 z3H|hFiN1j1f;fg@5SrVeR6+l^q-NK}_^0zeSDEntQC8kjTz6lJm`@u3DX$ zR@%!8ck1+OYOjQV$&`D2gFm>b399{7$rg*Hp5$D_{A%AI(AU}3s~gZH*8t8ITTR~M zUdS7MwLqahl@V>H25WB2i=EO#SWxSN#;JR2kyV_4t#!lB+u=Nlvl9j=nQQ(E^U!}c z)Vy65EoKgm!wzClxomN5$yx%l^ZD4u_Bp&tRs2ap+iZnMnj$M=%zk}>n-Bdah&}i%dR@aHqnHMD#>F=I<>fsJrKh{C{ zfQ~c?T5P)1wu&6cBtge6pE6;siiNsGDTWVs=iHy8qZ_lCL zk8f*v|8C4E)i(85T|GiAA?gUaC<_`|uGGZ#;BjNqs&`-8ZSw4$sc&#p;WHb2;u(FMtW)l}| z>tC5w!ZFarLtLYnO-*8>u`NK8z+NRl^;=wMk$tiD5mm_v#b?+E0ShKZhLl6Y+%@Kc z;rCaUYoP0kp1Q+%>EzS*9GXL2aJr~O`NnB0G91-)A8R_ZJ^si!QJ;RT^BR@&+lK3Ssf+88^t)#*F5^xAW! z$;PBqA*E!u_S+liH32CuwGpHqag}VaOIY>%2=4BU)PbTRJ03*3z7j45wdSgsOhD`2 zVyKQ+8)3&~ZX5f>62SdNW32&=f4G6>RrJ)HBqoKi@;z?CH()Z9FTjwadP*Qfr$Vj8 zp&&$ub(0~`EvwpXC_m-!<724(*!*-XE==eUyz00iG-p%P_eZ%Ge#Wv%lUA)D|$X;ageYxMIT*)Q6fstUa)zyw3V#gr2Vzj zW#4RNami)^Ytb)1NWy%4b|G(p%6=yikRj`M&}35u3L=2p5g8Y?2zH3qjwAZ3t*SiN z%6TkAV#3U-IW$yhz45KWCITPkR7SU&Yhi^rtMre(O+!>@mC_C|k@}Sq8aZ5$9>G-! zytiU|He#2kss3e_e){)xMlP#g_KZ0i{__%(T6g}pOO5UgriDb(syr*n=@b7GJ?#|> z1a2m6F$(xvKonP{ON8 z-=IIOtgGs7i~167o@$h%;I>{fON65t89+{ck8Q%BU3HYJY{^2AiM{mi4fL2ZVf=sM z%{B?&JFvCFRsc+QKP^JfWSjs6x+3?pW)EzzNDAOUKYIOYpK^~(U>?l2P5(`P8VX~x zcd{{ecU>ClO-;=7Fs{Pg?`$ru!HJ&|NXV7?xk|OLi`2m}yAbuSZG)Vzu3!&h|0EfN96U(Ctzsn8T~lNF{IqEjymSR%J6EH)1tHKL zy)Zyv_60Oo=N8)m-Ir`!jhd>Kn*XMt1eZ{|+ktP7S;mg%_36Kck32V7Km27Jb}jWIK9)*1`*R`ZYu>YOmU%T z&~pIeCj0F-w8>LOs}>4NkLP7u(1DuScRoJLrYs5TsUzzrFJUb7Ydw&Cz8g*!2(Yx2f)Y(l=+Q&*ho5ge_d{Vo4B z^gA0VM3(+vhJl%OOhvhEUMKAiNN(D&+GwN4IA!2OHs+)=;*;q!6LMtnUj^Lv4K?nG zX=^r3hH&NqS8$f=d^%Q6^NB-cCV%)JC*!0rLSi#y$}&jV5KHLJvhm8tb#Y3(vDhgM z`3CKmd~4epYG{67MoO2HkvK~|P;sprrjoFj)((>OJEy>lcqKk`0faMYzM-PZTth>2 zKWfSxeZ3J{NzX4HB1zMoxm;hxoVD0yj>B!PZ)#0w)B3qo#~VGM#`;8dZMXrMPnos^ zoPbg#ytp;amG$KewdrhBG>imY}9 zVpsjrSLULAe)IPi%8*71GL%i)C4LE;XM}oZkt3D;0DV=824-#P{Oo7dm(yqw*qUp+DH1D<^Os?Sz)WT6GC~t9O_KvTyJo0&vy8|6xRiNL zn`)=^F*Uv3#ViTwN*c?iaBM{K za3SJ7_C}XIerXXYNRH9rDvkv48@Gnv@iBuVFH=ngVkKYR$8~ZERa&)OTb!pHOK^b> z!EQaS#ZdNEa=zeBHCf8mFRb8Y?QOoqb6Q&F;?gz-h+th+ftpEz#l9hgwnnhAsX+L{ z(eV$Z4R)_3Jn}3am8&^3}hvNO402+f<_a1W^v;K(6;Cgej!B*1r4SjlI)oKDVFUHSY1%7Blm= z$?I(}N`Uqyl#M9rOSJY2ZOrn{G_{nzW&ZlExy%2FYnIJS$YhUpQGHr#ifZ_tEuDPO z9fqG0w2)SG#MpS%7<({*{81kmI5&l!pU@|bQ^z)UrN7iau&6ts4kDKLiazmz8^vgT zCE}K7cDey>&y`R&lFzd2VQ#akBeEwRG_FvdlBWoC3(A-#eCubB8h&vsX15?AZ=XgN z(xKiNz%%k`8Mq?xD9P{2?-QI#ETByZQ8#g>;2i^Hp75g2)`zE`?m3*}=uUnAYAbCi zYtNXb<__@UvR)L|2TB=9uQTZt${cJsj{aU0&GWA7kJB*J?1e<5Zc_~p-`VKnNoi;K zJJJQ4^oPJ7+JtOmIn*s+(X1Rjfmhi;u(9*h;GB=OGq>f-Lr2ygkt*B+@iO%ko9Zay z1GcB_vNxEFJEAB8Ck2#q4a0HnNfFs@)j^9rGxTMBvP2d2n!>ki5KRW+ZRevm5${78hg3VG*ROYWkw#2(F z5jD~_WoyQMbZz%yP^D^a^3sD#&ADrlD$A&Pu`+M~2SSbD5@0MWx3$nr#?wGIqh0xefMQN3L7ZOm1;-myy zo>~@FL_z59*9g43bQ|Xl1?KmHvS!r`Ijq@F>R8X&h-8Hh6YGN{=)AyXY4~7aeEQkG z(7Mw~=#xXA3ZzNXwAMdjuW>~OpP?z&Wfza>IlTQJSC&L9+m1>278TYw&+LRVa5_bu zhCDB(CZoo0k&&bDhzy*es)R4f=3nYIVV_l1=&@;s@_7sMF8EnZbkY;Y&4(#=ug!&HUj!Vx_-i~t1fOw(uOs-VK-9iuRm8W!h=E~P0Uye=x{~+PP@?H^mE2!M;G-8xLFWEe&*}}_`0%`RnKEn zJx$neT-3APx~ybArBb%T%y~mB#j2mWKqqpLiymx#>{!-Nn8(V+jGaN>VZ;4e@v{i}D8#Rm zrnafFyh{-eZM0Y^8c5FX`srg>B0J#W&8Jzm+CYC;tP-Iaj8~N*q57jWiRE!KWkJL3 z;ZJNUyP}Z(YII)|_*n-5Go*#5c;}PdL?i?PJZY0+Qq^>3Z4pEm2W> zZT@0`MJhYC<6qYUe|%wbsc;2*GTI_{P#nD2&N&~n0_BXW27fzmJdPJFoTJ7RR--z@ z-QAHXM%Tqm!Bns6@oE#d#*4h!DCAC^Tc5peO1cSd;M9~&X~fcJ-ClreGF`?3^vHr==V3@2j^!O zY^s(Fxu{Z>W1NW&*fR!Qq2A)Gaor@T>J8~Tc6R}db)HI=>1v;qm$5a!*i`}gKPEEN zx>xf@1b(nsekA}c^uFk(2^q=~TgF^sYADYCns&{=}27kbp(Ags!>O|`$L4s{M z?0K2ynE<$AB)eaSixWs3l{o_<;=@bIYn(*4i&D%-Wz|aPea+=KJ4udleB}oU=ohFB zx4Hl3NP_kLi3jPsYD~P!Tm>iEgZ|POd=j(cp1&RQvD^C?5BYur7pIqgU>rPnTpU;; z^%S%}XvZJ+yMuASn`Ap8jgf%vMalEkaYqtm`mM^SH7^|-jNBD|CesUw2pM~pXcd8|C>7vpO6aJET(*ziNY zh9qE;WBRyJhHgkjSoR$*E~$Ry>;F71r3zJ8ptL%t4+tN~VMyyU`qVkD6D3NWL{Y}N z>YU`;fw4T9MJ*BhHZ!aiqMBwLpU)fBED!R)jr8P4Z*~V0V~iB{8Q ztu$y>TEwv-$Fu1eKROHtJMhhU<~O4`vJ~(KR6f;lz`^%khYi9$ukP1RySmB8G_cCp zarL;7yGEgdzC4n-DU7MW=Wu!GHqQMbpH|~hOCyvbX|{=GP3jLM%F69pV0MJRqGcL7g4tPH+uRFDs2HyKlh)~~p# zSGn|#Y^KeUH%1bBL1l^4EFI`x%vVCT^qG`xZu_HSDQViUo_J$tzt4CJz~}1ouF!OB zpArzJMtn=YaWfZMyhfE;OQ6?J?Dfs(2{}6gW=NUe5E*kv(N|emO^6;!cd=*9++T(l zHx#9>Yzj!QW)tflIN1}M@X^6yqvRK;RJC8ux6lPUdwx&dD?3??m_|K<2KmZAlP^B{N{U%84 zQ6=b!3tfQZrZQy|PGh!Aj~NQJ8h#Mn!a9cl`CHYN`zJ_VslbKONb4N&>)4;$k18m0)3ioXI2c1YH~pi5cWRSno_eFQ=LDm~^Dtj*pOUX|F9EH; zPkFANe$X*$j7x^6rx`kF`b{ z!Do?1`6mk~#T)d5GfJA#!qc}_K)9wLa+)%|a)$6dv-v;_g~u+BYkDckjiDWWEDBdJ z^TY5#n`6(xegoA&c4)x)t`up32X1La4L`2vpw2WU+msrz-{W%dhTS(7Eo_Z)RCcEG z$~;I6mKxX>_%O>YIdB=J2)TCMMx+m0}Xz&eA3CoEru zD4YR|B$ScUgsYJ-4F@jfx10@oyTVJ#~kxv!)c+F z+;XrF&A{e&Fe;)3bg98NFbmewOpYCTly4M94P;fQGi8LvS>+Qh|s?VJ3+A$3vcj^i z8e{4Yx94*q~tn9+5+7*5C>OcG-C$+qU`MRlNT&>`+57a)MJsxYkzMzc6p zv#Nw@y)!j(7fdrq}%E=mmVWbwFfwl!IdVlk-rB7$Q7FgqfLKO2k65GiLvUy!I)m_$Jz_rHH2_&Cz1s18*DiS@n|LEL=7?9fP+ zj&U87hNVc`7TzM^)xpY+5sl#`tFJk`XPCKuqvuuemT{56PVOIlh=08|N#Td{FG3c4 zXhkmYWTC8G^e@AJuPIFiEzFzuDrE39`IjS)j{mWtPzi zn_hZvGztgcl*t=VC^7$&&EI`lml_)vNI>X(^EQr#SNTEoi#T}}44zz>C{G1z_-x50 zm7!P|f*89|F5 z(Bslv;aa<&m`%f%KNW%N%VsI-@s5X8j?eT=LPR8!aK-VjZP%bFm^!!>mok#T!qToNKs z?msq&clvi>JA?I}J|xH&dkJ+g)?z;-uUuuhFFca8>x;SDhe@yKak1zji_L8~cWu%W z|9vNmG%Ul(Z@xVpX}UGC0aGT*1Odiu|iZj7Zu$0dUY}Xyh+Ob zXwFi5U38#M8!yiNjzP+W=n@c`KB>C6(y;s(Yx?Q4>pW08n`tR3nV#Ih>^mtvRT{&> zF~xq|SG<26lusL6c0IM*%Y7D50K9aS4EbV7=ksr@iTSguqm2KE>b}VJ9=#q-{O$4d z4_3UicxX~y)r1j^qZ$Wg%U4y)4i%1Prc=f(b~!?4Ct z>rb+VJ9^`EtmU^f(^Pait`Wosa|Eu)IH$#|DtJc;h#sI;3N5K2J3=9VsW^zX@o@B~ z;8?xOfLiD1<|BI*lD6DaeQ+KB^gB^v@d`(RCYxZuzGLix5rasw!iqLi=*wDY zOX*nF5CeG`$#{_FSGED5?yO2Q`iV5Hd6rxXhjqWKRgp6d@L)U z4#b?&~)bfxSmIhXz}9@0mo?W7+nWz3wRWUUgaRWvhtQ-0u~7 z@6xdFz)=c@izc_9#f-Zi7Ii;Oh=!Uuf(XQ?5j{E+>wL$|Wc9T5fh|dEq9tFF*#pD& zoVul@Gd03@4b0Q^c-WLrL!{&`%#Fntjz8eEhM6*zWVzC0>J1Sh*Ly#$PPtx>l(gGN zgYF0>h{y@?8tIsG!8K7kFbbkS5wyvv5`H35=vn0TDPG$ZDVz?BK(KTVXm0+)37Q)k zig|;nEz8@nU*FCJ}X#@n%*r0!*fZvlNsThE)VE% zHKZuK49niH@Jp%l1a{pPOX2!4?^<@5pswlbiV$XvJH=uYA_h!RGHXx2V=XX`htSNz zRJ2l5did-b&b_M%2DGz?lj}NuZl(9?S*&{ceOCjfw`yFfs{(bGsIu!DEtmVrx4-y& z49Px22K@F=89{gFtuVPOc%O7w$vVx+<vmtn7Olg;<*IGQq~VS%dOskn`yqcvKo83z5s%MOci7D9K2yv(TW zG#Xa`M_romcbF7~BGEihPwFr0mU7ylrLVDABNQu}CnV=Kx?!=lk5{AqopEZ+Vf#+_ z)D<;075faBPm|<4aMGENTm)YReLOQ~Zb+YEAw>#uK;7AekTVy{@7oWx;bzgprHD(r zTGFP5piwX#Xm)L@a`8F;Yr9o5)J|FD8L)Vl;k~m%q&YY%_^F>#X7XWfq=+m17e%7Z zuTnZRYf(yoZgel`G4VgLsGMCyR2%|RYj`C^uusjA*rrMGIz7nf2`(L#JktQ{S8}=U zah|F`$o*~6*WtNQi!D{8_T^q?WS*jugQSYD=>i#y!yn`{sMTF9<3$zJr57Miic59h zx6&rHt*hpa@3tS7*m1o0>_}e^K+7gv}it)gNHAYFng#pI>ld@ z4uXx9O*nDT82i|nEMGsNM4G$199hB%5^z(nA}F}X=Rn*ifWJmrYKVW++7V$DrBW+p zu>>pPe#9H6-4VPO7&iO;xk8FXcp$a-mEnG7 zK3hb|^c^%??oIlwJ}`#MQgAg+U1T#8^USs!>2ymcl=_o?eWBysofS@F*N8E%6!^8cWETQ0nY7s z6nwkWLVM!reuK036wBm%{JtW!gx3_v@r*I>up~}Da{pBHX`7GQbdB~#fUS^!qayqK zK1yJfBNG4P#i~=R7nGDvq^Jm~ zZf{7YG;UdJ=Cvma`PmN}Pm|v(s_IKdN%LN*cehIhzmxG%n-^6^T64H4tv-{K%i2@6 zTL;QSD6t5BY@V$i>_TN)A8rYEpDxY2ayy(DK!7_Zhgj*R#ow?`2gt{A`IariN~5q) zH6mbJYo?wdh$%n{E<%yzBKE$-0%$4Du>N zfQfCK5I0}0y0k$?V`e$(KmUR1UPb7uxqmRb7BkrE75ttr<@r+p%iSZGhgY7Y9;T?W za#-1_=59+SrykaCLU>I6-ePYmAycl!C{ib9Df2vOR76dGe4a_@z~{!GYO zsD8OHmC(AWwA?E@X`74-dhcy2N&o^~g6>S(kRX*TI&~fwL{JOWy;xp40YmqP&fDWWGkjvVZ>6QH$73&Cf}@ zlvjSF_e{^k+H8>KpJ7yx@;-I-%)E+G(@~sLQ~m#3*r;z9;L~Ro>A%PQ??i8ER|zdw zGhJim4TI&mzCA~-D~&%N?`A3W^Lj1|4x8n T)%o!~!3P-$Me!O@qaXhVWr0C} literal 0 HcmV?d00001 diff --git a/slides/int and float.md b/slides/int and float.md index 6409440..8d08b4c 100644 --- a/slides/int and float.md +++ b/slides/int and float.md @@ -1,5 +1,7 @@ # int and float +![Number sets](img/numbers.png "https://commons.wikimedia.org/wiki/File:NumberSetinC.svg"){ height=75% } + --- ## The numeric tower @@ -18,7 +20,7 @@ - can contain arbitrary large numbers unlike most other languages - - can be created by calling [`int(value)'](https://docs.python.org/3/library/functions.html#int) + - can be created by calling [`int(value)`](https://docs.python.org/3/library/functions.html#int) or using literals like `42` or `-9` --- @@ -29,7 +31,7 @@ - have limited accuracy making them not suitable for things like money (`0.1 + 0.1 + 0.1 != 0.3`) - - can be created by calling [`float(value)](https://docs.python.org/3/library/functions.html#float) + - can be created by calling [`float(value)`](https://docs.python.org/3/library/functions.html#float) or using literals like `42.6` or `426e-1` --- From 3ce048b6dbadf937ce39e535b4d6dda096fd9926 Mon Sep 17 00:00:00 2001 From: Eric Niklas Wolf Date: Wed, 1 Nov 2023 11:00:22 +0100 Subject: [PATCH 05/17] fix string slides display --- img/unicode.png | Bin 0 -> 17627 bytes slides/Bytes and Strings.md | 53 ++++++++++++++++++++++++------------ 2 files changed, 36 insertions(+), 17 deletions(-) create mode 100644 img/unicode.png diff --git a/img/unicode.png b/img/unicode.png new file mode 100644 index 0000000000000000000000000000000000000000..eed214a8d51d7d8f01daaf71f29f2ac70de74279 GIT binary patch literal 17627 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 Date: Wed, 1 Nov 2023 11:01:27 +0100 Subject: [PATCH 06/17] add slides for language introduction --- img/python.png | Bin 0 -> 10343 bytes slides/The Language.md | 147 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 147 insertions(+) create mode 100644 img/python.png create mode 100644 slides/The Language.md diff --git a/img/python.png b/img/python.png new file mode 100644 index 0000000000000000000000000000000000000000..f78593c3786cfe791196778fbf7dd5ea6f78ded4 GIT binary patch literal 10343 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 iSTNxKDB$R9VQc04|1J=18QpeU1yVsnzFgKU Date: Wed, 1 Nov 2023 11:08:44 +0100 Subject: [PATCH 07/17] add makefile for building with pandoc --- .gitignore | 1 + Makefile | 13 +++++++++++++ README.md | 13 +++++++++++++ 3 files changed, 27 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 README.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1c66fa9 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +slides/*.pdf diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..180af92 --- /dev/null +++ b/Makefile @@ -0,0 +1,13 @@ +slides := slides/Bytes\ and\ Strings.pdf \ + slides/Exceptions\ and\ Context\ managers.pdf \ + slides/Functions,\ Objects\ and\ Classes.pdf \ + slides/int\ and\ float.pdf \ + slides/The\ Language.pdf + +all: $(slides) + +clean: + rm $(slides) + +%.pdf: %.md + pandoc -t beamer "$<" -o "$@" \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..7b5b7c6 --- /dev/null +++ b/README.md @@ -0,0 +1,13 @@ +# Artemis Python Slides + +These are the slides intended to be used for teaching the [Python 3](https://www.python.org/) +programming language in conjunction with the [Artemis](https://artemis-app.inf.tu-dresden.de/) +exercises. + +## Building + +To build the slides with pandoc execute: + +```sh +make all +``` \ No newline at end of file From 6a1f4d1f0b63d41a26914716e347b586af98517a Mon Sep 17 00:00:00 2001 From: Eric Niklas Wolf Date: Wed, 8 Nov 2023 10:56:10 +0100 Subject: [PATCH 08/17] fix class slides display --- img/classes.png | Bin 0 -> 21846 bytes slides/Functions, Objects and Classes.md | 117 ++++++++++++++++------- 2 files changed, 85 insertions(+), 32 deletions(-) create mode 100644 img/classes.png diff --git a/img/classes.png b/img/classes.png new file mode 100644 index 0000000000000000000000000000000000000000..fee2e393bb420a17b64acca28cbef1d91f53b5f9 GIT binary patch literal 21846 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 literal 0 HcmV?d00001 diff --git a/slides/Functions, Objects and Classes.md b/slides/Functions, Objects and Classes.md index e7a5602..41ab86e 100644 --- a/slides/Functions, Objects and Classes.md +++ b/slides/Functions, Objects and Classes.md @@ -1,5 +1,7 @@ # Functions, Objects and Classes +![Class hierarchy](img/classes.png "Generated by plantuml"){ height=75% } + --- ## Programming paradigms @@ -61,19 +63,26 @@ - part of the program in which a certain variable is visible - - function and class definitions are a scope + - scripts, function and class definitions are a scope - inner scopes optain read only access to variables in their enclosing scope + - variables are always created in the current scope + - variable assignment can replace variables from the enclosing scope with variables from the current scope having the same name (shadowing) +--- + +#### Scope Example + ```python # global scope, visible to the whole script var = 12 - # the variables a and m are only visible to the code in mean_with_var - def mean_with_var(a): + # the variables a and m are only visible + # to the function 'test' + def test(a): m = (a + var) / 2 return m @@ -81,9 +90,9 @@ m = 6 # prints 9.0 - print(mean_with_var(m)) + print(test(m)) - # prints 6, the variable m was shadowed in mean_with_var + # prints 6, the variable m was shadowed in test print(m) ``` @@ -97,6 +106,19 @@ - create objects by being called +```python + class TestClass: + # attribute on every instance + number = 42 + + # the first parameter is the object + # this method is called on + def calculate(self, a): + # attribute access by writing object.attribute + return self.number + a + + instance = TestClass() +``` --- ### Objects @@ -107,8 +129,22 @@ - behave like a inner scope of their class definition + - class can be checked by calling + [`type(object)`](https://docs.python.org/3/library/functions.html#type) or + [`isinstance(object, class)`](https://docs.python.org/3/library/functions.html#isinstance) + - can be compared by identity with the `is` operator +```python + # create two different objects from the same class + x = TestClass() + y = TestClass() + + x is x # True + x is y # False + type(x) is TestClass # True + isinstance(x, TestClass) # True +``` --- ### Methods @@ -120,22 +156,7 @@ - since attributes and methods are in the scope of the instance they have to be accessed by writing `instance.attribute` or `instance.method` ---- - ```python - class TestClass: - # attribute on every instance - number = 42 - - # the first parameter is the object this method is called on - def calculate(self, a): - # attribute access by writing object.attribute - return self.number + a - - # create two different objects from the same class - x = TestClass() - y = TestClass() - # prints 43 print(x.calculate(1)) @@ -144,11 +165,14 @@ # prints 41 print(x.number) - # prints 42, attributes are not shared between instances - # since the class attribute is being shadowed by an object attribute + # prints 42, attributes are not shared + # between instances since the class attribute + # is being shadowed by an object attribute print(y.number) ``` +--- + ### Special Methods - some methods have special meaning to the interpreter @@ -166,14 +190,20 @@ self.a = a self.b = b - # used when the object has to be converted into a string + # used when converted into a string def __str__(self): return "Iam a string!" - # used when the object has to be presented, like for debugging + # used when presented, like for debugging def __repr__(self): return "Iam a representation!" - +``` + +--- + +#### Expecial Methods Example + +```python x = Example(1, 2) # prints 1 @@ -191,34 +221,57 @@ ### Inheritance - - establishes a "is a" relation between the instances of two classes + - establishes a "is a" relation between two classes - the subclass inherits the methods and attributes of the superclass + - superclasses are searched left to right + - access to shadowed attributes and methods of the superclass by calling [`super()`](https://docs.python.org/3/library/functions.html#super) + - inheritance hierarchy can be checked with + [`issubclass(subclass, superclass)`](https://docs.python.org/3/library/functions.html#issubclass) + +--- + +#### Inheritance Example + ```python class Human: def __init__(self, firstname, lastname): self.firstname = firstname self.lastname = lastname - - def __repr__(self): - return self.say_name() def __str__(self): return self.say_name() + def __repr__(self): + return self.say_name() + def say_name(self): return f"{self.firstname} {self.lastname}" - +``` + +--- + +#### Inheritance Example + +```python class Child(Human): - def __init__(self, firstname, lastname, father, mother): + def __init__(self, firstname, lastname, + father, mother): super().__init__(firstname, lastname) self.father = father self.mother = mother def __repr__(self): - return f"{self}, child of {self.father} and {self.mother}" + return f"{self}, child of {self.father}" \ + f" and {self.mother}" + + a = Human("Maria", "Musterfrau") + b = Child("Max", "Mustermann", + "Max Mustervater", "Maria Mustermutter") + + issubclass(Child, Human) # True ``` From 0c6f9b448218b126639a10257d5fd06b3736a0a3 Mon Sep 17 00:00:00 2001 From: Eric Niklas Wolf Date: Wed, 8 Nov 2023 10:57:02 +0100 Subject: [PATCH 09/17] add image to exception slides --- img/error.png | Bin 0 -> 15730 bytes slides/Exceptions and Context managers.md | 2 ++ 2 files changed, 2 insertions(+) create mode 100644 img/error.png diff --git a/img/error.png b/img/error.png new file mode 100644 index 0000000000000000000000000000000000000000..dd1fb6ae8640d71fe0d03188966a2df13c02f56c GIT binary patch literal 15730 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 S=s{kmhmw<0maG;B2mLST6?&Zj literal 0 HcmV?d00001 diff --git a/slides/Exceptions and Context managers.md b/slides/Exceptions and Context managers.md index ec23a39..f269e91 100644 --- a/slides/Exceptions and Context managers.md +++ b/slides/Exceptions and Context managers.md @@ -1,5 +1,7 @@ # Exceptions and Context managers +![Oh no!](img/error.png "https://commons.wikimedia.org/wiki/File:Generic_error_message.png"){ height=75% } + --- ## Error handling From 072a4886242fcd8ee05eb0c85f106eaa139b637f Mon Sep 17 00:00:00 2001 From: Eric Niklas Wolf Date: Wed, 13 Dec 2023 13:48:02 +0100 Subject: [PATCH 10/17] fix typo in exceptions slides --- slides/Exceptions and Context managers.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/slides/Exceptions and Context managers.md b/slides/Exceptions and Context managers.md index f269e91..0d99486 100644 --- a/slides/Exceptions and Context managers.md +++ b/slides/Exceptions and Context managers.md @@ -151,7 +151,7 @@ except ValueError: - `__exit__` receives the exception class, its instance and traceback (information where it was raised) which may be `None` - - is always executed when exiting the `with` stement like `finally` + - is always executed when exiting the `with` statement - can handle the exception by returning `True` @@ -166,5 +166,5 @@ class Example: print("We exit the statement") with Example() as example: - print("We are inside the stement") + print("We are inside the statement") ``` From f6eff3f7f4da5324391687e45bc6c85c2765f53b Mon Sep 17 00:00:00 2001 From: Eric Niklas Wolf Date: Wed, 20 Dec 2023 15:50:24 +0100 Subject: [PATCH 11/17] add slides for modules and packages --- Makefile | 3 +- img/pypi.png | Bin 0 -> 27023 bytes slides/Modules and Packages.md | 146 +++++++++++++++++++++++++++++++++ 3 files changed, 148 insertions(+), 1 deletion(-) create mode 100644 img/pypi.png create mode 100644 slides/Modules and Packages.md diff --git a/Makefile b/Makefile index 180af92..e51360b 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,8 @@ slides := slides/Bytes\ and\ Strings.pdf \ slides/Exceptions\ and\ Context\ managers.pdf \ slides/Functions,\ Objects\ and\ Classes.pdf \ slides/int\ and\ float.pdf \ - slides/The\ Language.pdf + slides/The\ Language.pdf \ + slides/Modules\ and\ Packages.pdf all: $(slides) diff --git a/img/pypi.png b/img/pypi.png new file mode 100644 index 0000000000000000000000000000000000000000..4c9d5b3c09df2c79fe97cc6581c361173b29862a GIT binary patch literal 27023 zcmZ6z2UJtR7Bw7-fPi!e(u>l>fP(ZcML|%IqDV&pr6lx7M>?U1ps4gFO`4R@LJwHz zh=4$VAW}n-F72E6-uu3P{mbiGipjlqX3p$$&fa^Bxo4nrftrIF0)bq(eM{2_0wLJ} zztL0_;3pa!g}1<8!k*r|dGGekn|uflxWiMIClH88QecwutN~opQDq?sRVak2S>My0f`70KvPJ8X_?10^9JNBU&rI|XzF^RjkyOCEC(}o`P zRl5MhbKXUaXZ?nXnv>~Ux7{w1>B>H@>-HFeA-LksML((#% z_595lMs+OY4Vs`SfH41aMd|x<|Kf$R{{ZQkFef&0?BgV*)pmIpl`P}}=yH#WRTXu|kFZtEA zxStr?2Xu(;muI^dL5JN9J8R#VFppRkl@Lvb_*ru;+H+A6 zNXsJU19%k;R>`SU$jr2RtX)Z~?hbQuU-clTbt8k0aqCZ$!F)rK3g6p_m9ykCQJ!BxDz%k-)5)F|wB={kv*KK_*%0*fhT6xZU3yii92p{CO zrn)im=i2mBFN?*%#lsm-=NTvq+Y1N@gT>`?zItcxU$?9tPgEr%hw7(qqmwgl58UqY z!GEs%>Fyxp`JqraqyLBJC$C{{VP>ozzU$%IgJ)OCNsLLRG-JrA>;%;zCTcl*yEsQH zmJ+HEzOHlUj7eGt7yZ#tgo!0L^+HWA$)U0vKPx-sOIB=F*Qld&9O)%2E@Djf4 z)p%Bxmp7l)py5?Po*EMEMDX_YZMBhPZ~6H2PZ7i5?eiAzqTB4Ha@$?s@$N-mi9HBX z$TB8$e@D4#}^G$eb-9$P%^ zjdZ!I%;gZcl^B(uGQ+45P*7bh)irvF&PyQo#?DXYiUw}F9%z0_Rv3dmshae=n;ZA2 zLUR}>g!6oZL)qFgwV?(Zpg;c{9?P=%Y<+29@hd+!mXAvPHjFF3eLez{L6#BiBzTdF%S&4zN#eGs zDrNRm^GK_j|Z z$o;ueTzM#8|AhhLJ5Y(#{Uw4mVQJ}rG3zq%4Oo|_8axZ7^^ZzQo^6<=Oj;^Qg4mdq zW?DY}V3BGE54MAotynlf*8UBO)u8|uv>7d~0QQ;mK{Feqz8rzUdA z{}D5b0RvsKjXF3Fk#K$=piRXNv5{u)nFyWzu#R8wNX2C`w9y-zoc!6E@1d;MCBFB5 zers#1mdR*pI71d>_FPEuE$ZnobuW7IYkja5Aze&hAwAu8?#ZvSDJSV5!fbok`EugY z4heko*}B7XdKmb*;{ z0u_G(AHME-Have1<-5E~c&-)A1F>FRTMLLUC5CpIWAuQpJK-XKS1y}D;I zaH64R3!O=Svr1t4d_LPu_i!{%C-Id2-{Vc*o}QjszcLCk8mYOdK@~A78iPCl`nj@28`%{eDHRr8BC`>PpMbvC5_EVz}n(5v?1op^x9_ETz59h43nT z5AWHRX>*oUr{c>PV~AZG`XwWfH6ZKx8X0b&>8z$(ys^4^q!eO3m_JoY6`Ec$*YTNn zXLnn#x}D#35os^ECalQvtU`q@3w+@^J;duD&kmDI3+?F7-9tfn6^7$}m@B4esP?oO zQ!5KzOK(kT8)8#b8GT4&VxsDMe6Xdu5DNm?@SPU`-0YF%(+qNhE4hf^tt-riUX~f! zXPdOc^4?h0)+v2eY0+zJx_Cw9y!rsaUM-xB`7;8tCGTRQOcNL)2m$@PmdNGdSA!HD@h~%Y4h4}K&r<$+!TbA|2N^_mF zHy2~mUMjVqdCF>Kj)$Xo)vZPmPXp*?)-Phq5U)_y1s}DQGdEniV=`3au4+TnF1^+n z+hy;k({Zk3?MyZC!3$}b;dGu!!EMie7i{QVc`FKV^V`>$@b1YU4LJj$jD zZ5A3*<;3XSbHi8cP+BhMZ7xe|n#*Zp6FmS;6{a!?bWq^}d0+@*%T8f!!0EyH7 z{-j{cor-IO)!#vl2Pd;?tv%KJ7Ni1VE9>jHr;_YeKcorgLRWVQ%uLHz>rv zd*CqL+Oyzy#O%*GXztttjl~4I(9Nt|#Qx&)_ird0$LiSCGxj5rd@4G607U?GNF z+Gp!V&;51Hv_TI`rHb3>yqOQHiHW1OX=e|igyOYIZ%c$#qg9J;x>_{{2MhXqSIik> zZ9Le#Ljl6?Kxck`6uUurw*g@I5Yu9R#?d{MtTU!?xvL?u05Uspr?b z?RMWu>Zh^(I`+}|U(eF#)LLahIMuXg$a{X6c999T9I1gCn|M?4Bb-}MzLpmRSoGlI zSs9oU^ytiZ5;ddCWNRJG06oh8}C{M)W(y~ zv!CzYI`g)){yrIetR|Q_(R!|Wix%v{GW{U{Z2@z;_|6=!i6*%+6&bHwvBm$J)}!NR zu-~x%!CH6t*rmuY_W-mn%LXpaDZ8Dp7?V9LHlX z=P&uHn_gnN;|#fIik*7=OAQ4b;AwsYP2^8r^mGukyD40vhQVM4&hxj3UpBb%^%clb z=aTwAp(+Yr`yKiE>9{}P_VX|63{T{7eprXvkL$XY{Mm%ySDmv>l~Gh;QIE*Enl%t? zZwt+e1<#)d<$EzC4K3CXpP5`80%K3joQVQ3Nw~2@V9R^4NOxm?r`)`rAVdYJI)vd= zd3x?e4_pMB(43j32`Q82%A`?=GJ6O1PR#YaJuS;A*9e9+JVFU2R$Zm0mjpL$Ies9aeVN3xIxW2%%XnqO`k)nc=$nhNr}}g zSaTjKyZ4p>olU8@prFTWU?;1Kya%%(T+M;wh|TrA)D1HL;q3fnWB=>}13r1erB0nH z6sZuE>C6vcyZe@8|GA&}v6vHHiK(tV1xf=#d1n=Ot=!M`&LJOOX?+bU68?~MF-G?I zJYVTZU*Y80atv|I-K3#yviV&Sx{&wer{!?2nGIe?Xd#nmXihOZ#}wO|3!-DKN{x{; zR)9hG*A_i|06!Hk*CYorNSQFdCM6%E-ok7p`=*AY6s|Rxra!SCUvV=3HfAej*`Y44 zJtomh#(tkoct_zJMDluax3PHCd>P$NeD|O-)4T>FrNWTkh_pTx|0ZW}AR}8|i`T`G zVoPtihHADdFS_Zl9DV<^{=U!7viMH!z9pCab_cQMwf=%Xn~B;(-paAd59p52KM~EK z*%YAj%GEV)j$3{-Er_g{h)-5@cCU9mz5XHak>thObE9bCt-noZnPXQ4SxzmIpnzb( zOx##BM-!t4RsJ@IpU(UePlBC|0`}h|kA65X_`NMy?Q7A!gP)(=`f}g3UWOGrbFO=9 zT{E1<6iZi&+{zK`b1JL7$rwT|DfwDs;1=y-_x$IQ^nZcGFWwwi+-=)Ywb$XQurJ+M zxhM#G>>-A0U~IoK-T5}55^Wat!<-C&!(flnS1Z;YZ*R(kUrcSKy4oW8F0 zDVd#Lzx5M?V?Ij)j@fwTnd!hO25Bb9KZasXg(? zgd;#j zq-9==ZUq_4t?%;I%49Nt-$DheZ$*YRRi1MelF+jZKqy>@w{6Z{e$1tENOrJE zmS4qMjlb3_c9&Bs_w+XZrXL?eG&O%q>a9yb&jt5=Kv;@(<4$MCv9dx^Zn=i1mpMjT zH7wS&AEbAGM1FmjS_gGC{f5HgGW#6P67Lrp6o7hOWi1o;IP zhs_!$sQ(_x!E{LLzU<|$hgya$KEFOE$r2Y+vOA)vXv0xzZ*QRyX_dUhn+WhE0WHkb zY!#3^EJ&ACSA%XHc&k30Z1fCn>`CkaeqO>=qqAJFgI=`3(~7a}Usjp}7jxJoaKV*~ zik#_#qAx7dO>2hyKm$4?R8xtDyFWsBMbQ^7`X5y^SGJb;9qC#&J6?(u**7fQ-{HYb zJ0V3Gs4QL?o$d|g>6{Tud9mTLCw@o8)Ek5=K3hrbZsE@{a>{R?_%|WVW9$di`MY>2 zjxnvm{QWDte=E3D0uE?FH)N8pyG{V599tqQ>4WcBiMyAwt572)bf3>*ETwJP3iU9S zCfjgU|E7`>YXzUR@k_+-q&MyEabIwrnWV3MzIA#MKW?}YZY9iD(1j3*&rD)J&U5#1 zH)nQuP8MH3J?Xf~((#qqz~sHPF^k~}q3Xd}aPZ&d!m%g34#a#k^a&H_d%}%5d0pKZ zeaUR`O-|npndZTU3;uPDHrG}lQ|ow4-Zf35HGGW~X!~(m)qkUWcYF#vPmTB(>hndu z2CsvL*Z$vr02tvLC_8Ai@mAGCVrLJ~1&j%f2nW9Cjs3(KUpShbH6XwGi6J!cgUJr9 zCV<~gfZ`@^U;8zEcpA*IxqsRcjwEX{OW;xd`Hfip_{Irb1~dqJdK~`IbSHq+`zr+A zb*BzWdRf~)JbsEza;_|(6?B9g_L>u;O~6k?-lTkdGI-_jm2!z?0w5O}t||ryWI2N zsFkJ}(z1f~c)P2E$+{{fIQHiC|C!N7ac1GmrJ0Ids?Yn88Wf_hhO9cjo%BuyK zfsT8<5PikMJonG6e?#;V=Iz1->94I_D!YqSkNnT85Tfoq{&}_FI5k$l?eOGuOO0=H zHTY~l7!Dc{bNk$3H?+2vXd=CkzE$>gIB_~}x2|6oW z5Bhai6R;CE)#-R9&LysyyQvg@Z>Loq6n~{;x+7Bx7(qFyrqzFN+XA*$sa4)A|ER&(>t~5D9LT{#RURwDIsPEqeXSM73igXMA_CL_vVI?o$Y)dV&@` zc@8~!KBF9AR@u-%1w}>kJRs+OYpfEPKTdYR55na0gyn{=suG^dOTaUA>#nBn=*-Ma zZpn%sX!IbPx}vs{OLHC#vs?AH(j4{RMFv0VDhqWLN=Dh=vn7GN)nedTPFb(T~lT86V;3bP*aU`YRNApPK4K>!Q?mdfL~b9~v* zrw5v{&%915QAtOC13>t0$68uYRaxs6Lqa+Ym+*8^+*1;f(Wadr|6CHn>Oj5SQ|n)F z6wtdZTqoyQ)7IizswuuYhSe7u;kHZ%43H**J^AZhKK?zmH;o7E&r(`go8$o6QTzG( zrvYm12~;@O!@L2t-+sx#YVvL$w6Wd{k_dqN}Z8(qB%A+MxMM}pa0EQ_arBi zlv0!@xb=_8Nq=L*6l=hSs8QLzF@pJHJmQ0WJ)u>oZf1IYv-2n+CJzZSxZYx zolDzokPoT0hFoMGQD%E#0O~fl3LU2gZ%do6rkC!?tNP?-kOeY-&1FNU+_f=C*WmGi zgggwNHS90*2MyT2DcRRBByTw_o-bACC7D%2(HoR98n&zkc7kMgaf|#@QP{^pV$W(4 zWtqO-(|R(fo<2T$?~OH!4}7;xRSv6#%YL(p@26e|4Y4sRo7dJNvYMD-!A!cf3mO5r58DK)SwG4(q&(c^w zvK%r=h@5c23k+Fa+@Wqc7)tmQbfM{;{~?_Go40%3+b}bE`mAA^WGdJCtaoG?Uk&~* zuLY@u+CU2_x8Di-+CM7G`)Dory3aGGG=)O>!TJz zMzB66;daoCjSUGxUO&u${;SL2+(_aE>}c#=OhLoA$%k?5eJ6_S(t}m3{9v(Ix@zz# z0+hfUY+mkpLsW^5+urVOcRw{|t~!N|n4jvg$`6*_BvrhY6Tsx|4*AJFhRTZK+0sV~ zaV_l(0>(N(#hM=ChbgZ~Y@BfUEiiQR=*x)Wx6>QO`gTs&JFw-FY&Yjzta#|+#LgUU zLlfId)5GqL(J*VI`DMrrE{E>!?FE4)f6lMTiD*JKO~XJ)!Whclf8bF3$!YQAOkpE# zfG_FyRg){BBOh-r$|xqFb z$%q$#4>3g(6M7ncK=@^sh;_`#_x5SopeOH{nSJ{<;AG-mH}?9(`PO;2qeeOw{y|gw zjw(~igt~FtVF?ux_H+aOq|w14m#Dk)WN43fD6rp3??BWn%b*ltJXJ`htp}u454gak zkU<*N8QR!r&Q2TfeyDT8bW!AJZ0TZp*JrO36h@mPUE51~67i|;e1$%}D2>h>gdxsh zNRdqkbWc(-N<7ZKxp@=)S^x(;q}XXU{Vc$Bt57N$%M>mA>TMc|k10l@VyvCu)490) zCq+q_A+hWj{_(g}D$HW(dNl_txVd}tXegnj!`@t}Aaf)Hmn7n+W5-UtrAtQVW$x=x zeI8slROnxQVX>;>)9uD#$2!4g&#;#g_D=KW9B>h$c^Kn{vO%)wOXhqT}{VbO^Zq*HLu4! z5D)cI2;-C$LTvxO`aqmbTKap3T@|8zsa#q#>HdwSls{A3R->0r=V#Kxeu+OEZ9Q|n zAw+!tkE0}|?pyB~hVF4V>ex}mVUzlwT1e7)m9T-yE$pN#>`btL0jlTAW2Ui+#5aEa zfq}|9ewnWd75ln|$5*Znu(bzo{f3lJzn>SVc;Qz_qVt|u6XTNDHO{+LfYQzcUVu}P zg@(3gJHiVU!*h#2(e7+_sslu7?m8Dl1vamIaHC+_*lZRrp2(opgkGJQ99biHMWJ;Z z5tXCpk}OXTSd8__hUMo{r3L?)u$#h_=uje1IK^NwmRd@gno3C)-zQyVuB@y&H^i?A z?dGB80i>7u+P``CfW!J=UKZ4*_4WIrYTLo4C7BbunOJ zpx@2|_T`*q=xEVRo$3ockGP$--|_z=0c&()G1H6Ne1>zFjId^<@+qo$)c`bo>))-s z0>Li-*Jd}4w-RyfSuKBIY3tLG?Jr-To4%W>e&T5eh zs03YPqL6lgH(d4JKKe3Ng@*H~Dyc?#j)fg$W&R9vq=$!1)*+$t`nncPtm?BrSz0EQ z!?*6Gqw2!PKJ+9xC>o#@4V^)soh-j&k(dKIwtMO5R|{%|eTaNt;pZgGt8EO?& z8_pnYco+sN(A>)Z+1DW6sAIR8*v&XlWFZbdu;QTuPZVZ|zx-yIP&>HlZ6R5rU{%Va zQ#ZYihv+t;wMN7MYa=JcqV@7$=;cX*A^1&$%Xeq5p+TOVRvT>SJ)aV!Y2J&I_y|}_ zDb8pKzs>uth~rogG-==&eW93)l69>#%XH9mue&wic!hrBvhi9K?SG$aC|bkc<1=uUDyf%6h5`JH!Q@>St&Bw zwoH5QFso)OAP=5uGfj6I(%u0z3J?UB)E``R0N3}w%_zU49WRD<8!Dk>#@br+28F4u z|Hi#@Qp>D0&uK&#i!)#%u_9}@$PNq%uH|)C!xs79p83zk{~?*gKv)E*s0Ii6b1i#O z%+Jf}g&kkvRSW@yU^;ht_h)G|Z$ZI8MqH@X|GWT#HgF89&Z9NC?=De>X6*Q{$NGld zzlY@%S#HiCxo)rL5gEoOr!@Ivodlnb$JcEggyOtp9x14<0EVyk^eWQfjO|W;!Qc(a z_-Zos-fk(2dVLqvNJwX&Pr8d|hx3TUPaR7to5w<7s>_*nP+>5|wXeP{Fw*I~y!9db zX@p?W^8eIK#(`g3a|sSgb%k`hFq$Cz0~!?{FV4sh_$7|F+JNC6e%K=TTnh1Ury%fq znsP+i7Z!MRT5rkH#dyK=-nsdx0QPtKo^Qbl7&biRV2IIVh{q;W!Tq|1_psqnrZLuj< zKowfY!JJU5fcS_d$!i(xM8Ole-hIgiEJxb|u4S(O5UepEg-jsGzZf^}yij7(on2F7 za0KR?Lf*BSrPnc3K_`=owu7Q_4NYtVzS5n}vU6W_I5vL?UU-|Xm$PWjU};v!7+VFX z#;Y(vI@t-3cS$N-znoy_pYJ4S4kZzt5J(t;c^3zLnb^KN*vJX32KE6JxqI^V{nCmEk(ul2PGb!Uk1mQnxdIW1HB#UxHpRj+`yXd3sR4_C&83K$ z!$MyYNE2FaYoxHwK5ZaUkf7pKck~jNBHo@o3BzEH*9%bliO_^@=4LAZ3&l+T^QF+v zzD+R#U!A5%{YG4vckd=jj^4#uD!uMcDTne}N5HILW^k>o_(NRKGqbBI0gv6`t*i#Q zz9Qk}rRw2!O0`Yz|62fgG%;JP;#aYbOk#eKg8#IK*Q>{e+fmzx$72vB$~J+5@FA!0 zp7|G(gcnxU$gg+w&z1gmG%rUDyeUSd>KTk~{%yLCJek&jpN&_srH?P)44eFlYl;1+ zeU7*UaBrKYia{)@@Vh66F5JzYxD!imSz20Jg|%;*@OKq%9|kBxmUa~YLe@{0mo!@z zeRvwJIUkM17r-*VmJs7v%B&FaM8K$4wvMx2uwdwZz7xnZ^3re-QJ zQhzkdxyf14yA5ekg(O($!zZ%|lFB%gV8UeB*idzWt zX=#4m^WsiI*FO{$GxPP`r%}jQpE*Yw+7r&8071yDAsW&V3K{oORyh9+BpZod0$oE3 zo2GcJeBF@6_$2Sl{U~}Kx5yqhaf0vwt|c2KQJv@~l6ezUpqM=O@cLa~^0tJjvtmtqbpj8cr5#NAKmdF94>u^~lsIi^;S`A&$)E;is? zf%#oGNsxd~!7{@b>^i}BK!V`J$Q=LLaz*AZ`@qk>FUwf4zney20w-Wremq}>ckxiT z&`ZaEizH3cRL@|Sm}2CT56jebT^HE z_s$;+a6Gpi=6K($kBvT!i!9kV1=JgE$fXAq@E^Oemd6fqVe9{R$u6m8>JSjoq`SMj z$`wz4LjV5#YXIfFkHQk^nAC43wUz;3QIwLJF^PVX2>{`DENBGY+sy~C6XV)>=KTgC z@%wxjW!h{V2n68Z$aCh4zIFZ4kg6VLBt+1+p%p3jPRB+(LF%R6{KwYv-6dJTn2? z3N44fcVpKGei>~z3Lkd?x*ah95UaL^aJUyfxsV!z0Y;F4%hgo0eY3rzqHz&SPfo1r zp6kou@HS9kyjq39|0HUo;NUZE%c*5Ajl%mS>yBR?Jl|d*<}ux)q8Z>c^Y-QdGXPY= zqEcqG|Iz&;j?JmiGQ`6Rpt`hf8EWS?0}b*uc5nSOL9S=awnu&w$^D zQnK4)sKp!US+{ciDfo%PUoZQ@b7duXU!3T{#&lHU} z5d;G@(7nkJkchzVG^y|90eM)uD^3RCV}BpPKnisHMv4zZ%IqD$enNjNlzRV0Kr2xY z<%}A!Yb)e+?i|`PzjZ76uH*IF+^9prMxrnGyD?3pFD&l;jd((NF1kXV7!v|3;x4qXkn zMI>}ZTiN5a=^+fUxovJ}(Dk;@Rhm7423H8~n9a1D%j%2^oSZsX8tTYs7W!>;&>oQ{ z=jr|aZmj;&KLMU-Msb|ecQdk+OVI}KWeBcim;R@L zN9Hi>;I_Y(mlVe+T7bQ?O#Md6?cG=8ryQJrX&g)h({NQS}r};&)66Q zQ$?#(#29P_|H7n_Y*GoiH~0f<8Sr5cdy;qU@gFX{rt@XNz_&wm_NIz2;&wFDbTL+{ zeW5LXBxi)f4?6L!id;S}(?9Fynvn9pjAMWd{cUd#$~%*gr7#h@I&$qeKA4LPEnrbe zU1b#dM$z@gV$<7X(xLA!(VmHDjEpqU*(ZyFGK?uxIR00M)xpBcQZxz z(42uvMvjZ_`{*cOhuquOM}~1hm9-RwKBIQQ)sBYnvqBnXImNcsNwdxt2U!(F{dq-> z^g)Sbd}x*2u>2{hR*mVW;fRL>NsX0jk7uuN=aGdNcFmdmogLZj2p_amrKJ2z_TTOj zX>qGSYWt>g%zwJ%IBh{t(>!x_u75z!SEx%KsX;{>vA#q&TM1O$nh^duG0A(cY$Ps` zXSxo+5O)lJ7nn~6;|G$3$}b)gsB+DZjt!Bv(W@^b9_`CC3qT65hrccdrLy%o4XXb% zi3iV=Ze22p7G}CtaQ$s2od7#+yWKTFe^sGXvm-E=A!n^cpS``K+9K5C9R{GII$>^6 zb=COvel-XmJsGrVBivsRv-k>8`l^LYLES?HS3KofD%CV(k>ip9*RSp8mzatVahV zgQ8sh3^|wLC-BYMEBXf@@&}xHUcRCK0qEN+RQ~?YudWarloilN2tQx$pR3#lV*_g) zt;lDT<#&5Fr*YRT(&F4c-*`}ty4&LcNCQw2{&-6*^}9xAV;Jj+ScOfS0qVR$?b|Mq z(J&SRwl-a+WuOor2mP@QvYmN>Q+WXjmr>Q#PnJrhK$6+Lh_g<2D*HHvy`27)p;>o^ z%-bDg3$z71u^V52D;FX4Y2x19tz9F~JLT=|6%d_pKJK~RuU_rG9ZlfN=ehcb_&@>Q zRl<-H?T}O47+N*IX>ZSUbYv1erns3T*jE7b5rDyfDFL(Ryk^yij31_{rYbw!?+&$6 zAD{f@Yzy~&7%%q&7^m{j& z#tP8YC}xv{{S|z|jTOM~aef}g@t}kmQJ2Rj&4&E;_l%(X4{}6Mz~q>A{ud}$e%v9h zk4{o@-MI}z%3gtR4lI2ZtkMAxFM+J|Z?3Gg53kO-D}qZ8qs$avjjniw#RRfbKEmkv z`3nklh#sFba4uo?5P@qxP+xV`U`3oAbpIdM6QBlA%d}BacwaD|M@!dDl(_rUFU^`9 z7a1N)qQ2tBUXWpQtI(-t2BW%|X;&%yk`J%JdWn`^8Mo?wuiJ6&eMNWTEbYe4cHjAv zsj>)Mis`+Al5E&_IU+BJQ?314sP{`C5x++F)J&bgI?dcEWLU34kByFYI8=MI^R!vm zsl)dl3{6;t_3Tfr6M!|e?H*MyGka?uIxXHWV0O?nef%Mc<0#{(2uxjBhW`dWH9Pz7 zUdgQ5j2e)i1qJQb2&Fc7*gib?PZEVv6`Dk9impOBqb2B2%q_HG_CuVQ1_j-9)5iuT4W z+LQV7m#T^5xl9S|_!-n&q?07><1R`9)JV4lt^i#K+qEiptNp`DI506TyzVb1GAUzi z(n>PSLCZH2vvKxV*%sBWf!||({DHc%GYsw7X)Ag(p-_006|t$mG$vzU?>&9EutZ=| z@@~E-m!vM9aWf+Y6bsJVUn8B0Q5#_tf^6RI*T^f%{fLSgMtILhpu{1qfG8@SD4%EB z*}Efz0{d~h!Y4^hwYgLj*`mUzepJk4=IujY-ZT50Dh$sj$&2NQcDgIpzfS1 zpzSCnpEZS<^{T88l`s~q&~MAY#oXm0_X2=~7Jse@y3e^|i|wEEA+^j`5Y7<6UC&B_ zeC_Epd_wp@+$}ZF{v0ZG%!%M*F6F1ZH0rRCRI3;he68yq8oiW*Eb}9B(8~ma?+UaK zx7LQf{NDD$gPhySLbdzt{N)~RiE}k5eIdz-sFyTYobDMmemkG~?R?X8WN|ScaF{4F zlp405YI7!_6)FK`S%lxdZxJP~q^tT*jy8lasqe}`z_M>^8Y21aA8AY`c1iU-)waP(? z)mzPI6gJd=UVtOs9>!$(9Xsu2R*Yh1R2D(0w}+PLH69%Icztd!YpTiFHw3chC(s1s zdH_uOb_k;@LR=x+6oJke!v6RHI@XV2!iBARP6Ws}vG5fsj`&R^$N)=ouI?O&=DwI@ z*Mviu75h5G#!$$xbi1=OJ&LEfD~>ERMXxp*T(^iJHQW z%QODpfP+&x70_d3%>&hcdGsP z9eY)m;YKX4iY0IrkOfN7PJMhp$nitN*0=smUk+f_4P3lAX?kX{vcsQKz>R^Cg0u}X4yBu~J7^p;5{`FG!$W>#K`zKj=ftWKP$P+76|_6oC2W*6$@CFw34UM+IG?1_|J=@9UUvXn@DOM zylH8~zi4tDokt|QPQc2cAdMM)lXkwbwug{Ny6RxSbnu||PbA@n3(hReCu-a60q zi^|IL`dug(GueslrDW0Y#c`}2vgt;y$wJl2mW09g`9aewaefOh%VQ>%#|;m4m ztxMMwIkn}uBHL|THLz9{Fz;PZKJ=Ou~j zz?DM-kxaV-3g(x?D9!5;K$bKXi(g*m`%oArnWn#a_zYNJ8k{uAA>+Sq%pt+F0_j7) zahNU%Vq+$>xFHb)_B;e)=qe12mm3^Iv~{{wceqt+n3#0U-v;DF{>a6t`fH(SvhenQ zmHwOf3@7G44|bQP00{al52#8ATlMZ-^%l(N=VR03W4p`8mDxEp z#YG$0@uNZ|3mV&TG8t1c4SXT6HN0*Ps_FGNhI2oZ5NvM?@mw*_qf`9A+>)DOim1V*)A~(Ahx?Uq21|{^JLtD*DIZ z*L|pjmwTc|(ms*yYfK)siyXDnE~`KS5vSOgVq`>}Jd7Va?gsD;DB8+i4H_xYZ@3Xm zbd7*pD|252V&c5X@MMD?j|o3oE9yVWi%sbyIk1q+#*#P3W)a1#<+(~U^Xs1f2O5AO zUoc!FfUQ{U6^Y4MQYo9lLP5z({IG0|?gY6u;L`~$9P~^vEclqNT%23g+qvz-S;Y83 z+t3Hl1rpO`>*If2L!A~z`Q05`7nkPmlW3RXs3E6cFNQwM)vdVKe~CudS@mc;^$GFxllnGX>10Fxh-+eZ@hbnBupib*pbA9WWPNx;p2BL692iJAft zPU2Q8gjfOKY%sL8{)RJPE&c~NLpAxRRV^-+%ORk0t)}v*0-jO5%G*3n7;t=oC%&5@ zzI%MK*bd~#BTiSjAJ2O79=Y7>>InS4jaZfVgklD6cc50j)?p-7T)FvY>hXOH> zt{@vtuJl#@AO#|B_kuskO?p)KfM}1)EUf)h~coTuaV6x}x>e zS5TKcfm#v4YxQ33zbCx9GX2JT{p8BDm8yeji05k>FSm+N^@?nq zYrC*P4Sv4ok)$-M4k)huD8g=4qs_)>A_a)f8z8;_4@b5c^`syT+=$2(QPCf%XQ1aVd;?3m1bWI#=vmW526E9T3?fKx23^bmVx?5 zJnu_pLjz%_rFbCj&}A3k>m$$Ne}wket}Gm?EketRFA>aya)}29PviAc_7`n$S4M=@G9{P9BW%`xOUR* zw707}USc|Y1y0myL<@;t_EO+ZH=qPm*hkZrnKJW_ATiXJZDTO3WT@@4+$bt84sA!ArAfNhhvNQw@@&Wn z{3jKL^;ee&Fe{gE<3IrSs{VRW2|qZvrsq0O9q7X$KHx|))N^u3RS8V#;D=QL_6U{b z;t3F>13?)Q(;(iT(8a)x5`5zT$i^%3a*RLd#Mkjgq@?$}8iyIs=4JG|-ZEWk8w5h2 z0oB$M{;sE@mzxea=qGkx_LnSih@?N;ACFs_TEDXElV=r09#3gIAI$9>jgy-vi1kqrS;L;!zdKxvc>>RdQ>69f3Jj0u~<9x8A$~ zYq6#L+X2h`w(uTOi5d~OvgdQxdw&n)qI<~~v@=99YeCg+t|R(THCXpV zK;!}kwetlM9pJw1!fPL}t)rC8-~b>N93ilW7M`_Y{Ns~Ko41ut{rijWkKH%1G;u{& z9B9-}%(fVN+ozrH8cOgn6tb1=+wqz5T|VuC&q z2F8XDqmiKGyP8!>APkM%7cqIWw}biS<9@9P#jBdCRn?Jv7Hz7leu2-bY4l?_ z#IzLU+ohH@gLT|9v&sX z8LO4utKlPqRYxC!)*7B)V47gEQk9RHY4#+6CP!!muB)IgbfzhRd5ek<-23UNwQHhY zmoFJ46Vd57EGKLEOZJ6R#H}YcjR`r1y z;Obq0SvZzlm)<`kK(~^c>f1zt%2g~&2^vTTMnzZ$E1BQJ!hvM8<k9@&&p%;4z+rZ+Jvn6AIW0)?J*iiV+@?%;Wgs95W0{A?Ng!jg;`=DxR@qg@ zF__|Ol#?_fV*yzl9`|@_1 zyn2Y*rXU?#S%Z}6wQD}Fxyw=MQ2uKseJ!@5Rd`OO=mC(P!Oi;u=94=D2n-~){8W&x zs;gVN_x3R-OpSxFRlYCVGVK)&8KmX}{$AWF%xJ3bn3(+q{l+5=F1uV>XV)kfmD=3k z(zv6*y5TC1jN~BgLk^QnON=DxI%GH)cP6&i!+eB=EiIT-OxK)6hGZai220o0t>(PY z43B=4{hfn`4by~%goIGH#+foTR&*>^B38Y26vBjs=c+FHG@S5Jcv7#B$fTx)Tb@(q zyHjTIfxgYI%3+zuwl0D{>H0oZqPz{KWVAsSsmB?Vt+6-wlI#}1VE;qH*F7{;kcxUB zS5T2_e^D=4+gKRP!q))6Br@wf-1Q-`G9bwy`14(h+lL3?b)1 z)}n>w(l5!S^A!}3US~Y*@IsHo1jm(L*VP@-y(TCP*R|GrUbTdZib#igwH0DwQCniv zzcUAn)p_&m$|u{UopbxiC=O~bkd2YX4W3u?OYM95rL|pZC@iBh|JDnDZ9Qm0u&VJZ zB7}t-Ynsn#S;ug`;7oma^%0H-U5|RM@hlg?r|4M!;FiKbrdtMmT?9`oi-?;nkMvzxD$N&teSCR(SF|&32nY@a-WL>rFHfi{sfS&^Rs=< z$Y98B2>)OI)9IIjg9|4gE9k?$K*FdEWWrj|Gr!Bw>vE}a zjpOYwwa75(r_UAH3SUow)PTz?0>CfT{Yd%=?AWwZ!K$2tz8QZ>Clsh}^^F4PDQFYN z=+4dPDxRCyISs;!Ph$Bf*Zk8{8u7_$PLx*W!(V1%S-|S^)6qi5j~HAacnM|o)VYBv zau;x#*3n+nZa=4c-Lp8X>PMHSZ~_ntvgJwWsw_{b6+IFFFIr^QG{vLj+P@2ny1HpX zFIjKaIv{u|H{qjd50=lgp%D0YJ7JUV91B19;qD7JrxnT>Nbv z+M6eBWgaf{UciZ`a0#s6PkemQ2kVvu8dT+A*Z7kd;j{##ORiFw?oWIgf3npDOVhKp ztm0q7BmPsR)><~6TG%ZW#rdPpbQjn*^534If{jo?+E4H{;m`PPwVt`SwDxS=#n0bg^S>m1&r)A`rc?Jpj6t(Io4;%B7881fs@VX9S_b zc?rI((_*Y!Q1_S>lKKTm#+Z@d@GJ?f^L97PhptjNI`hC8MWPGi!P`Iq#smH^sH zhhB)Rd<<$;cjwJHb%oYOj zd3p^rFsO@VgI(n^Usk^1^|N3hc^6+Lp@PM8gQ*@uY9J@SK^o9hcPI9|a|5vzvx^}- z5h@SPYKTl#L^pw+!uwj-W{(_Nx7}JF;P(2>|Is>dX`MQv78&m&YAwHn>w;}{$3-X~ z48&5KIlzaCIdl(S3q6F=itv;T3kvK=5yu%A$xKEbVRnmYrQutV-4Ud#6#@)Mc*E%K zV(S56X%k8GX##udv^+LJDd)1+oPhBA^LoarpP((zTd}l?A>0F__jljdo&C9`)LIOu zp1x(R&$huI!j$0`wm%J$kxu~h^Yof~?&>S#i3kgwQAvA7H+_!p&)PX8p+BA&T}Rlh zze62e89BU~$WgT`OWeRR7(JiVT6Sy3X1V$}HwK-#T3fx>wx==o8EkSLuvx9%%-BoM z^>ovD>{8jW*&fZTjZ*DsvWnPFH~Qvsd*>6rk*A8c|7(@rk60j$T>XkBpCS^f{d2DD z(6RZm`MZOnWyldj9-|`82kv)xMl|eru-`Vj3S!d`uW3*&RmkAXF8mRoJZ>fv-VkiY z>kEvFG*T3{5jeBZc>-XqOcYI?9DS9-tpHS0-Y6Zs*qO;)n&ivjbM@)lxlD!5Md6s| zU=Vw>3vqtcuQq$y?s?AimbWioU{H~6=-NVb$k=6g1>FX_T)NM%(f6SxtFV~<^AxK` z_q}SN(5H;9CbS=w9zOkGUG|bR&hYa|?@<7#8VBCi%pP+ZfXihBOVeU=5c5d6Au{26 z)ugz};`{IwcWh3IS>~$q?tblsoAWU1w#qC!9^2b_`}c?m61ksw+QsLBeYETgo3CZIuIt*TJg!%;;2ci&oUH zAYY|gGd0_0X&cW?nkD?JqxmVLyG9Q$*yQ01G|w`>=2tRI=6xla(&Lz7m~R5T->=-_ z^iBZnwQ<3=MkdUii{g#+FiT2&+sa0Z&UXGh&7C4GW*AE_@1laGR^QnVXZ+j!5M{LF z*~U`&b)<)X+7d+A+;IV{VOSo}1j06Czf3dv-;PY>x}(!EhAyZ4bcC(i=f%ZWGXtSS z`aULIyWhDl1bOZ@K{7riJymfySJnzg8<8)JfYecy=@Lv>cyPFc%=`gD2xX2(B6H~wPhN~>>7~4c-|#%9iJ8ROkJt6Ejx3h3LS_-@{D8pVsHC_Snzz3&=R7l z;lcS^R9{NGE`6}hIhw@Mog7cMk}@?gG%~u7ZurB-xJe2K?Lp-^t2g6>*~O*w|Mf}% zW7%mFs!=!G`E8Tm)xIEMzVTU0iv}$<)lP_p7yGERluv6**kg^r11G_4)rwWX@G_0- zp1dK#^}J@4`Y$>%GSUSA{Cd(uc%|*&DyO7)&0il*!9!EEHp~+-p>%HAc2=Jws>^K> zJ!K!F-IA>OqKdp|M#sndp@do*^*S{gj5pKH6xKVm(&Yp*UFRe)nSD|Xk}&5?L3u(@ z^``@mhGQ95qysHQnKuzI?wzk;CU-1AeUFcJJb^W!9MfnMYJV%A{N~=d z9ipU`Tp?_8zSMvYhr`8n0p5Y!CVN_{X{@Ir-l3zTBlgdsDwvbK`!UQLh_uiGboUj# zgDtY;!Jn*z`qy9mCMqJwojN}MnJahBq#2G31Xi*2oI>u=Vg7!I9K)MXK8euwTG+xr zH{%^CNt7|>Qg@HiQy~C2IaJ|e)5H#7`y=jn=HG=^=8W^pp9e<${IZcS;CD%sH`aR~ zdoP?}5kAROov>Z9V5M~^LTq$9QSsHRHJ#i%6OtmA&SGDEhAW=-Qf~>iRYN=~2%2^0 z$a}mcGy$0qNt5;ahxQD5BzT|PgeETf;gmNBBF}P?-q}~9`;pu4iW8E(WG7tbND$&W zAaNI8ziYK!ho$NaP&@r}2F0F3&E(SXp1CM+HAwB5y$^z?-}%EhW`C)va<7~f93a7d z{c!lwq9W|k##Ts=J-pIl`HD>QuTH|E2JL7aK!0i_0d$jwHPEE8-hsF7X=3YmXsgpu z%txo5t2q|FjBc!dcqW;hl@)_f&&dJXV*aV$J$O!NSa2!fa88xSr&u4kuMHb@2B@4~ z29ncQ)Q+rlI@}hy#Y!ZFR~}yO6VBIF$+~{&bO&%WQ%yOvZ$QK$2O?bYYE9<0Ao8nn zuXG(hk5MP4hllS^ym;~XWMe7%@(|!cFw#;lko-68k9a=w(ftTJu@ZicW9xKUX7yZ7 zJf<`FtJQ;|ghJC|JxZB^xvQ8Vyvz9IrRXuSKLM+I5g>C5M^mz-~8o2Lys6!sKA{FWD;o;Gx zST%EMkNRYw>|fW6g0>ljiS>+iWE1{jhq~&IiR|<9&dB{`DABY8qu9FAcRn)tHt+!nBdsb+y=004;gxJ|ZMDMGJrfbGp7ObMKCIr*quz{1b!23Q#2SKqerg9qXjz;Jwk8n4^F-&Fqw2M`{J zA#O@3#x?rmBg!Be*$^FCGDLkDV$KMj;Q%_y(?Dg*2>(=^a8}po_QXKXtK|HPS9t*(%4_-dZSy7kh_|Uv#x2OJax669kZH4fz6}PF z3le+0l@C0W$f2OFQAOn75Pp4Edo%5?oCV~{OhPcm1^|htW&ojG6`j_%X1f5r@VT_MHd%^}2+CeG zg}b`WDpY)TqDPi1c<>7d9I>FV5^25Lo!mDsWZ!6ihz23GR(bV-fTU7AUEN!E+OG{(eOFywebjf?5@4f8IfH|Pwp2T(Acls9AvYyAy{pZC-%Whk z`LEjp;G|@HSAikGvu+B$s}lr6ImSykjG2^ah|y++{RhMd27U>jtcr)ZO3bkx{WL*` zQ#~(Q9OZW7Oy@2(ScjQG(_#xwyyjx{k=0zK|&A-!HU$q z;EpOyS!Ly*_|lJ2G?=A=OfLhfAnI0b{bzi?D(3elO-n8pd_Nm5l@;;ujLdDN<^qP8 zHrv-=rFOrp2nhuWIqN+)n23}XV?A5$HS%AMS1VzH`N}LQl z#iYlXVAL_~TLX}&%{RL+K4W91nW$F3!e3o@c&<`Q!0`C-$ksM!3}Btpgf zIW;dO0OXkP^p;YIOhFATI8!;b0wxtX?;DUqB~BuJ_qP^#8Vo!&1~T=8Q$(D%w+f|i z5z-7?nkgvFm{UPQY>FB0yg)_3DpOOCIQxckE#c4wA_M3ymr?q?(`&Fk%oteijru${ z${kr+QoR4TcfWx`MN!-a#YgfgDtnp@1~A2e%%o?}T3CqF1%$&z`|6J$j3u5H7t>Pu zW(8d3V<2jY^w)nY7WC+%cNWqvSBal%VR3Bp!nY9{U08W8JqL(em>pXr#Eu1$ItB7- zK;!K)vK40+-&pDnss69iqse?anxpc;s}P{xHd>h&+U>LP! z;OZQi1UZ!Ai*IhdOVYx=y11P~v(sSuMNw9EH2^a1y0n=6J8TV__5v)?YzC}2!Q~kJ zn#~i_rEC2F$yWC!YUPZ~lb@xoT}=1zG84;;tZ)M)LwtN(#r13Dde&^fp)oNHbzLI; z@>psL91q$jAN+OGs-uBCog80fJ|l})0k(4KTVgNV z0Lyod3B)EgX)wPCnBZ~!a9vlRPZcWB!MEAR{{h%qU^=t{(#%Xei}0BP zRo7x-Vh+!?g6iGeCN9N@RSI~;^6srQ2gI>F;bNQs5KO+2c%(DH+T{OiAaL?Iv@3RE znY;jHaie&Lv4JJOUQzef&2|W+ zb6N&!84iIA=sE~&7JmA4y}Q8xF#G5n92~l-LZ~2OVqz^4`J=X%UbREyAvX%Xqae%R zMWO;E+!~^@jPw0)9|Xl@SezO{(;ChnzY^jDfzdq)6r(2;Pt#T6Kd`#Rcj`Uzd8 z<5P}&U|0B)X}`~z4cmH|1s=n~+Bi9bFCBmV_n40nq_hDVb~R(_l{CoV+J6++jrFj# z3^6;T+Ne=>+-aw_&>=rM1bC6{38gWAGp1Vd)OgTjlIKf<=@XK}JZ66rv5h&+gF8-* z!|K?qxZfw1Dcnj$MWD^-TSp)vp7!>n52jz1U-nK1bH%@>ILlS|(*2%H{#g|OuvJbR z<6;r*6Dt=XHdH7O*1Ig3&kucN(DbzWA1nmg2fiBMM)^j->!+f`icJJi$b>sX!}ZB3 zKDmK7?{NOs^-Tg$p$5>j@zmbwJc`=M9=|i>8AL%Y1FQcK!a!BP#l{LvPm8`8z$f4i zkfRJ|`5Kt@LKD1ESV+i$4J7$huM_3AhsO^#>zJLL?SJY%<6iKLR1GQTaDfg774U=m>K|BNby)I{D*~8Zg4SgZO!d2f>r44eZqU9 zq4Y-=8o~iFzbP5;Kyq{H=g-+vYf+GLuIIJ{5;8XY42t!?OdH_05r3%W%$XG54*^vs zgX{V?_j)9J`p^%e30J|AdAsc0#QWjmjbT@7Psm>VKGb#UWT#&K5Hl+1m@DUYwIa+V zYaGB_SX^_CTCnOM>EzJ4&S?&kT;f|MYGahPr7Ot=Jmd)MlzzXLfM<43cky6L9HQp4 zLTuyBx-+x=3m*?%W`Z3Qg9F6&-%EyJfnxzo=Yf8Cg0B>RPNB8vd2nzYpEr%#H|aRiB47U#__j#9DA0%T zpvJnIe+(16eY1iK(2w*>H@C=;t^N(fJUB=fL3y$y!qR$1)h~bOnSexK*+BrGmTz{f zvH=aE=L>#75>pJi?BRtJvxUZhiUe%n#HbFpxlcn-$6l#Nivia6@ zjt+zoD6}*ixYF(Qn-F&Anudr!ge3)akeqETV<{^-99z%l4qT{QUr3k<;0l8^>II#O zg{W=p%~y^)p850wa0LIkR4*ePC@}?TL2xJ)BICc=_cFKmQ;5ubj!=1@OWFbYN^ig`)M= zW?UTsO6&3AM+)1F!T7(MjOypz@Q{W_+vwoYitKtUW`rIo_Tt*5(>lT_C}3`Ow}Vtr zKcKsg&*_!INFcZ>L!f|cXpiF>Xa3OrD2`0X#@F3NjLZOYG&QhpL3`R|PwtQu>b&*K zW9#2D@IX=!tPa%gKWd>owUHggQ?#|U_eWt25f+SQ+W_|RKc;h4|M6r$>8k>U$qDuXD4e2Jdlho%XT-a?z2b6N)l7$bziAxFOPhyfVdU zwR4NwjG)}xv*pDxnSmLEj}Yzq)MFvmP2)+rPKNL=y&@2bX+R|%FeKNWk4uZgwe+>V&z@EiQ(I1vjz#=btn!9vTHcrRg$t zP|UxNX`na8pu?>gtIZ@uqc}W+!G&xa*3eiW0zeQ9^5sesA_2jJQY3lhZZLj(3vq6i zIbhYkx;}iFfSK7X0zxcqd6$8mzj^Sle;9TQx$n;If9%~I@1J;;wJ#V?@J|+hki!n9 zwBl`Q&23;upKn!)=0I0mhuii<5K2Jzp;Gxa9NKCCIRMf!vG7orA6EGqV6w;dm>OuU3|dbocOB7&(AaF5OI>>`p#10VenZ+{dO=(^~|5ntLu# zOq5z8B>F!!8(Z_|XZ@OjSOEbRTo3DspkdfE#D$nLt_q^4>)ksGsYlGA38r7neytu8h&BQomhNnlDTFp#%}WWWu^Rew;5vUQoB@?hx*is0Om z#NtZ8BaM2|Q#|KDpOqoU&U#eGgaEUU$o=d%P~GQM+wjKLJ(|!wD1h~Hz^6f6VoD8x zs?)tV3%;o#^-8PQ{L{BA)yw!U0AwBJ<>hVHXHYia5dAX&O$`r=A2@>^P1-1Ktw{sS z76Mc Date: Wed, 10 Jan 2024 07:23:23 +0100 Subject: [PATCH 12/17] fix typo in Bytes and Strings --- slides/Bytes and Strings.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slides/Bytes and Strings.md b/slides/Bytes and Strings.md index ee8579c..067adea 100644 --- a/slides/Bytes and Strings.md +++ b/slides/Bytes and Strings.md @@ -67,7 +67,7 @@ - writing `:` without specifying a value defaults to the start and end of the string ```python - # retuns "Hello" + # returns "Hello" "Hello World!"[0:5] "Hello World!"[:5] From 4f291155fbb667975f83656b523207b05be0c601 Mon Sep 17 00:00:00 2001 From: Eric Wolf Date: Wed, 10 Jan 2024 09:10:50 +0100 Subject: [PATCH 13/17] add slides for collections and iterators --- Makefile | 3 +- img/list.png | Bin 0 -> 4748 bytes slides/Collections and Iterators.md | 280 ++++++++++++++++++++++++++++ 3 files changed, 282 insertions(+), 1 deletion(-) create mode 100644 img/list.png create mode 100644 slides/Collections and Iterators.md diff --git a/Makefile b/Makefile index e51360b..8b69df8 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,8 @@ slides := slides/Bytes\ and\ Strings.pdf \ slides/Functions,\ Objects\ and\ Classes.pdf \ slides/int\ and\ float.pdf \ slides/The\ Language.pdf \ - slides/Modules\ and\ Packages.pdf + slides/Modules\ and\ Packages.pdf \ + slides/Collections\ and\ Iterators.pdf all: $(slides) diff --git a/img/list.png b/img/list.png new file mode 100644 index 0000000000000000000000000000000000000000..5958950d7fbd5a63679dd18e7ceee8841010bca7 GIT binary patch literal 4748 zcmZ`-XEdBqw|<9V7(E0LMoZB%O0-S>(K_0XsGuxR005}e)s*!BfCzo%%aehx zc8*%=`&R~Rr|?(-0IK6D&MZj&!d7Z}j{yL62LRAv0C0K*p;rOG2Mz$gkN_Z^0su_z zA6j%}t`3MSH6JMhmyz*<9aj;=Tm7*LWCaYSWQPrH&t?GtU81_Of`Q-6W`;w+^{+P~ zv(hoNiWn>(#{t&n~q%*CMnCfz^Twb#j2T9-(T7YXbqv={ zl&cMu84)@T*Xfk4-?F{K%xTG4Z(-c+2t%nWLtj?T_7sBW_A*6}+C+x~hf}@2)5|aF zJ(a#2=+w%FxVM-&ujDmfl|z41$b!bXDC74OrXL!7FZ&uc^eDjbqafQ!Sn%lt3Q~D+ zPHH@0CtLqPL4Q|rRe$}PB`NXc0)Lk2P_FDfkKV>fD+N$?SmW_nWU||$BM@%V9(bO^ zqjgwuP^445mA5yWGcwgUX_Vuh;Z{*~NcCWaTRvQC-gG`pQEA@v673?q5TeDHAB?eWb9%(`Dy09VXvk2fqy;_d7&O?IN1 zn*kHZsiMyX-C`de$fzvz{dl)b796wIBW87`4$Mr6*kUs$Yq$f(%LXm(3tB%qE|hs@ zcOyugks$FM-+THe`unOo+`ky!(c8I>I#UhS|3E(8=q4)dyNO-`* z@oD@KgJ;T<)F(fq9`d^Cj^0lSc*or38nkX%aj@1adC|*A?Vik0G(F(hJ7RF{o)$eX zS2+2`u01^9_4C^34iTLZp=g<{l{K|v;=Hip`_0Lju~y{l9tNZxS!%g$gx3?A z3Vc<57S1nwEqACu`2Z*9e5P!jJHo4&TI!syOctVEE^ndH?OCf63)p{+o^*X>x6FY4 zDybTMO2#Ofz)}fd>HDZotI-H5n6++<9|*}dE#97YS|NTPjmRSAQ7Sr zTjcj-rFnp;dFKtZbEKad6oUS z5F@z)|D#8GG7ndXyF4f2ka|8Jm-(mvK}9kif{e3*f9;>EqmH3C(-lh` z1_DiCrK7Y2oO34wCoE6Ehoy`(&7`HtAeGKO zhT!Rmrr53n5u_u1W*{U>I@R4YCMefPg_ZCl7PDao)znIzapHxdQkRz*yKED~uS?cH z;e~*758U?oDlI#R8Acp&@kVseJ3NgUNT^?9b!yQU44zyNqK6=z-Y^G@a|CbGp%;ab z_KK@;Vy&X$Zh)+$yeKS^YUl1@B_|)CW$3bJ4qDI{_jSn&04;?3b}mZbj%1L2#H%2< zcj$VL(EYl!S~inuVkAqe7D`r)i5+B|UK;_Me$ucQ!z&Dk>p0b;qK^3L&ooK1Vu-MJ zUTVp>XTFgo!oJm}WZuPHei8`~z73V<2G4Y6LEJ(PmLo<&f0?CvOPmL=eu-|^7B!SO zqy&6Y`lcvr+hn-S%k--q|I1Fe){Qr zqX0F9l4j`7mVLp#zloNxq<}q~?6V0f43WI(?(v5|<}-qxZ(65uS}@+o4jXHDa#45L z9t@phGlDQL=D)U>P*Hw%C_n5m$RVo@{1VL|*2)bDPt$hTNq&~^Z^84U8~M_}R9+%NhRl6lr5a7c+j&& zB%))w?6VV~o!c%A1by`|XA?*)v2jv}_4-0+T4Qwp$VQ@N+O1^2QF-jXCH>%ju6nno z)@spk{&{>>nk(~PTB1fwUr^>xZ3^PUkqv^dxNsQ5!sD5p1{JfU??-mVzs8PY0%@50 z&`dHIWv1Qf0cYt4EZ4HQLw&R?1qN0>+qWKfEt`Z=ZYCYjfABFw5Nj5EAIYE^*AGPI zwczLDa5B59P2g0oz-8h!z2~hG-38Q z4%m`_lcarXMSzHLPgcmNR$XxaGgY+FUX8SX|8P#`pt8c8)wnnp{5$}rl zQjv5GCeV!l;x;6B9M<5*YJS_!5q5#;G)N+J>T;-3a$(5Eua>fq^H2RlsOr5xJ;|N> z4RxDyrv#41iMb+*ltW(qX9Nb!~Mq2KBbDeewq z%Mk_#E=vbkZ!ETG=#wU8y^{D$Dk@KGdeWg7RCO^A>toCX+GZ8!t9GuV69oJgWXeAA ziEeV&P-E}7Io_Nd9Ot~{6uo%bOoo#)-j>g-0zS|$LU^JSIsNAh2{-B~a0ZjPa3ZxA zX!&8l*nAdCFZS4ww}lpk=tjs}7jMFVvNh*O{>#-2YoY_88j&H$bZQme@#G$xec8&1 zmn$bJPE7mJ#ve!^INSe>NqLdSs>`-m+4t2MqGDKvzyIM3?7)BtWc(f<1#9Yi1f=x^ zD=@VGtj79#z67*v*ly2g;H)p+;8Uir{?^Me0hqWTFBIoW=ZaR$2_M-4x#yQGci2R2 z@jbKx6mM@?2)9aUgI@Y4IG3Ushd-{q3SZU6?9iQFIOQ~=T#4OlN+5@D`J;*|W*{fh z^ykaM0`bxUu7^gs4-{;bw{dogRbt;rvpvp?V)0D-Q|7%^5cJ|p1r0h$ad998Pg)Uh zt0~$o9N~(hh@~y%XF)7dLtVo~r?lz`5Hl?8JhX8<|7Q$|e(obT{yEvH2E2lKLf|H6 z{e-F8rU>A)s(fP8i2uejVK@38C{ye~g}W;;+$5b>*O+!kFisLE+kLwzh~*%>H<6Q*BQolYXP51?-D&_e#Jn&$5%(HbFoRdDg1mLR1`g^pY@Jvaz`Q6etD9 zZ`vQ1d@XYJaTJQU?9MD| z^hIUR`cxN$cjW?@|{mnbaP^++e z{xcP$OAnAzSdb?YM5a`AS%@eezREy(--?+fxueuZj66B%uw?jN6sLlCn|S#ww93mm%5t3AwTcI=nr(r$Nj4$H`vnPV+AL*2U4$I16#bAP zpgr+B$S%`Hu zvh7}`Pb{q=_p_jgo5VVo_vYc>-ZrVoz+!`vu=RAnmxe#*lRt#1Tx2#p$U)eR&eg|Z z6(6OU1Dn5wj?!al$_D%x&|Ula+?PA7H!6&`s#R3<*?h#efYdqsPgvvAK_{~wXxH$| zQl;gt@;2+tkluZ6U}Nz`OU+b5k+UG%jc!&@Iu~l2FL-I~lL|kljZvt2QHq`am?x2t zlVhigS>IQ<MG&CB$Ske!*U)m2oGhuNd#2X?yLbSy?UT)M!MRy~e{*{Zu0DorhVw z!UK}djyGnYDVn3V_b6kzq66;0zwPSkT9yvY*4fbxQ_PU`lfptjNi9_jf=~soWx(yR z?8a^=?TBxj?%oDFkvJbID?eEMIj8&n-zbjP`bHe<1X31UITV?Qv8vrtPR>n%A>kA% zs^}L!5=ti5-uv(Jz236nh_R74E{1tG`Y9)VTy>-B$d{vVnSrc@;`6{0C45rg7lstP zZ!;FkY&B_)%hzBij<60D>R)7@>~PjtIv$X{(e7db3-t8Ls z7(a44-PT~3;meUD`60gsv-;ZtuUyg)%Jl7*GF`_f793DwwBkQB_4bu2e+6`X5t0qDTM$ literal 0 HcmV?d00001 diff --git a/slides/Collections and Iterators.md b/slides/Collections and Iterators.md new file mode 100644 index 0000000..7090c31 --- /dev/null +++ b/slides/Collections and Iterators.md @@ -0,0 +1,280 @@ +# Collections and Iterators + +![Linked List](img/list.png "https://commons.wikimedia.org/wiki/File:Singly-linked-list.svg"){ height=75% } + +--- + +## Collections + + - are classes whose main purpose is to store other objects + + - inherit from a class in the [`collections.abc`](https://docs.python.org/3/library/collections.abc.html) module + + - have different strengths and weaknesses + +--- + +### Accessing specific Elements + + - collections may provide access to their elements via the index operator + + - it is written by enclosing an index value with square brackets + + - elements can be removed with the `del` operator + +```python + words = "Hello World from Python".split() + + print(words[0]) # prints Hello + print(words[1]) # prints World + + words[1] = "Test" + words # ['Hello', 'Test', 'from', 'Python'] + del words[1] + words # ['Hello', 'from', 'Python'] +``` + +--- + +### Slicing + + - some collections allow to access multiple elements at once + + - they support an extension of the index operator + + - same syntax as substrings (since strings are collections too) + +```python + words = "Hello World from Python".split() + + # returns ['Hello', 'World'] + words[0:2] + words[:2] + + # returns ['from', 'Python'] + words[2:] +``` + +--- + +### Checking for Elements + + - all collections support checking whether they contain an element + + - checking is done via the `in` operator + + - can be negated by writing `not in` + +```python + words = "Hello World from Python".split() + + "World" in words # True + 42 in words # False + 42 not in words # True +``` + +--- + +### Accessing all Elements + + - the number of elements can be accessed by calling [`len(collection)`](https://docs.python.org/3/library/functions.html#len) + + - a `for` loop iterates through all elements of a collection + +```python + words = "Hello World".split() + + # prints Hello and then World + for word in words: + print(word) +``` + +--- + +## Builtin Collections + + - Python already defines many collections + + - they are available per default + + - more specialised collections are available in the [`collections`](https://docs.python.org/3/library/collections.html) module + +--- + +### list + + - Sequence which contains objects in a certain order + + - can be created by calling [`list()`](https://docs.python.org/3/library/functions.html#func-list) or enclosing elements in square brackets + + - provides fast access to elements by integer index (starting from 0) + + - support efficient addition and removal of the last element + +```python + l = [1, 9, "Hello", []] + + l[0] # 1 + l[1] # 9 + len(l) # 4 + + l.append(42) # [2, 9, "Hello", [], 42] + l.pop() # 42 +``` + +--- + +### tuple + + - immutable (and hashable) Sequence + + - can be created by calling [`tuple()`](https://docs.python.org/3/library/functions.html#func-tuple) or enclosing elements in parenthesis + + - sometimes the parenthesis can be omitted + +```python + t = (1, 9, "Hello", []) + + t[0] # 1 + t[1] # 9 + len(t) # 4 +``` + +--- + +### dict + + - Mapping which contains objects associated to other hashable objects (keys) + + - provides fast access to the value of a key and checks whether a key exists + + - has no ordering ([not anymore](https://mail.python.org/pipermail/python-dev/2017-December/151283.html) since Python 3.7) + + - can be created by calling [`dict()`](https://docs.python.org/3/library/functions.html#func-dict) or enclosing key-value pairs in curly brackets + +```python + d = {"Hello": 42, "World": 24} + + d["Hello"] # 42 + "Hello" in d # True + 42 in d # False, checks for keys + 42 in d.values() # True + ("Hello", 42) in d.items() # True +``` + +--- + +### set + + - unordered collection of hashable objects + + - contains every element exactly once + + - provides efficient checks whether an object is present + + - can be created by calling [`set()`](https://docs.python.org/3/library/functions.html#func-set) or enclosing elements in curly brackets + +```python + s = {42, 24} + + 42 in s # True + 43 in s # False + + s.add(43) + s.remove(42) + 42 in s # False + 43 in s # True +``` + +--- + +### frozenset + + - immutable (and hashable) set + + - can be created by calling [`frozenset(set)`](https://docs.python.org/3/library/functions.html#func-frozenset) + + - can be used as dict keys or elements in other sets + +--- + +## Iterators + + - are an abstract sequence of values + + - provide a `__next__()` method which returns the next element of the sequence + + - the [`next(iterator)`](https://docs.python.org/3/library/functions.html#next) function gets the next element + + - `__next__()` raises [`StopIteration`](https://docs.python.org/3/library/exceptions.html#StopIteration) when there are no more elements + +**Sharing Iterators is dangerous since they contain state!** + +--- + +### Iterables + + - are objects which can provide an Iterator + + - provide a `__iter__()` method which returns an Iterator + + - Iterator can be created by calling [`iter(iterable)`](https://docs.python.org/3/library/functions.html#iter) + + - used by the `for` loop + +**Some Iterables can not be modified while an Iterator exists!** + +--- + +### Adapters + + - [`range(start, stop, step=1)`](https://docs.python.org/3/library/functions.html#func-range) creates a sequence of integers + + - [`zip(*iterables)`](https://docs.python.org/3/library/functions.html#zip) combines multiple Iterables into a single one + + - [`all(iterable)`](https://docs.python.org/3/library/functions.html#all) and [`any(iterable)`](https://docs.python.org/3/library/functions.html#any) + check whether all (or any) elements of an Iterable are `True` + + - the [`itertools`](https://docs.python.org/3/library/itertools.html) module provides more tools for Iterators + +**Collections are Iterables too!** + +--- + +### Examples + +```python + for i in [1, 2, 3]: + if i > 9: + break + else: # executed when no break was executed + print("no element bigger than 9") + + iterator = iter(range(0, 2)) + next(iterator) # 0 + next(iterator) # 1 + next(iterator) # raises StopIteration + + all([True, False, True]) # False + any([True, False, True]) # True +``` + +--- + +### Unpacking + + - Iterables can be unpacked into multiple variables + + - the last variable can be a list of all remaining elements + + - can be used in `for` loops and variable assignment + +```python + t = (1, 2, 3) + + x, y, z = t # x=1 y=2 z=3 + first, *rest = t # first=1 rest=[2, 3] + + for key, value in {"Hello": 42, "World": 24}.items(): + print(key, value) +``` From ab58635f12aefe0fdb400817428302db8d5dd4f0 Mon Sep 17 00:00:00 2001 From: Eric Niklas Wolf Date: Mon, 15 Jan 2024 09:27:51 +0100 Subject: [PATCH 14/17] add slides for advanced functions --- Makefile | 3 +- img/lambda.png | Bin 0 -> 16182 bytes slides/Decorators and advanced Functions.md | 191 ++++++++++++++++++++ 3 files changed, 193 insertions(+), 1 deletion(-) create mode 100644 img/lambda.png create mode 100644 slides/Decorators and advanced Functions.md diff --git a/Makefile b/Makefile index 8b69df8..56ba0f3 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,8 @@ slides := slides/Bytes\ and\ Strings.pdf \ slides/int\ and\ float.pdf \ slides/The\ Language.pdf \ slides/Modules\ and\ Packages.pdf \ - slides/Collections\ and\ Iterators.pdf + slides/Collections\ and\ Iterators.pdf \ + slides/Decorators\ and\ advanced\ Functions.pdf all: $(slides) diff --git a/img/lambda.png b/img/lambda.png new file mode 100644 index 0000000000000000000000000000000000000000..d24383fcac41d6613fb7216b6cbbbc0995f1917a GIT binary patch literal 16182 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 literal 0 HcmV?d00001 diff --git a/slides/Decorators and advanced Functions.md b/slides/Decorators and advanced Functions.md new file mode 100644 index 0000000..24abac8 --- /dev/null +++ b/slides/Decorators and advanced Functions.md @@ -0,0 +1,191 @@ +# Decorators and advanced Functions + +![Greek letter lambda](img/lambda.png "https://commons.wikimedia.org/wiki/File:Greek_lc_lamda_thin.svg"){ height=75% } + +--- + +## Functions are values + + - everything in Python is an object + + - Functions are no exception + + - allows for passing functions as parameters + +```python + def call_if(condition, callback): + if condition: + callback() + + def say_hello(): + print("Hello World!") + + call_if(True, say_hello) # Hello World! +``` + +--- + +## Anonymous Functions + + - functions can exist without being assigned a name + + - defined using `lambda arg1, ...: expression` + + - only supports expressions (excludes most control flow) + +```python + def call_if(condition, callback): + if condition: + callback() + + call_if(True, lambda: print("Hello World!")) +``` + +--- + +## Closures + + - functions keep read-only references to the scope in which they are defined + + - allows functions to access values not passed via parameters + +```python + def make_greeter(phrase): + def greeter(name): + print(f"{phrase} {name}!") + return greeter + + greeter = make_greeter("Hello") + greeter("World") # Hello World! +``` + +--- + +## Default parameters + + - function parameters can be assigned a default value + + - when the parameter is omitted the default value is used + + - default parameters can not be followed by parameters without defaults + +**Dont use mutable values as defaults!** + +```python + def make_greeter(phrase="Hello"): + def greeter(name): + print(f"{phrase} {name}!") + return greeter + + greeter = make_greeter() + greeter("World") # Hello World! +``` + +--- + +## Keyword arguments + + - function parameters are identified by position + + - the name of the parameter can be passed explicitly + + - named arguments can not be followed by positional arguments + +```python + def say_hello(phrase, name): + print(f"{phrase} {name}!") + + # all output Hello World! + say_hello("Hello", "World") + say_hello(name="World", phrase="Hello") + say_hello("Hello", name="World") +``` + +--- + +## Arbitrary Argument Lists + + - functions can accept arbitrary arguments + + - positional arguments which can not be assigned parameters are collected as `tuple` in argument prefixed by `*` + + - keyword arguments of the same type are collected as `dict` in argument prefixed by `**` + + - `*` parameter has to come before `**` parameter (and both can only exist once) + +```python + def test(*args, **kwargs): + print(args, kwargs) + + test() # () {} + test(1, 2, 3) # (1, 2, 3) {} + test(a=1, b=2) # () {'a': 1, 'b': 2} +``` + +--- + +## Unpacking Argument Lists + + - inverse to arbitrary argument lists + + - iterables can be unpacked using the `*` operator + + - dictionaries can be unpacked using the `**` operator + +```python + def greet_all(*names): + for name in names: + print(f"Hello {name}!") + + # prints Hello World! and Hello Python! + greet_all(*["World", "Python"]) +``` + +--- + +## Decorators + + - functions can be passed to other functions before being assigned a name + + - receiving function is marked behind `@` symbol + + - returned value is assigned the name + +```python + def print_start_end(function): + def wrapper(*args, **kwargs): + print("Start") + function(*args, **kwargs) + print("End") + return wrapper + + @print_start_end + def say_hello(): + print("Hello World!") + + # prints Start, Hello World! an End + say_hello() +``` + +--- + +## Generators + + - functions can produce Iterators using the `yield` statement + + - `yield` returns one value to the caller without exiting the function + + - when the next value is required the function continues + +```python + # already available per default + def map(function, iterable): + for value in iterable: + yield function(value) + + names = ["World", "Python"] + greetings = map(lambda name: f"Hello {name}!", names) + # prints Hello World! and Hello Python! + for greeting in greetings: + print(greeting) +``` From 6963aaa90df149e6e04138214ae326921e34a4d5 Mon Sep 17 00:00:00 2001 From: Eric Niklas Wolf Date: Mon, 22 Jan 2024 10:55:25 +0100 Subject: [PATCH 15/17] add slides for comprehensions --- Makefile | 3 +- img/sugar.jpg | Bin 0 -> 46021 bytes slides/Comprehensions.md | 97 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 99 insertions(+), 1 deletion(-) create mode 100644 img/sugar.jpg create mode 100644 slides/Comprehensions.md diff --git a/Makefile b/Makefile index 56ba0f3..fba19a4 100644 --- a/Makefile +++ b/Makefile @@ -5,7 +5,8 @@ slides := slides/Bytes\ and\ Strings.pdf \ slides/The\ Language.pdf \ slides/Modules\ and\ Packages.pdf \ slides/Collections\ and\ Iterators.pdf \ - slides/Decorators\ and\ advanced\ Functions.pdf + slides/Decorators\ and\ advanced\ Functions.pdf \ + slides/Comprehensions.pdf all: $(slides) diff --git a/img/sugar.jpg b/img/sugar.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ff90951f0fcf406f553a45d73264b70679b45ac9 GIT binary patch literal 46021 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 literal 0 HcmV?d00001 diff --git a/slides/Comprehensions.md b/slides/Comprehensions.md new file mode 100644 index 0000000..7e253be --- /dev/null +++ b/slides/Comprehensions.md @@ -0,0 +1,97 @@ +# Comprehensions + +![Why sugar?](img/sugar.jpg "https://commons.wikimedia.org/wiki/File:W%C3%BCrfelzucker_--_2018_--_3582.jpg"){ height=75% } + +--- + +## Syntactic sugar + + - makes things easier to read or express + + - does not add more expressive power to the language + + - designed for use by humans + +--- + +## List Comprehensions + + - concise way to create lists + + - syntax is `[EXPRESSION for VARIABLE in ITERABLE]` + + - resulting list contains result of EXPRESSION for every element of ITERABLE + +```python + base = 2 + # [1, 2, 4, 8, 16] + powers = [base ** i for i in range(5)] +``` + +--- + +## Filtering + + - elements can be ignored by a filter + + - FILTER is an expression which evaluates to whether the element should be kept (`True` or `False`) + + - syntax is `[EXPRESSION for VARIABLE in ITERABLE if FILTER]` + +```python + # [0, 2, 4, 6, 8] + even = [x for x in range(10) if x % 2 == 0] +``` + +--- + +## Nesting + + - multiple iterables can be nested + + - equivalent to nested for loops + +**Big comprehensions have poor readability!** + +```python +combs = [(x, y) for x in [1,2,3] for y in [3,1,4]] +# equivalent +combs = [] +for x in [1,2,3]: + for y in [3,1,4]: + combs.append((x, y)) +``` + +--- + +## Dictionary Comprehensions + + - concise way to create dicts + + - syntax is `{KEY: VALUE for VARIABLE in ITERABLE}` + + - KEY and VALUE expressions generate dictionary key and value + +```python + names = ["Alan", "Charles", "Konrad"] + # {'Alan': 4, 'Charles': 7, 'Konrad': 6} + lengths = {i: len(i) for i in names} +``` + +--- + +## Generator Comprehensions + + - like list comprehensions, but result is an iterable + + - syntax is `(EXPRESSION for VARIABLE in ITERABLE)` + + - can only be iterated once (saves memory) + +```python + even = (x for x in range(10) if x % 2 == 0) + # [0, 2, 4, 6, 8], exhausts the iterable + list(even) + # parenthesis can be omitted in function call + list(x for x in range(10) if x % 2 == 0) +``` From 4a8a559a7b335666a26045ffa66df7003b1b580b Mon Sep 17 00:00:00 2001 From: Eric Niklas Wolf Date: Wed, 31 Jan 2024 00:07:38 +0100 Subject: [PATCH 16/17] refactor Makefile - place PDF files in separate directory - make pandoc command and options more configurable - fix clean target not handling missing files - fix PDF targets not checking image timestamps --- .gitignore | 2 +- Makefile | 35 ++++++++++++++++++++++------------- README.md | 4 +++- 3 files changed, 26 insertions(+), 15 deletions(-) diff --git a/.gitignore b/.gitignore index 1c66fa9..53752db 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1 @@ -slides/*.pdf +output diff --git a/Makefile b/Makefile index fba19a4..df9614c 100644 --- a/Makefile +++ b/Makefile @@ -1,17 +1,26 @@ -slides := slides/Bytes\ and\ Strings.pdf \ - slides/Exceptions\ and\ Context\ managers.pdf \ - slides/Functions,\ Objects\ and\ Classes.pdf \ - slides/int\ and\ float.pdf \ - slides/The\ Language.pdf \ - slides/Modules\ and\ Packages.pdf \ - slides/Collections\ and\ Iterators.pdf \ - slides/Decorators\ and\ advanced\ Functions.pdf \ - slides/Comprehensions.pdf +SLIDES := output/Bytes\ and\ Strings.pdf \ + output/Exceptions\ and\ Context\ managers.pdf \ + output/Functions,\ Objects\ and\ Classes.pdf \ + output/int\ and\ float.pdf \ + output/The\ Language.pdf \ + output/Modules\ and\ Packages.pdf \ + output/Collections\ and\ Iterators.pdf \ + output/Decorators\ and\ advanced\ Functions.pdf \ + output/Comprehensions.pdf -all: $(slides) +PANDOC_COMMAND := pandoc + +PANDOC_OPTIONS := -t beamer + +.PHONY: clean all + +all: $(SLIDES) clean: - rm $(slides) + rm -rf output + +output: + mkdir output -%.pdf: %.md - pandoc -t beamer "$<" -o "$@" \ No newline at end of file +output/%.pdf: slides/%.md img $(wildcard img/*) | output + $(PANDOC_COMMAND) $(PANDOC_OPTIONS) -o "$@" "$<" \ No newline at end of file diff --git a/README.md b/README.md index 7b5b7c6..03b499c 100644 --- a/README.md +++ b/README.md @@ -10,4 +10,6 @@ To build the slides with pandoc execute: ```sh make all -``` \ No newline at end of file +``` + +The resulting PDF files are located in the `output` directory. \ No newline at end of file From 62f108afc2917f8f8c53c7b0892ea082ecd34214 Mon Sep 17 00:00:00 2001 From: Eric Wolf Date: Tue, 6 Feb 2024 00:48:09 +0100 Subject: [PATCH 17/17] add recommended slide order --- README.md | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 03b499c..1626d92 100644 --- a/README.md +++ b/README.md @@ -12,4 +12,32 @@ To build the slides with pandoc execute: make all ``` -The resulting PDF files are located in the `output` directory. \ No newline at end of file +The resulting PDF files are located in the `output` directory. + +## Slides + +The slides dont have to be taught in a specific order, but the following one is recommended: + + 1. The Language + + 2. Bytes and Strings + + 3. Functions, Objects and Classes + + 4. int and float + + 5. Exceptions and Context managers + + 6. Modules and Packages + + 7. Collections and Iterators + + 8. Decorators and advanced Functions + + 9. Comprehensions + +## Artemis exercises + +Almost every slide has an accompanying exercise in the [iFSR Artemis Course](https://artemis-app.inf.tu-dresden.de/courses/6/exercises). + +It is recommended that the exercises are started after teaching Functions, Objects and Classes.