-
Notifications
You must be signed in to change notification settings - Fork 0
/
import.tex
198 lines (168 loc) · 11.3 KB
/
import.tex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
\chapterimage{chapters11.png} % Chapter heading image
\chapter{Kóðasöfn}\index{Kóðasöfn}\label{k:import}
\textbf{Kóðasafn} (e. library)\footnote{Hugtökin \textit{package} og \textit{module} ná einnig yfir kóðasöfn í Python vegna þess hve lauslega kóðasöfn eru skilgreind.} er endurnýtanlegur kóði sem útfærir ákveðna virkni og hefur ákveðið samhengi.
Tilgangur þess er að spara forriturum vinnu við að útfæra ýmsa algenga virkni og reiða sig í staðinn á kóða sem er nú þegar til.
Þetta hjálpar okkur við að vera ekki að finna upp hjólið í sífellu.
Ómögulegt er að ætla að forrita að einhverju viti án þess að nota kóðasöfn.
Við notum kóðasöfn með \textbf{import} skipuninni.
Þegar import hefur verið sett inn einhvers staðar í skjal er óþarfi að setja það inn aftur, venjan er að öll import séu gerð efst í skjali burtséð frá því hvar í skjalinu þau eru notuð.
Það gerir kóðann læsilegri og undirbýr okkur fyrir það sem er að fara að gerast.
Ef það stendur til dæmis efst í skjali að kóðasöfnin \textit{math} og \textit{random} séu notuð vitum við strax að í þessum kóða er líklega verið að vinna með handahófskennd og stærðfræði.
Ef efst stæði að kóðasöfnin \textit{datetime} og \textit{time} væru notuð erum við líklega að skoða kóða sem er að vinna með tíma og dagsetningar, það ætti þá ekki að koma okkur á óvart að sjá dagsetningarvinnslu.
Venjan að setja öll import efst er því gagnleg fyrir þær sakir að kóðinn verður læsilegur og auðveldara verður að halda utan um kóðasöfnin sem við erum að nota.
\section{Notkun kóðasafna}\index{Tilgangur kóðasafna}\label{uk:kóðasöfn-kynnt}
Eins og kom fram í kynningu þá viljum við geta einbeitt okkur að því að leysa okkar vandamál í stað þess að finna upp hjólið og því viljum við kynna okkur þau kóðasöfn sem eru í boði sem útfæra virkni sem við viljum beita.
Tilgangur þeirra er að létta okkur lífið og gera virkni aðgengilega.
Í næsta undirkafla verða tekin fyrir nokkur gagnleg kóðasöfn en við getum varla talað um tilgang og gagnsemi kóðasafna án þess að taka eitthvert þeirra fyrir.
Í inngangi voru kóðasöfnin \texttt{time} og \texttt{random} nefnd.
Skoðum þau aðeins núna, sjá kóðabúta \ref{lst:kóðasöfn-kynnt-time} og \ref{lst:kóðasöfn-kynnt-rand} þar sem kóðasöfnin eru tekin fyrir.
Þau bjóða bæði upp á aragrúa aðferða og eiginda sem er út fyrir efni þessarar bókar en þó þess virði að taka fyrir ákveðna virkni sem búist er við að nota í æfingum í lok kaflans.
\paragraph{}
Um kóðasafnið time:
\begin{itemize}
\item \texttt{time.time()} skilar okkur því hversu margar sekúndur eru síðan tímatal í tölvum hófst 1. jan 1970.
\item \texttt{time.sleep()} tekur við tölu og lætur vélina bíða í svo margar sekúndur áður en hún framkvæmir aðgerðina í næstu línu fyrir neðan.
\item \texttt{time.localtime()} skilar okkur nd sem inniheldur í minnkandi röð hver tíminn er, frá ári niður í sekúndur, ásamt deginum í vikunni og árinu, síðasta er gildi sem tekur mið af \texttt{isdaylightsavingstime} (\textbf{isdst}).
\end{itemize}
\paragraph{}
Um kóðasafnið random: Þetta kóðasafn gerir forriturum auðveldara fyrir með því að gera \textit{handahófskennd} (e. randomness) aðgengilega, en það að geta gert hluti af handahófi er mjög mikilvægt í tölvunarfræði og forritun.
\begin{itemize}
\item \texttt{random.randint()} nær í heiltölu á lokuðu bili, þar sem báðir endapunktar eru teknir með.
\item \texttt{random.random()} nær í fleytitölu á bilinu 0-1.
\item \texttt{random.choice()} nær í stak af handahófi upp úr ítranlegum hlut.
\item \texttt{random.shuffle()} stokkar upp í raðanlegum hlut.
\end{itemize}
\vspace{1cm}
\begin{lstlisting}[caption=Notkun kóðasafna með time, label=lst:kóðasöfn-kynnt-time]
import time
sekundur_adan = time.time()
time.sleep(3)
sekundur_3_sek_eftir_adan = time.time()
thrir = sekundur_3_sek_eftir_adan - sekundur_adan
print(thrir)
\end{lstlisting}
\lstset{style=uttak}
\begin{lstlisting}
3.001107931137085
\end{lstlisting}
\lstset{style=venjulegt}
\vspace{1cm}
Þið fáið ekki nákvæmlega sömu tölu, ekki einu sinni ef þið reynið að keyra þetta oft. Það er líka ómögulegt að ná keyrslu upp á millisekúndunákvæmni með þessu móti.
Skoðum næst handahófskennd.
\phantom{easter egg}
%\begin{wrapfigure}{i}{0.2\textwidth} %i o r l
\begin{center}
\includegraphics[scale=1.9]{doodles31-28.png}
\end{center}
%\end{wrapfigure}
\newpage
\begin{lstlisting}[caption=Notkun kóðasafna með random, label=lst:kóðasöfn-kynnt-rand]
import random
listi = [1,2,3,4,5,6,7,8,9]
einhver_tala = random.choice(listi)
random.shuffle(listi)
print(listi)
for i in range(einhver_tala):
if random.randint(min(listi),max(listi)) > i:
print("Þú vannst 10kr")
else:
print("Þú þarft að ydda blýantana þína")
fjoldi_folks = 100
hlutfall_folks_med_raudan_trefil = fjoldi_folks*random.random()
print(hlutfall_folks_med_raudan_trefil)
\end{lstlisting}
\lstset{style=uttak}
\begin{lstlisting}
[9, 3, 2, 7, 5, 1, 4, 8, 6]
Þú vannst 10kr
Þú vannst 10kr
Þú vannst 10kr
Þú vannst 10kr
Þú þarft að ydda blýantana þína
Þú þarft að ydda blýantana þína
Þú þarft að ydda blýantana þína
Þú þarft að ydda blýantana þína
98.19660121258345 %
\end{lstlisting}
\lstset{style=venjulegt}
Sama er upp á teningnum hér, úttakið verður ekki það sama þegar þið keyrið þennan kóða en ekki af sömu ástæðu.
Hér er það beinlínis ætlunarverkið að úttakið verði óútreiknanlegt.
Eins og sést í kóðabút \ref{lst:kóðasöfn-kynnt-time} þarf að nota nafnið á kóðasafninu til að ná í aðferðir og virkni.
Sum kóðasöfn heita löngum nöfnum og ef fólk vill stytta nöfnin á þeim má nota lykilorðið \textbf{as} til þess að varpa nafninu á kóðasafninu í annað breytuheiti, sjá notkun í kóðabút \ref{lst:kóðasöfn-as}.
Vísunin kemur strax þegar kóðasafnið er flutt inn og þar eftir er kóðasafnið aðgengilegt með þessari vísun.
Þá er mikilvægt að hafa í huga að nefna kóðasöfnin eittvað sem verður ekki óvart yfirskrifað í kóðanum og gæti valdið ruglingi, eins og að skipta út \texttt{import random} fyrir \texttt{import random as listinn\_minn}.
Það væri hrikalegt, illlæsilegt og myndi fyrirsjáanlega valda vandamálum.
Nú vitum við hvernig á að nota kóðasöfn.
\begin{lstlisting}[caption=Lykilorðið as, label=lst:kóðasöfn-as]
import random as rnd
import time as t
timi = t.time()
tala = rnd.random()
print(timi * tala % tala)
\end{lstlisting}
\lstset{style=uttak}
\begin{lstlisting}
0.4772097503672992
\end{lstlisting}
\lstset{style=venjulegt}
\section{Nokkur gagnleg kóðasöfn}\index{Nokkur gagnleg kóðasöfn}\label{uk:kóðasöfn-gagnleg}
Tilgangur þessarar bókar er ekki að tiltaka hvert einasta kóðasafn sem er til, heldur að kynna til sögunnar hvernig notkun þeirra virkar og einhver þau algengustu eða skemmtilegustu kóðasöfn sem eru notuð í dag.
Þetta er gert til þess að halda bókinni frá því að verða eins og símaskrá (ef einhver lesandi man eftir að hafa haldið á símaskrá) og passa að hún haldi í við þróun í fræðigreininni.
Að því sögðu er hér stutt kynning á nokkrum vinsælum kóðasöfnum.
\begin{itemize}
\item \textbf{math}, gerir aðgengilegar alls konar stærðfræðilegar aðgerðir, eins og hornaföll, logra, veldisföll og tölulega vinnslu.
Ásamt því gefur það okkur aðgengi að mikilli nákvæmni á hinum ýmsu rauntölustærðum eins og pí.
\item \textbf{numpy}, gerir stærðfræðilega vinnslu aðgengilega, t.d. á fylkjum.
Numpy er sérhæft fyrir flóknari vinnslu en math.
\item \textbf{scipy}, er það sem hægt er að nota til þess að vinna með \textit{vélanám} (e. machine learning).
Scipy hefur oft verið sagt óþarflega flókið í notkun, en hugmyndirnar sem þar er verið að vinna með eru í grunninn mun flóknari en í numpy og math pökkunum svo það ætti ekki að koma á óvart.
\item \textbf{pygame}, er kóðasafn sem vinnur með grafískt viðmót og inntak frá notanda oft með mjög skapandi útkomu.
Margir litlir leikir hafa orðið til með þessu kóðasafni og er til mýgrútur af dæmum og leikjum á netinu til að vinna út frá.
\item \textbf{datetime}, vinnur með dagsetingar því ef við ætlum einhvern tímann að skrifa hugbúnað sem vinnur með dagsetningar viljum við alls ekki finna upp hjólið.
Þar er tekið á sumar- og vetrartíma, hlaupárum og öðru slíku sem við viljum ekki þurfa að hafa áhyggjur af.
\item \textbf{matplotlib}, er safn sem var búið til í kringum tvívíða sýn á gögn til að sýna gröf og til að gera gögn sýnileg á fjölbreytilegan máta.
Þetta er annað safn sem hefur slæmt orð á sér fyrir að vera óþarflega óaðgengilegt.
\end{itemize}
Það er út fyrir efni bókarinnar að sýna hvernig eigi að búa til kóðasöfn sem eru nothæf öðrum, en það er lítið mál að kynna sér það á vefnum.
%-------------------------------ÆFINGAR------------------%
\newpage
\section{Æfingar}
\begin{exercise}\label{imp1}
Notið \texttt{input} skipun til þess að komast að því hvort að notandinn viti hversu lengi 10 sekúndur eru að líða.
\end{exercise}
\setboolean{firstanswerofthechapter}{true}
\begin{Answer}[ref={imp1}]
Skipunin er í rauninni bara þarna í staðinn fyrir \texttt{time.sleep()}, núna er það notandinn sem ákveður hvenær næsta lína af kóða er keyrð.
Það sem við þurfum að fatta er að reikna rétt út og finna tímann.
\begin{lstlisting}
adan = time.time()
input("ýttu eftir 10 sek")
nuna = time.time()
print(nuna-adan)\end{lstlisting}
\end{Answer}
\setboolean{firstanswerofthechapter}{false}
\begin{exercise}\label{imp2}
Gefinn er eftirfarandi listi:
['Lorem','ipsum','dolor','sit','amet,','consectetur',
'adipiscing','elit,','sed','do','eiusmod','tempor',
'incididunt','ut','labore','et','dolore','magna','aliqua.',
'Ut','enim','ad','mini','veniam,','quis','nostrud',
'exercitation','ullamco','laboris','nisi','ut','aliquip',
'ex','e','commodo','consequat.','Duis','aute','irure',
'dolor','in','reprehenderit','in','voluptate','velit',
'esse','cillum','dolore','eu','fugiat','nulla','pariatur.',
'Excepteur','sint','occaect','cupidatat','non','proident,',
'sunt','in','culpa','qui','officia','deserunt','mollit',
'ani','id','est','laborum.']
Náið í orð af handahófi úr listanum og náið svo í tákn af handahófi úr því orði.
\end{exercise}
\begin{Answer}[ref={imp2}]
Hér þurfum við aðallega að átta okkur á því hvaða föll við viljum nota úr \texttt{random} pakkanum, úr listanum viljum við nota \texttt{choice} en til að finna eitthvað tákn viljum nota \texttt{randint} fallið.
Athugum hér að þegar við notum \texttt{randint} gefum við upp bil af tölum eins og 1,10 og þá er bæði 1 og 10 með.
Svo þegar við notum það til að búa til sætisvísi af handahófi verðum við að passa að fara ekki út fyrir löglega sætisvísa.
\begin{lstlisting}
rugl_ord = random.choice(listi)
rugl_takn = rugl_ord[random.randint(0,len(rugl_ord)-1)]
print(rugl_ord, rugl_takn)\end{lstlisting}
\newpage
\end{Answer}