forked from OpenTechSchool/python-beginners
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfunctions.html
More file actions
321 lines (281 loc) · 18.8 KB
/
functions.html
File metadata and controls
321 lines (281 loc) · 18.8 KB
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
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Benutzerdefinierte Funktionen — Introduction to Programming with Python</title>
<link rel="stylesheet" href="_static/basic.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="_static/custom.css" type="text/css" />
<link rel="stylesheet" href="_static/bootstrap-3.3.4/css/bootstrap.min.css" type="text/css" />
<link rel="stylesheet" href="_static/bootstrap-3.3.4/css/bootstrap-theme.min.css" type="text/css" />
<link rel="stylesheet" href="_static/bootstrap-sphinx.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: './',
VERSION: '2015.10.02',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
};
</script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="_static/translations.js"></script>
<script type="text/javascript" src="_static/spoilers.js"></script>
<script type="text/javascript" src="_static/js/jquery-1.11.0.min.js"></script>
<script type="text/javascript" src="_static/js/jquery-fix.js"></script>
<script type="text/javascript" src="_static/bootstrap-3.3.4/js/bootstrap.min.js"></script>
<script type="text/javascript" src="_static/bootstrap-sphinx.js"></script>
<link rel="copyright" title="Copyright" href="copyright.html" />
<link rel="top" title="Introduction to Programming with Python" href="index.html" />
<link rel="next" title="Funktionen mit Parametern" href="functions_parameters.html" />
<link rel="prev" title="Schleifen" href="loops.html" />
<meta charset='utf-8'>
<meta http-equiv='X-UA-Compatible' content='IE=edge,chrome=1'>
<meta name='viewport' content='width=device-width, initial-scale=1.0, maximum-scale=1'>
<meta name="apple-mobile-web-app-capable" content="yes">
</head>
<body role="document">
<div id="navbar" class="navbar navbar-default navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<!-- .btn-navbar is used as the toggle for collapsed navbar content -->
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".nav-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="index.html">
Python for Beginners</a>
<span class="navbar-text navbar-version pull-left"><b>2015.10.02</b></span>
</div>
<div class="collapse navbar-collapse nav-collapse">
<ul class="nav navbar-nav">
<li class="dropdown globaltoc-container">
<a role="button"
id="dLabelGlobalToc"
data-toggle="dropdown"
data-target="#"
href="index.html">Material <b class="caret"></b></a>
<ul class="dropdown-menu globaltoc"
role="menu"
aria-labelledby="dLabelGlobalToc"><ul class="current">
<li class="toctree-l1"><a class="reference internal" href="getting_started.html">Erste Schritte</a></li>
<li class="toctree-l1"><a class="reference internal" href="simple_drawing.html">Einfaches Zeichnen mit turtle</a></li>
<li class="toctree-l1"><a class="reference internal" href="variables.html">Variablen</a></li>
<li class="toctree-l1"><a class="reference internal" href="loops.html">Schleifen</a></li>
<li class="toctree-l1 current"><a class="current reference internal" href="">Benutzerdefinierte Funktionen</a></li>
<li class="toctree-l1"><a class="reference internal" href="functions_parameters.html">Funktionen mit Parametern</a></li>
<li class="toctree-l1"><a class="reference internal" href="conditionals.html">Verzweigungen</a></li>
<li class="toctree-l1"><a class="reference internal" href="conditional_loops.html">Bedingte Schleifen</a></li>
<li class="toctree-l1"><a class="reference internal" href="logical_operators.html">Logische Operatoren</a></li>
<li class="toctree-l1"><a class="reference internal" href="where_to_go.html">Wie es weiter geht</a></li>
<li class="toctree-l1"><a class="reference internal" href="copyright.html">Lizenz</a></li>
</ul>
</ul>
</li>
<li class="dropdown">
<a role="button"
id="dLabelLocalToc"
data-toggle="dropdown"
data-target="#"
href="#">Chapter <b class="caret"></b></a>
<ul class="dropdown-menu localtoc"
role="menu"
aria-labelledby="dLabelLocalToc"><ul>
<li><a class="reference internal" href="#">Benutzerdefinierte Funktionen</a><ul>
<li><a class="reference internal" href="#introduction">Einführung</a></li>
<li><a class="reference internal" href="#a-function-for-a-square">Eine Funktion für ein Viereck</a><ul>
<li><a class="reference internal" href="#exercise">Übung</a></li>
<li><a class="reference internal" href="#solution">Lösung</a></li>
</ul>
</li>
<li><a class="reference internal" href="#a-function-for-a-hexagon">Eine Funktion für ein Hexagon</a><ul>
<li><a class="reference internal" href="#id1">Übung</a></li>
<li><a class="reference internal" href="#id2">Lösung</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</ul>
</li>
<li class="navbar-rel">
<a href="loops.html" title="Previous Chapter: Schleifen">
<span class="glyphicon glyphicon-step-backward"></span>
<span>Previous</span>
</a>
</li>
<li class="navbar-rel">
<a href="functions_parameters.html" title="Next Chapter: Funktionen mit Parametern">
<span class="glyphicon glyphicon-step-forward"></span>
<span>Next</span>
</a>
</li>
<li class="dropdown">
<a role="button"
data-toggle="dropdown"
data-target="#"
href="#">Languages <b class="caret"></b></a>
<ul class="dropdown-menu"
role="menu">
<li><a href="../en/index.html">English</a></li>
<li><a href="../de/index.html">Deutsch (German)</a></li>
<li><a href="../es_CL/index.html">Español (Spanish)</a></li>
<li><a href="../ru/index.html">русский (Russian)</a></li>
<li><a href="../ko/index.html">한국인 (Korean)</a></li>
<li><a href="../ro/index.html">Română (Romanian)</a></li>
</ul>
</li>
</ul>
<form class="navbar-form navbar-right" action="search.html" method="get">
<div class="form-group">
<input type="text" name="q" class="form-control" placeholder="Search" />
</div>
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
</div>
<div class="container">
<div class="row">
<div class="col-md-12">
<div class="section" id="user-defined-functions">
<h1>Benutzerdefinierte Funktionen<a class="headerlink" href="#user-defined-functions" title="Link zu dieser Überschrift">¶</a></h1>
<div class="section" id="introduction">
<h2>Einführung<a class="headerlink" href="#introduction" title="Link zu dieser Überschrift">¶</a></h2>
<p>Programmierer können mit einigen ganz schön komplexen und abstrakten Probleme umgehen, aber ein Zug von guten Programmierern ist, dass sie faul sind. Sie wollen nur mit einer Sache gleichzeitig umgehen müssen. Also brauchst du einen Weg um Probleme in kleinere, abgesonderte Teile zu zerlegen, damit du dich auf nur einen Teil konzentrieren kannst.</p>
<p>Funktionen sind ein Weg um diese Abstraktion in Python abzubilden. Lass uns <code class="docutils literal"><span class="pre">turtle.reset()</span></code> betrachten. <code class="docutils literal"><span class="pre">reset</span></code> ist eine Funktion die wir auf unserer <code class="docutils literal"><span class="pre">turtle</span></code> aufrufen und es ist eigentlich eine Abstraktion für eine Vielzahl von Schritten, und zwar:</p>
<ul class="simple">
<li><p class="first">Lösche die Zeichenfläche.</p>
</li>
<li><p class="first">Setze die Linienbreite und -Farbe zurück zu den Startwerten.</p>
</li>
<li><p class="first">Bewege die Schildkröte in ihre Ausgangsposition zurück.</p>
</li>
</ul>
<p>Aber weil all dieser Quelltext in der Funktion enthalten ist müssen wir uns keine Sorgen über die Details machen. Wir können die Funktion einfach <em>ausführen</em> und wissen, was sie für uns tun wird.</p>
<p>Also - wie schreiben wir unsere eigene?</p>
<p>Eine Funktion kann in Python mit dem Schlüsselwort <code class="docutils literal"><span class="pre">def</span></code> definiert werden:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">def</span> <span class="nf">line_without_moving</span><span class="p">():</span>
<span class="n">turtle</span><span class="o">.</span><span class="n">forward</span><span class="p">(</span><span class="mi">50</span><span class="p">)</span>
<span class="n">turtle</span><span class="o">.</span><span class="n">backward</span><span class="p">(</span><span class="mi">50</span><span class="p">)</span>
</pre></div>
</div>
<p>Diese von uns definierte Funktion heisst <code class="docutils literal"><span class="pre">line_without_moving</span></code>. Sie ist eine Abstraktion für zwei Bewegungen der Schildkröte - ein Schritt vorwärts und ein Schritt rückwärts.</p>
<p>Um sie zu benutzen (oder wie es häufig genannt wird, “sie aufzurufen”), schreib ihren Namen gefolgt von runden Klammern:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">line_without_moving</span><span class="p">()</span>
<span class="n">turtle</span><span class="o">.</span><span class="n">right</span><span class="p">(</span><span class="mi">90</span><span class="p">)</span>
<span class="n">line_without_moving</span><span class="p">()</span>
<span class="n">turtle</span><span class="o">.</span><span class="n">right</span><span class="p">(</span><span class="mi">90</span><span class="p">)</span>
<span class="n">line_without_moving</span><span class="p">()</span>
<span class="n">turtle</span><span class="o">.</span><span class="n">right</span><span class="p">(</span><span class="mi">90</span><span class="p">)</span>
<span class="n">line_without_moving</span><span class="p">()</span>
</pre></div>
</div>
<p>Wir könnten mehr Funktionen implementieren, um einige der Wiederholungen loszuwerden:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">def</span> <span class="nf">star_arm</span><span class="p">():</span>
<span class="n">line_without_moving</span><span class="p">()</span>
<span class="n">turtle</span><span class="o">.</span><span class="n">right</span><span class="p">(</span><span class="mi">360</span> <span class="o">/</span> <span class="mi">5</span><span class="p">)</span>
<span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">5</span><span class="p">):</span>
<span class="n">star_arm</span><span class="p">()</span>
</pre></div>
</div>
<div class="admonition important">
<p class="first admonition-title">Wichtig</p>
<p>Python benutzt <em>Einrückung mit Leerzeichen</em> um zusammengehörende Codeabschnitte zu kennzeichnen. Ein Block (wie die obige Funktion) wird in Python mit einem Doppelpunkt am Ende der Zeile und Einrückung der folgenden Zeilen — üblicherweise vier Leerzeichen — gekennzeichnet. Der Block endet sobald die Zeilen nicht mehr eingerückt sind.</p>
<p>Das ist ein Unterschied zu vielen anderen Programmiersprachen, die Sonderzeichen (etwa geschweifte Klammern <code class="docutils literal"><span class="pre">{}</span></code>) verwenden um Codeblöcke zu kennzeichnen.</p>
<p class="last">Verwende niemals Tabulatoren um Codeblöcke einzurücken, nur Leerzeichen. Du kannst – und solltest – Deinen Editor so konfigurieren, dass er vier Leerzeichen einsetzt sobald Du die Tab-Taste drückst. Das Problem mit den Tabulatoren ist, dass andere Programmierer Leerzeichen verwenden, und falls beide in der gleichen Python-Datei verwendet werden, wird Python sie fehlerhaft interpretieren. Im besten Fall gibt es eine Fehlermeldung und im schlimmsten Fall tauchen undurchsichtige schwer zu findende Fehler auf.</p>
</div>
</div>
<div class="section" id="a-function-for-a-square">
<h2>Eine Funktion für ein Viereck<a class="headerlink" href="#a-function-for-a-square" title="Link zu dieser Überschrift">¶</a></h2>
<div class="section" id="exercise">
<h3>Übung<a class="headerlink" href="#exercise" title="Link zu dieser Überschrift">¶</a></h3>
<p>Schreibe eine Funktion die ein Viereck zeichnet. Kannst du diese Funktion benutzen um das Programm mit den gekippten Vierecken zu verbessern? Lässt es sich leichter mit dem Programm experimentieren wenn du Funktionen benutzt?</p>
</div>
<div class="solution section" id="solution">
<h3>Lösung<a class="headerlink" href="#solution" title="Link zu dieser Überschrift">¶</a></h3>
<div class="highlight-python"><div class="highlight"><pre><span class="k">def</span> <span class="nf">tilted_square</span><span class="p">():</span>
<span class="n">turtle</span><span class="o">.</span><span class="n">left</span><span class="p">(</span><span class="mi">20</span><span class="p">)</span> <span class="c"># now we can change the angle only here</span>
<span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">4</span><span class="p">):</span>
<span class="n">turtle</span><span class="o">.</span><span class="n">forward</span><span class="p">(</span><span class="mi">50</span><span class="p">)</span>
<span class="n">turtle</span><span class="o">.</span><span class="n">left</span><span class="p">(</span><span class="mi">90</span><span class="p">)</span>
<span class="n">tilted_square</span><span class="p">()</span>
<span class="n">tilted_square</span><span class="p">()</span>
<span class="n">tilted_square</span><span class="p">()</span>
<span class="c"># bonus: you could have a separate function for drawing a square,</span>
<span class="c"># which might be useful later:</span>
<span class="k">def</span> <span class="nf">square</span><span class="p">():</span>
<span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">4</span><span class="p">):</span>
<span class="n">turtle</span><span class="o">.</span><span class="n">forward</span><span class="p">(</span><span class="mi">50</span><span class="p">)</span>
<span class="n">turtle</span><span class="o">.</span><span class="n">left</span><span class="p">(</span><span class="mi">90</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">tilted_square</span><span class="p">():</span>
<span class="n">turtle</span><span class="o">.</span><span class="n">left</span><span class="p">(</span><span class="mi">20</span><span class="p">)</span>
<span class="n">square</span><span class="p">()</span>
<span class="c"># etc</span>
</pre></div>
</div>
</div>
</div>
<div class="section" id="a-function-for-a-hexagon">
<h2>Eine Funktion für ein Hexagon<a class="headerlink" href="#a-function-for-a-hexagon" title="Link zu dieser Überschrift">¶</a></h2>
<div class="section" id="id1">
<h3>Übung<a class="headerlink" href="#id1" title="Link zu dieser Überschrift">¶</a></h3>
<p>Schreibe eine Funktion die ein Hexagon zeichnet.</p>
<img alt="_images/hexagon.png" src="_images/hexagon.png" />
<p>Jetzt kombiniere diese Funktion zu einer Honigwabe. Zeichne erst einmal nur eine einzige Ebene, ungefähr so:</p>
<img alt="_images/honeycomb.png" src="_images/honeycomb.png" />
<p>Probier es selbst!</p>
<div class="admonition hint">
<p class="first admonition-title">Hinweis</p>
<p class="last">Stell sicher das deine Hexagonfunktion die Schildkröte zu exakt derselben Position und Ausrichtung zurückkehren lässt bevor es das Hexagon gemalt hat. Das macht es einfacher darüber nachzudenken.</p>
</div>
</div>
<div class="solution section" id="id2">
<h3>Lösung<a class="headerlink" href="#id2" title="Link zu dieser Überschrift">¶</a></h3>
<div class="highlight-python"><div class="highlight"><pre><span class="k">def</span> <span class="nf">hexagon</span><span class="p">():</span>
<span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">6</span><span class="p">):</span>
<span class="n">turtle</span><span class="o">.</span><span class="n">forward</span><span class="p">(</span><span class="mi">100</span><span class="p">)</span>
<span class="n">turtle</span><span class="o">.</span><span class="n">left</span><span class="p">(</span><span class="mi">60</span><span class="p">)</span>
<span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span> <span class="p">(</span><span class="mi">6</span><span class="p">):</span>
<span class="n">hexagon</span><span class="p">()</span>
<span class="n">turtle</span><span class="o">.</span><span class="n">forward</span><span class="p">(</span><span class="mi">100</span><span class="p">)</span>
<span class="n">turtle</span><span class="o">.</span><span class="n">right</span><span class="p">(</span><span class="mi">60</span><span class="p">)</span>
</pre></div>
</div>
<p>Du könntest auch die Befehle <code class="docutils literal"><span class="pre">turtle.forward(100);</span> <span class="pre">turtle.right(60)</span></code> in die Funktion stellen, aber in diesem Fall solltest Du die Funktion besser nicht <code class="docutils literal"><span class="pre">hexagon</span></code> nennen. Das wäre irreführend, da die Funktion dann nicht nur ein Sechseck zeichnen, sondern auch zur Position der nächsten Wabe vorrücken würde. Fall Du später die Funktion hexgon ausserhalb des Wabenprogramms verwenden möchtest wäre diese Namensgebung verwirrend.</p>
</div>
</div>
</div>
</div>
</div>
</div>
<footer class="footer">
<div class="container">
<p class="pull-right">
<a href="#">Back to top</a>
<br/>
<ul id="sourcelink" class="list-inline">
<li>
<a href="https://github.com/opentechschool/python-beginners/edit/master/source/functions.rst" title="functions.rst">
Edit on Github
</a>
</li>
<li>
<a href="https://github.com/OpenTechSchool/python-beginners/issues/new?title=Problem+with+functions">
Report a problem
</a>
</li>
</ul>
</p>
<p>
© <a href="copyright.html">Copyright</a> 2012–2014, OpenTechSchool and contributors.<br/>
Mit <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.1 erstellt.<br/>
</p>
</div>
</footer>
</body>
</html>