| Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung |
| ef:loesungen_beispiele [2022/09/19 14:14] – [Aufgaben C] lehmannr | ef:loesungen_beispiele [2022/09/20 15:14] (aktuell) – lehmannr |
|---|
| - **Mutable** bedeutet veränderbar, **immutable** unveränderlich. In Python sind die einfachen Datentypen **immutable** (Zahlen, Boolean, Strings, Tuple) d.h. man kann sie nicht an Ort und Stelle ändern, sondern man kann sie nur überschreiben. Listen hingegen sind **mutable**: wenn ich eine Liste ''L1'' habe, dann kann ich dieser Liste Elemente hinzufügen oder Elemente ändern. | - **Mutable** bedeutet veränderbar, **immutable** unveränderlich. In Python sind die einfachen Datentypen **immutable** (Zahlen, Boolean, Strings, Tuple) d.h. man kann sie nicht an Ort und Stelle ändern, sondern man kann sie nur überschreiben. Listen hingegen sind **mutable**: wenn ich eine Liste ''L1'' habe, dann kann ich dieser Liste Elemente hinzufügen oder Elemente ändern. |
| - In Python sind alle Variablentypen (Zahlen, Zeichenketten, Boolean, Listen, etc.) Referenztypen, d.h. der Parametervariablen einer Funktion wird immer die Referenz übergeben. D.h. eigentlich müsste dann die aufrufende Variable jeweils ändern, wenn in einer Funktion die Parametervariable geändert wird, doch da die Grundtypen **immutable sind und nicht geändert werden können, verhalten sie sich im Prinzip wie ''call by value''. Listen hingegen (oder Objekte, wie wir später sehen werden) können hingegen an Ort geändert werden, deshalb verhalten sie sich wie das Konzept ''call by reference''. | - In Python sind alle Variablentypen (Zahlen, Zeichenketten, Boolean, Listen, etc.) Referenztypen, d.h. der Parametervariablen einer Funktion wird immer die Referenz übergeben. D.h. eigentlich müsste dann die aufrufende Variable jeweils ändern, wenn in einer Funktion die Parametervariable geändert wird, doch da die Grundtypen **immutable sind und nicht geändert werden können, verhalten sie sich im Prinzip wie ''call by value''. Listen hingegen (oder Objekte, wie wir später sehen werden) können hingegen an Ort geändert werden, deshalb verhalten sie sich wie das Konzept ''call by reference''. |
| | |
| | ==== Aufgaben D ==== |
| | - Zunächst wird eine Funktion mit zwei Parametern definiert (''change_value(list1, list2)''). Beim Parameter ''list1'' wird das dritte Element ''list1[2]'' auf 5 gesetzt: dies geschieht an Ort. Bei ''list2'' wird hingegen ein neues Listenobjekt erzeugt und ''list2'' zeigt dann auf dieses neue Objekt. \\ Nun werden zwei Listen definiert ''l1'' und ''l2''. \\ Die Funktion ''change_value'' wird aufgerufen mit den beiden definierten Listen ''l1'' und ''l2'': da alle Variablen in Python Referenztypen sind, werden die Adressen (Referenzen), welche zu ''l1'' und ''l2'' zeigen, übergeben \\ ''list1'' zeigt nun auf dieselbe Adresse wie ''l1'' und ''list2'' auf dieselbe wie ''l2''. Da nun ''list1'' an Ort und Stelle geändert wird, verändert sich auch ''l1''. Da aber ''list2'' einem neuen Listenobjekt ''[6,10]'' zugewiesen wird, wird ''l2'' nicht verändert. |
| | - Am Schluss werden ''l1'' und ''l2'' ausgegeben: ''l1=[1,2,5,4]'' bzw. ''[l2=10,11,12]'' |
| | |
| | ==== Aufgaben E ==== |
| | <sxh python> |
| | |
| | Materialien = [RED_SANDSTONE, GRASS, WOOL, DIAMOND_BLOCK, GOLD_BLOCK] |
| | |
| | for i in [0,1,2,3,4]: # besser: for i in range(5), i läuft von 0 bis 4 |
| | agent.set_item(Materialien[i], 1, i+1) |
| | |
| | for i in range(1,6): # hier läuft i von 1 bis 5 |
| | agent.set_slot(i) |
| | agent.place(BACK) |
| | agent.move(FORWARD,1) |
| | </sxh> |
| | |
| | ==== Aufgaben F ==== |
| | <sxh python> |
| | l1 = range(9) # => [0,1,2,3,4,5,6,7,8] |
| | l2 = range(0,20,3) # => [0,3,6,9,12,15,18] |
| | l3 = range(20,40,4) # => [20,24,28,32,36] |
| | |
| | player.say(l1) |
| | player.say(l2) |
| | player.say(l3) |
| | </sxh> |
| | |
| | ==== Aufgaben G ==== |
| | === Linie Duo mit dem Agenten === |
| | |
| | <sxh python> |
| | def linie_duo(n, mat1, mat2): |
| | agent.set_item(mat1, 1, 1) |
| | agent.set_item(mat2, 1, 2) |
| | for i in range(n): |
| | agent.set_slot(1) |
| | agent.move(FORWARD,1) |
| | agent.place(BACK) |
| | agent.set_slot(2) |
| | agent.move(FORWARD,1) |
| | agent.place(BACK) |
| | |
| | linie_duo(5, GOLD_BLOCK,GRASS) |
| | </sxh> |
| | |
| | === linie_duo ohne den Agenten === |
| | <sxh python> |
| | def linie_duo_neu(n, mat1, mat2): |
| | for i in range(3,n+4,2): |
| | blocks.place(mat1, pos(i,0,0)) |
| | blocks.place(mat2, pos(i+1,0,0)) |
| | |
| | linie_duo_neu(10, GOLD_BLOCK, DIAMOND_BLOCK) |
| | </sxh> |
| | === linie_duo mit modulo und einem einfachen range-Befehl === |
| | <sxh python> |
| | def linie_duo_neu2(n, mat1, mat2): |
| | for i in range(3,n+5,1): |
| | if (i%2==0): |
| | blocks.place(mat1, pos(i,0,0)) |
| | else: |
| | blocks.place(mat2, pos(i,0,0)) |
| | |
| | linie_duo_neu2(10,GOLD_BLOCK,CYAN_WOOL) |
| | </sxh> |