-
Notifications
You must be signed in to change notification settings - Fork 0
/
nd.tex
196 lines (163 loc) · 9.52 KB
/
nd.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
\chapterimage{chapters9.png} % Chapter heading image
\chapter{N-dir}\index{Ndir}\label{k:ndir}
Nú ætlum við að kynnast nýrri týpu, hún heitir \textbf{nd} (lesist ennd) eða n-und, eða n-d (e. tuple).\footnote{\href{http://stae.is/os}{Skoðið endilega orðasafn stærðfræðifélagsins stæ.is/os}.}
Lykilorð þessarar týpu er \textbf{tuple}.
Íslenska nafnið er komið frá hugmyndinni um tvenndir og þrenndir, nema við vitum ekki hversu mörg stök er verið að hópa saman, þau gætu verið af n fjölda svo við köllum týpuna nd eða n-und (þá frá tvíund og þríund).
Þetta er líklega eina orðið í íslensku sem inniheldur ekki sérhljóða.
Hér eftir verður týpan kölluð \emph{nd}.
Hún líkist listum að því leytinu til að margar af sömu aðgerðum sem má gera á lista má gera á ndir.
Hún líkist strengjum því að hún er óbreytanleg.
Það má ekki bæta við, breyta eða taka út stök eftir að ndin er skilgreind.
Ástæðan fyrir því að nota ndir í stað lista er sú að það getur verið hagkvæmara, ndir nota ekki eins mikið minni.
Það getur líka verið vegna þess að okkur er umhugað um gagnaheilindi og svo sjáum við í kafla \ref{k:föll} hvernig má fá eina nd í stað margra skilagilda.
\section{Skilgreining}\index{Skilgreining n-da}
\begin{wrapfigure}{i}{0.21\textwidth} %i o r l
\begin{center}
\includegraphics{doodles31-02.png}
\end{center}
\end{wrapfigure}
Við skilgreinum nd með svigum.
Athugið að hingað til höfum við notað sviga til að aðgreina segðir og það er vandmeðfarið að átta sig á því hvenær sviginn er stærðfræðilegur (þ.e. einungis fyrir forritarann til að aðgreina samhengi) og hins vegar skilgreining á gögnum af týpunni nd.
Aðgreiningin verður augljós þegar við áttum okkur á því að til þess að skilgreina nd þurfum við, líkt og með lista, að aðgreina stökin innan ndinnar með kommum.
Sjáum í kóðabút \ref{lst:ndir-kynntar} hvernig má skilgreina ndir og hvernig svigar gera það ekki nema við notum kommur.
Þar sjáum við einnig að það eru einungis tvær aðferðir til fyrir týpuna, \texttt{.count()} og \texttt{.index()}.
Hvernig má það vera að týpan líkist listum þegar það eru bara til tvær aðferðir?
Var ekki verið að taka fram að það mætti gera margt það sama?
Jú, aðgerðir og aðferðir eru ekki það sama.
Við getum ítrað í gegnum nd, við getum skeytt einni nd aftan við aðra (fáum þá nýja nd en breytum henni ekki) við getum náð í hluta úr ndinni (með hornklofum eins og hlutstrengi eða hluta úr lista).
Skoðum nú í kóðabút \ref{lst:ndir-kynntar} hvernig svigar geta annars vegar verið til að afmarka stærfræðilegan forgang og hins vegar til að skilgreina nýju týpuna okkar.
Tökum sérstaklega eftir notkuninni á innbyggða fallinu \texttt{type()} sem auðveldar okkur að skilja hvenær nd verður til.
\begin{lstlisting}[caption=Ndir skilgreindar, label=lst:ndir-kynntar]
a = (3+4)*2
print("a er af taginu", type(a))
b = (1)
print("b er af taginu", type(b))
c = () # þetta verður tóm nd
d = (1,) # þetta verður nd sem inniheldur eitt stak, athugið kommunotkunina
e = (1, 1, 2, 2, 5) # þetta verður nd sem inniheldur 5 stök
\end{lstlisting}
\lstset{style=uttak}
\begin{lstlisting}
a er af taginu <class 'int'>
b er af taginu <class 'int'>
c er <class 'tuple'> d er <class 'tuple'> og e er <class 'tuple'>
\end{lstlisting}
\lstset{style=venjulegt}
Nú gerum við ráð fyrir að eiga enn þá ndirnar \texttt{c,d} og \texttt{e} úr kóðabút \ref{lst:ndir-kynntar}.
Skoðum þá aðferðirnar tvær sem eru innbyggðar í kóðabút \ref{lst:ndir-adfr} ásamt því sem gerist þegar við skeytum einni nd aftan við aðra, hvernig ítrun með for-lykkju er lík því sem við þekkjum með lista og að lokum hvernig má sækja hlut-nd.
\begin{lstlisting}[caption=Ndir aðgerðir og aðferðir , label=lst:ndir-adfr]
print(d.index(1))
print(e.count(1))
print(e + d)
print()
for tala in e:
print(tala)
# Athugum að við megum ekki breyta nd, svo eftirfarandi kóði veldur villu
# c[4] = 3
print(e[1:3])
\end{lstlisting}
\lstset{style=uttak}
\begin{lstlisting}
0
2
(1, 1, 2, 2, 5, 1)
1
1
2
2
5
(1, 2)
\end{lstlisting}
\lstset{style=venjulegt}
\section{Notkun}\index{Notkun nda}
Þar sem ndir eru óbreytanlegar er gagnlegt að nota þær til að halda utan um ástand sem við viljum ekki að sé hróflað við.
Segjum að það séu ákveðin tengsl á milli tveggja gilda og ef við viljum halda heilindum þeirra væri gott að nota nd.
Við getum líka notað þær til að spara minni þegar við þurfum litla lista sem þarf bara að nota tímabundið og óbreytta.
Einnig geta þær nýst til að halda utan um breytur sem á svo að nota hverja í sínu lagi seinna.
Tökum eftir að vissulega má útfæra fyrri þrjú, af þessum fjórum atriðum, með listum.
Skoðum kóðabút \ref{lst:nd-notkun} þar sem við sjáum dæmi um nd sem við viljum að haldist óbreytt, við auðvitað getum skoðað hana.
Þar viljum við geta úthlutað hverju staki í einhverja breytu (e. unpack) til að nota án þess að það hafi áhrif á ndina.
Við megum ekki keyra aðferðir á borð við \texttt{.sort()} á ndina því þá breytist hún, við megum heldur ekki áhrif á einstaka sætisvísa (skoðið hvaða villa fæst við þá aðgerð með því að keyra línu 10 í kóðabút \ref{lst:ndir-adfr}).
Það sem við viljum er létt gagnagrind sem passar upp á gögnin.
\begin{lstlisting}[caption=Ndir notaðar fyrir það sem þær eru gagnlegar, label=lst:nd-notkun]
notanda_upplysingar = ("valborg", "rosalega gott lykilorð", "netfang@internet.is")
notandanafn = notanda_upplysingar[0]
lykilord = notenda_upplysingar[1]
netfang = notenda_upplysingar[2]
notandanafn, lykilord, netfang = notenda_upplysingar
print(notandanafn)
notandanafn = notandanafn.upper()
print(notenda_upplysingar)
\end{lstlisting}
\lstset{style=uttak}
\begin{lstlisting}
valborg
('valborg', 'rosalega gott lykilorð', 'netfang@internet.is')
\end{lstlisting}
\lstset{style=venjulegt}
Línur 3-5 og lína 7 eru jafngildar í kóðabút \ref{lst:nd-notkun}.
Þessi ,,afpökkun“ er læsileg og þægileg leið til að vinna með nd, við sjáum það svo betur þegar við skoðum skilagildi í kafla \ref{uk:skilagildi} hversu mikilvægt er að kunna á þetta.
Takið einnig eftir að það hafði engin áhrif á ndina í úttakinu að breytan \texttt{notandanafn} hafi verið uppfærð.
Reynið nú að uppfæra það gildi í ndinni, reynið að setja þessa nýju breytu í staðinn fyrir fremsta stakið og sjáið hvaða villu þið fáið.
Að sjálfsögðu er markmiðið okkar ekki enn sem komið er orðið að því að skrifa kóða í sem fæstum línum mögulegum, en það sem við viljum þó geta gert er að gera kóðann okkar eins læsilegan og mögulegt er með því að nota þær aðgerðir sem Python býður upp á.
Jafnvel þó að eini ávinningurinn sé að við sjálf skiljum kóðann ennþá þegar við skoðum hann seinna.
%\begin{wrapfigure}{i}{0.2\textwidth} %i o r l
\begin{center}
\includegraphics{doodles31-09.png}
\end{center}
%\end{wrapfigure}
%-------------------------------
\newpage
\section{Æfingar}
\begin{exercise}\label{nd1}
Búið til nd sem inniheldur 3 stök og setjið svo aftasta stakið í breytu.
\end{exercise}
\setboolean{firstanswerofthechapter}{true}
\begin{Answer}[ref={nd1}]
Hér vitum við að það eru þrjú stök í ndinni, svo að aftasta stakið hefur sætisnúmerið 2.
\begin{lstlisting}
nd = (1,2,3)
tala = nd[2]\end{lstlisting}
\end{Answer}
\setboolean{firstanswerofthechapter}{false}
\begin{exercise}\label{nd2}
Búið til nd sem inniheldur eingöngu tölur, ítrið í gegnum ndina og prentið út þær tölur sem eru stærri en 100.
\end{exercise}
\begin{Answer}[ref={nd2}]
Rifjum upp að best er að nota for-lykkju til að ítra í gegnum hluti af gefinni stærð.
\begin{lstlisting}
talna_nd = (1,34,432,324,999,1,2,3,1,3,55,664,10000)
for tala in talna_nd:
if tala > 100:
print(tala)\end{lstlisting}
\end{Answer}
\begin{exercise}\label{nd3}
Búið til nd sem inniheldur tvær tölur, úthlutið svo þeim tveimur tölum í tvær breytur með afpökkun.
Geymið svo útkomuna úr því hvort að fremri talan sé stærri en sú seinni og búið til nýja nd þar sem útkomunni er skeytt aftan við upphaflegu ndina.
\end{exercise}
\begin{Answer}[ref={nd3}]
Við erum beðin um að búa til nd með tveimur stökum svo erum við beðin um að geyma útkomu sem þýðir að við þurfum breytu.
Sú breyta á að innihalda svarið við því hvort fyrri talan sé stærri en sú seinni svo það er sanngildi.
Að því loknu erum við beðin um að nota samskeytingu en útkoman er ekki nd svo við þurfum að setja hana í nd til að geta beitt samskeytingu.
\begin{lstlisting}
nd = (1,2)
tala1, tala2 = nd
svar = tala1 > tala2
ny_nd = nd + (svar,)\end{lstlisting}
\end{Answer}
\begin{exercise}\label{nd4}
Búið til tóma nd.
Búið til lykkju sem keyrir fjórum sinnum og í hvert sinn spyr hún notandann um uppáhaldslitinn hans.
Í hvert sinn sem notandinn er búinn að svara skal endurskilgreina ndina sem það sem hún var áður að viðskeyttu nýja svarinu.
Þegar lykkjan hefur lokið keyrslu sinni skulið þið prenta út ndina.
\end{exercise}
\begin{Answer}[ref={nd4}]
Rifjum upp \texttt{input()} fallið úr kafla \ref{k:segðir}, einnig \texttt{range()} fallið úr kafla \ref{k:lykkjur}.
\begin{lstlisting}
nd = ()
for i in range(4):
svar = input("hver er uppáhalds liturinn þinn?")
nd = nd + (svar,)
print(nd)\end{lstlisting}
\newpage
\end{Answer}