@__blackjack__, @Sirius3,
Es ist doch offensichtlich das man heute nicht mehr so programmiert. Das habt ihr jetzt schon oft genug runtergebetet.
Man entwickelt ja auch keine Software in Scratch und trotzdem wird es in Schulen eingesetzt.
Man ist so sehr an den vollen Sprachumfang von Python gewöhnt, dass man es sich gar nicht mehr vorstellen kann, mit wenig anzufangen und dabei trotzdem ein ansprechendes Ergebnis zu erhalten.
Man muss das ja auch Schritt für Schritt aufbauen.
Du kannst doch einem 9. Klässler nicht sagen: "So, als Hausaufgabe für morgen schaut ihr euch mal itertools an. Damit werden wir nächste Stunde arbeiten"
Ich würde gerne mal ein Beispiel sehen wie ihr so ein Programm für Schüler aus der 9. Klasse, die noch nie in ihrem Leben etwas in (Python) programmiert haben, aufbaut.
Also, ich fand es schon schwer mit einem möglichst geringen Sprachumfang sowas zusammen zu bauen.
"Begrifferaten" / "Glücksrad" Leerzeichen des Strings
@rogerb Niemand redet von itertools. Das ist ein Modul mit Funktionen hoeherer Ordnung, das halte ich auch nicht fuer ein Anfaengerthema.
Aber wo steht geschrieben, dass
einfacher waere, als folgendes:
Und darum geht es hier. Warum sollte "for x in etwas holt alles an Elementen aus etwas raus, und im Koerper der Schleife koennt ihr dann was mit x machen" ein so fundamental schwierigeres Konzept zu verstehen sein als "Ihr muesst Indizes generieren, von 0 bis zu einem weniger als der Laenge von einer Liste von Dingen, weil ab 0 geht's los, und n - 1 ist ja dann schon n Elemente, und dann holt man das n-te Element mit dinge[ i] raus"?
Aber wo steht geschrieben, dass
Code: Alles auswählen
dinge = ["iPhone", "Maske", "Unterhose"]
for i in range(len(dinge)):
print("Unbeding mitnehmen:", dinge[i])
Code: Alles auswählen
dinge = ["iPhone", "Maske", "Unterhose"]
for ding in dinge:
print("Unbeding mitnehmen:", ding)
@__deets__,
Ich kenne itertools und arbeite damit täglich.
Ich finde das Thema interessant, aber es ist ermüdend, wann immer wieder von vorne anfangen muss ...
Ich glaube du hast da was im lezten Post von __blackjack__ überlesen.@rogerb Niemand redet von itertools
Ich kenne itertools und arbeite damit täglich.
Nein, es geht um Situationen, in denen man mit solchen simplen iterationen nicht weiter kommt und wie man 9. Klässlern das Programmieren beibringt.Und darum geht es hier
Ich finde das Thema interessant, aber es ist ermüdend, wann immer wieder von vorne anfangen muss ...
@rogerb: ich habe tatsaechlich ueberlesen, dass __blackjack__ itertools erwaehnt, und mich auf seinen ersten Absatz bezogen. Und den teile ich. Funktionale Programmierung ... geht so. Bin ich mir nicht sicher. Und natuerlich glaube ich, dass *DU* itertools verstehst. Aber wir sind uns ja auch einig, dass du nicht der Massstab bist, in dieser Diskussion, oder?
Und ich bleibe dabei: ich kann kein Argument erkennen, warum ein 9.-Klaessler eine for-Schleife mit Index in irgendeiner Weise besser verstehen wuerde, als eine for-Schleife ueber eine Sequenz. Schon allein die Menge an Dingen, die man schreiben und irgendwie im Kopf haben muss, in meinen beiden Mini-Beispielen, ist signifikant mehr im Index-Beispie.
Aber selbst wenn man __blackjack__s itertools (oder vielleicht eher sowas wie zip und tuple-Unpacking zum zeitgleichen iterieren ueber zwei Listen nimmt): auch da bin ich ueberhaupt nicht ueberzeugt, dass das schwerer zu begreifen waere.
Auch random.choice(dinge) ist nicht schwerer als die vermeintlich so einfache Variante "zu Fuss" mit randint . Und das ist schon hoch! Klassisch eher int(random() * (laenge - 1)) oder schlimmeres. Das soll wirklich einfacher sein?
Ich glaube daher auch, dass die Anfaenger-Literatur daran krankt, dass diejenigen, die sie schreiben, *ihre* Anfaegerphasen, die im Zweifel 20-30 Jahre her sind, heranziehen. Aus einer fehlgeleiteten "so funktioniert die Maschine drunter, das muss man denen beibiegen, sonst lernen die nix"-Attituede vielleicht, oder auch einfach unreflektiert. Klar habe ich Assembler gelernt, quasi als erstes. Auch ohne for-schleifen, nur mit Decrement, Vergleich & Sprung, und das uebersetzt sich dann nett in ein C-for. Aber sowas benutzt man doch so gut wie nie mehr.
Und ich bleibe dabei: ich kann kein Argument erkennen, warum ein 9.-Klaessler eine for-Schleife mit Index in irgendeiner Weise besser verstehen wuerde, als eine for-Schleife ueber eine Sequenz. Schon allein die Menge an Dingen, die man schreiben und irgendwie im Kopf haben muss, in meinen beiden Mini-Beispielen, ist signifikant mehr im Index-Beispie.
Aber selbst wenn man __blackjack__s itertools (oder vielleicht eher sowas wie zip und tuple-Unpacking zum zeitgleichen iterieren ueber zwei Listen nimmt): auch da bin ich ueberhaupt nicht ueberzeugt, dass das schwerer zu begreifen waere.
Auch random.choice(dinge) ist nicht schwerer als die vermeintlich so einfache Variante "zu Fuss" mit randint . Und das ist schon hoch! Klassisch eher int(random() * (laenge - 1)) oder schlimmeres. Das soll wirklich einfacher sein?
Ich glaube daher auch, dass die Anfaenger-Literatur daran krankt, dass diejenigen, die sie schreiben, *ihre* Anfaegerphasen, die im Zweifel 20-30 Jahre her sind, heranziehen. Aus einer fehlgeleiteten "so funktioniert die Maschine drunter, das muss man denen beibiegen, sonst lernen die nix"-Attituede vielleicht, oder auch einfach unreflektiert. Klar habe ich Assembler gelernt, quasi als erstes. Auch ohne for-schleifen, nur mit Decrement, Vergleich & Sprung, und das uebersetzt sich dann nett in ein C-for. Aber sowas benutzt man doch so gut wie nie mehr.
Ja, also ich lasse mich da auch gerne überzeugen, zumal ich es als Strafe empfinden würde, wenn ich ausschließlich indexbasiert programmieren müsste.Und ich bleibe dabei: ich kann kein Argument erkennen, warum ein 9.-Klaessler eine for-Schleife mit Index in irgendeiner Weise besser verstehen wuerde, als eine for-Schleife ueber eine Sequenz. Schon allein die Menge an Dingen, die man schreiben und irgendwie im Kopf haben muss, in meinen beiden Mini-Beispielen, ist signifikant mehr im Index-Beispie.
random.choice()? Klar, keine Frage. Hatte ich ja auch verwendet.
Absolut!Ich glaube daher auch, dass die Anfaenger-Literatur daran krankt, dass diejenigen, die sie schreiben, *ihre* Anfaegerphasen, die im Zweifel 20-30 Jahre her sind, heranziehen. [...]
Aber wie ich schon sagte, wenn man sich dann mal hinsetzt und versucht die Aufgabe ohne die ganze Python-Magic zu lösen, wundert man sich, ich jedenfalls, wie schwer es sein kann.
Würde gerne mal eine verbesserte Version von euch sehen.
- __blackjack__
- User
- Beiträge: 14056
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@rogerb: Ein Versuch, wobei das als letzte ”Ausbaustufe” zu sehen ist:
Das Argument, dass die Kategorie-Auswahl vielleicht zu viel ist, würde ich mit dem Argument von Sirius3 kontern: Wenn das zu viel ist, dann muss das eben raus. Das ist ein nettes Extra, aber ist nicht die Grundfunktion von so einem Ratespiel.
Und man darf auch nicht nur das Endergebnis sehen, sondern muss auch einen Plan haben wie man das entwickelt. Man würde ja (wohl hoffentlich) als erstes mal ein festes Wort raten. Und das kann man dann auf ein zufällig ausgewähltes Wort erweitern. Und wenn das steht, dann käme ja erst eine Kategorie-Auswahl hinzu.
Das man statt eines einzelnen Buchstaben auch das ganze Wort zum Lösen eingeben kann, wäre vielleicht auch ein Extra, welches man in einem zusätzlichen Schritt einbauen (lassen) kann.
Man sollte bei der Planung auch im Auge behalten, dass man vielleicht nicht so weit kommt wie man geplant hat. Oder das einzelne Schüler nicht das komplette Programm schaffen. Auf der anderen Seite macht es sicher auch Sinn Schüler einzuplanen die weiter kommen, und für die etwas in der virtuellen Schublade zu haben. Zum Beispiel die Erweiterung um eine Kategorie-Auswahl.
Code: Alles auswählen
#!/usr/bin/env python3
import random
KATEGORIEN = [
("Berufe", ["Müller", "Becker", "Maler"]),
("Pflanzen", ["Baum", "Blume", "Busch"]),
("Tiere", ["Elefant", "Affe", "Giraffe"]),
]
def begriffe_auswaehlen():
while True:
for nummer, (kategorie, _) in enumerate(KATEGORIEN, 1):
print(f"{nummer}: {kategorie}")
try:
wahl = int(input(f"Wähle eine Kategorie 1-{len(KATEGORIEN)}: "))
except ValueError:
print("Bitte eine Zahl eingeben!")
else:
if 1 <= wahl <= len(KATEGORIEN):
_, begriffe = KATEGORIEN[wahl - 1]
return begriffe
print("Das war eine falsche Eingabe, bitte triff Deine Wahl erneut!")
def suchwort_ausgeben(suchwort, zu_ratene_zeichen):
print(
" ".join(
("_" if zeichen.lower() in zu_ratene_zeichen else zeichen)
for zeichen in suchwort
)
)
def main():
suchwort = random.choice(begriffe_auswaehlen())
zu_ratene_zeichen = set(suchwort.lower())
while zu_ratene_zeichen:
suchwort_ausgeben(suchwort, zu_ratene_zeichen)
antwort = (
input("Rate Buchstaben (oder ganzes Wort zum lösen): ")
.strip()
.lower()
)
if not antwort:
print("Bitte einen Buchstaben oder das Wort eingeben!")
elif len(antwort) == 1:
zu_ratene_zeichen.discard(antwort)
else:
if antwort == suchwort.lower():
break
print("Das ist nicht das gesuchte Wort.")
suchwort_ausgeben(suchwort, set())
print("Herzlichen Glückwunsch!")
if __name__ == "__main__":
main()
Und man darf auch nicht nur das Endergebnis sehen, sondern muss auch einen Plan haben wie man das entwickelt. Man würde ja (wohl hoffentlich) als erstes mal ein festes Wort raten. Und das kann man dann auf ein zufällig ausgewähltes Wort erweitern. Und wenn das steht, dann käme ja erst eine Kategorie-Auswahl hinzu.
Das man statt eines einzelnen Buchstaben auch das ganze Wort zum Lösen eingeben kann, wäre vielleicht auch ein Extra, welches man in einem zusätzlichen Schritt einbauen (lassen) kann.
Man sollte bei der Planung auch im Auge behalten, dass man vielleicht nicht so weit kommt wie man geplant hat. Oder das einzelne Schüler nicht das komplette Programm schaffen. Auf der anderen Seite macht es sicher auch Sinn Schüler einzuplanen die weiter kommen, und für die etwas in der virtuellen Schublade zu haben. Zum Beispiel die Erweiterung um eine Kategorie-Auswahl.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
@__blackjack__,
wir haben wahrscheinlich sehr unterschiedliche Vorstellungen was man Schülern in der 9. Klasse in wenigen Stunden beibringen kann.
Du must bedenken, dass du erstmal damit anfängst, zu erklären was eine Variable ist und was der Unterschied zwischen "1" und 1 ist.
Wobei ich deinen Kommentar zu "Wir lernen Python in 24h" voll unterstütze. Es braucht Zeit um programmieren zu lernen.
Aber da Lehrer selbst nicht entsprechend ausgebildet werden, und die Prioritäten anscheinend anderswo liegen, wird man mit den gegebenen Ressourcen auskommen müssen.
Ich hatte daher bei meinem Versuch bewusst die harte Anforderung von kalenderfamilys Beispiel übernommen, dass keine Tupel benutzt werden dürfen und eine Kategorie Auswahl im Programm sein müssen. Warum das so ist sei mal dahin gestellt.
Wenn du sagst, das was zu kompliziert ist, wird einfach weggelassen machst du es dir zu einfach.
Das ist ja genau das Dilemma eines Informatiklehrers, der ein halbwegs interessantes Projekt umsetzen möchte ohne dabei 90% der Klasse abzuhängen.
wir haben wahrscheinlich sehr unterschiedliche Vorstellungen was man Schülern in der 9. Klasse in wenigen Stunden beibringen kann.
Du must bedenken, dass du erstmal damit anfängst, zu erklären was eine Variable ist und was der Unterschied zwischen "1" und 1 ist.
Wobei ich deinen Kommentar zu "Wir lernen Python in 24h" voll unterstütze. Es braucht Zeit um programmieren zu lernen.
Aber da Lehrer selbst nicht entsprechend ausgebildet werden, und die Prioritäten anscheinend anderswo liegen, wird man mit den gegebenen Ressourcen auskommen müssen.
Ich hatte daher bei meinem Versuch bewusst die harte Anforderung von kalenderfamilys Beispiel übernommen, dass keine Tupel benutzt werden dürfen und eine Kategorie Auswahl im Programm sein müssen. Warum das so ist sei mal dahin gestellt.
Wenn du sagst, das was zu kompliziert ist, wird einfach weggelassen machst du es dir zu einfach.
Das ist ja genau das Dilemma eines Informatiklehrers, der ein halbwegs interessantes Projekt umsetzen möchte ohne dabei 90% der Klasse abzuhängen.
- __blackjack__
- User
- Beiträge: 14056
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@rogerb: Ich finde das ja auch zu viel und würde die Kategorien weg lassen beziehungsweise ist das ja das *letzte* was zum Programm hinzukommen würde und nicht das womit man die Entwicklung *anfangen* würde.
Und ich schrob ja auch: letzte ”Ausbaustufe”. Das muss alles nicht sofort genau so hingeschrieben werden, sondern wird ja in mehreren Zwischenschritten entwickelt.
Das mit den Tupeln: Ich sehe nicht warum Tupel nicht gehen wenn Listen gehen. Dann änder die Tupel meinetwegen in Listen um. Aber die Unterschiede Tupel/Liste und wann man was verwendet, sind ja nun wirklich schnell erklärt.
Was zu kompliziert ist weglassen ist nicht zu einfach sondern pragmatisch gesehen das einzige was man machen kann. Und bei dem letzten Extra-Zusatzschritt, der für das Programm nicht wirklich gebraucht wird, sondern nur die Kirsche auf der fertigen Torte ist, kann man IMHO auch einen Teil der Klasse abhängen. Muss man natürlich auch kommunizieren, dass das nicht schlimm ist, wenn das nicht jeder packt, weil das für die ist, die in der Richtung gerne weitergehen möchten.
Und ich schrob ja auch: letzte ”Ausbaustufe”. Das muss alles nicht sofort genau so hingeschrieben werden, sondern wird ja in mehreren Zwischenschritten entwickelt.
Das mit den Tupeln: Ich sehe nicht warum Tupel nicht gehen wenn Listen gehen. Dann änder die Tupel meinetwegen in Listen um. Aber die Unterschiede Tupel/Liste und wann man was verwendet, sind ja nun wirklich schnell erklärt.
Was zu kompliziert ist weglassen ist nicht zu einfach sondern pragmatisch gesehen das einzige was man machen kann. Und bei dem letzten Extra-Zusatzschritt, der für das Programm nicht wirklich gebraucht wird, sondern nur die Kirsche auf der fertigen Torte ist, kann man IMHO auch einen Teil der Klasse abhängen. Muss man natürlich auch kommunizieren, dass das nicht schlimm ist, wenn das nicht jeder packt, weil das für die ist, die in der Richtung gerne weitergehen möchten.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Was war denn eigentlich an meiner Version so schlecht? Ich habe es doch mit einfachen Mitteln umgesetzt. Tja, mit zwei indexbasierten Zugriffen.Was zu kompliziert ist weglassen ist nicht zu einfach sondern pragmatisch gesehen das einzige was man machen kann.
Aus didaktischen Gründen empfehle ich, das Programm viel kleinteiliger zu halten und die Kategorien fürs Erste zu vergessen. Sie verkomplizieren das Ganze unnötig und liefern im Endeffekt auch nur ein einzelnes Wort.
Die Programmschnippsel sollten so gestaltet sein, dass sie in einer Unterrichtseinheit erstellt werden können und spezielles Wissen vermitteln.
So reicht für den Anfang sicherlich
Und diese Funktion erweitert man dann peu à peu nach Bedürfnissen und Kenntnisstand. Damit das Spiel den Schüler*innen überhaupt Spaß macht, sollte natürlich auch schon eine Textdatei vorbereitet sein, die über 1000 Wörter enthält. So können die Schüler*innen lernen, wie sie diese Datei in ein passendes Format bringen.
Genauso geht man mit der Ausgabe vor, anfangs nur das Wort, dann wie oben schon gezeigt, das Wort mit Abständen, dann kommen die Platzhalter dazu. Hierbei könnt ihr überlegen, ob es für eure Zwecke gescheiter ist, der Funktion die schon geratenen oder die noch fehlenden Buchstaben mitzugeben.
Zu jeder Lehreinheit sollten verschiedene Aufgaben gestellt werden, die den unterschiedlichen Interessen und Fähigkeiten entsprechen. Bei den einen ist es notwendig, das Gelernte zu verfestigen, die anderen wollen neue Ideen ausprobieren.
Die Programmschnippsel sollten so gestaltet sein, dass sie in einer Unterrichtseinheit erstellt werden können und spezielles Wissen vermitteln.
So reicht für den Anfang sicherlich
Code: Alles auswählen
def hole_gesuchtes_wort():
gesuchtes_wort = "Supercalifragilisticexpialigetisch"
return gesuchtes_wort
Genauso geht man mit der Ausgabe vor, anfangs nur das Wort, dann wie oben schon gezeigt, das Wort mit Abständen, dann kommen die Platzhalter dazu. Hierbei könnt ihr überlegen, ob es für eure Zwecke gescheiter ist, der Funktion die schon geratenen oder die noch fehlenden Buchstaben mitzugeben.
Zu jeder Lehreinheit sollten verschiedene Aufgaben gestellt werden, die den unterschiedlichen Interessen und Fähigkeiten entsprechen. Bei den einen ist es notwendig, das Gelernte zu verfestigen, die anderen wollen neue Ideen ausprobieren.