"Begrifferaten" / "Glücksrad" Leerzeichen des Strings

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
kalenderfamily
User
Beiträge: 23
Registriert: Freitag 18. Juni 2021, 12:30

Hallo an alle,

ich versuche mich gerade an einem kleinen Spiel, das eine Art Begrifferaten/ Glücksrad werden soll.

Konkret geht es mir darum, ob man aus der Länge des Strings das daras generierte Feld (_ _ _ _ ) auch "einfacher" generieren kann. Den Code habe ich mal angehängt, ist aber natürlich noch nicht final...

Ganz unten in fett! Grüße

Code: Alles auswählen

import random


#def drehen():

def raten():

    input("Bitte gib einen Buchstaben ein")


#def gesucht():

#
# Sollte in eine Funktion gepackt werden!!
#

# dazugehoerige Kategorie !! muss entsprechend unter dem passenden Wort stehen!

suchkategorie = ["Automarke", "Sprache", "Gericht", "Land", "Religion"]

# Suchwoerter 

suchwort = ["Mercedes","Spanisch","Döner","Marokko","Christentum"]

# Zufallszahl generieren, Wert muss Anzahl der suchwoerter entsprechen
# da Kategorie an selber Stelle wie suchwort braucht man nur einen Zufallswert..

zufallsfeld = random.randint(0,4)

print("Ein Wort dieser Kategorie wird gesucht:", suchkategorie[zufallsfeld])

# kann auskommentiert werden
print(suchwort[zufallsfeld])
print(len(suchwort[zufallsfeld]))
leerzeichen = int(len(suchwort[zufallsfeld]))
# 


# suchfeld startwert
suchfeld = ""

for each in range(leerzeichen):
  suchfeld = suchfeld + '_ '

print(suchfeld)

raten()
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Eingerückt wird immer mit 4 Leerzeichen pro Ebene, nicht 2.
Wenn Du ein zufälliges Element aus einer Liste willst, benutze random.choice, ein random.randint mit hart kodierter Länge ist nicht so gut.

Dass Du zwei Listen hast, wo die Elemente an der jeweiligen Stelle zusammengehören ist nicht so gut, statt dessen nimmt man eine Liste mit Tuplen.

Die Funktion `raten` macht noch nichts sinvolles.
Statt Strings in einer Schleife per + zusammenzubauen, benutzt man hier `" ".join`. Dann hast Du auch am Ende des Strings kein überflüssiges Leerzeichen.

Code: Alles auswählen

import random

auswahl = [
    ('Automarke', 'Mercedes'),
    ('Sprache', 'Spanisch'),
    ('Gericht', 'Döner'),
    ('Land', 'Marokko'),
    ('Religion', 'Christentum')
]

kategorie, wort = random.choice(auswahl)
print("Ein Wort dieser Kategorie wird gesucht:", kategorie)
suchfeld = ' '.join('_' * len(wort))
print(suchfeld)
kalenderfamily
User
Beiträge: 23
Registriert: Freitag 18. Juni 2021, 12:30

Vielen Dank! Das mit 4 habe ich danach zufällig auch gelesen. An der Funktion raten hänge ich gerade :-P...habe da ein Problem mit dem Listenobjekt, mal sehen , ob ich das hinbekomme...

Ah, ok, verstehe, das mit den Tuplen macht auf jeden Fall Sinn, beschäftige mich noch nicht so lange mit Python und wollte es mit "Basics" umsetzen.

Das mit dem Leerzeichen am Ende ist mir noch gar nicht aufgefallen, wäre dann aber bestimmt zum Schluss aufgefallen und ich hätte es dann wahrscheinlich abgeschnitten ...

Das zu wissen ist natürlich super, jetzt überlege ich, ob ich das noch irgendwie reinbekomme. Zielgruppe ist 9te Klasse Realschule (nicht Gymnasium) - habe es an anderer Stelle hier im Forum schonmal gesagt - mit 45 Min / Woche..

Wäre das jetzt grober Murks es so zu machen, wie ich es gemacht habe (außer join)?

Habe nächste Woche einen Termin an der Uni mit dem FB Informatik, da spreche ich das auf jeden Fall auch mal an (Menge, Anforderungen später)
kalenderfamily
User
Beiträge: 23
Registriert: Freitag 18. Juni 2021, 12:30

Tatsächlich habe ich jetzt ein Problem mit der Funktion raten()

Ich habe das Listenobjekt

Code: Alles auswählen

suchwort([zufallsfeld])
und möchte schauen, ob der eingegeben Buchstabe darin enthalten ist.

Um String Operationen durchführen zu können, muss ich das Objekt also in einen String konvertieren. An anderer Stelle habe ich gelesen, dass ich das mit str() machen könnte, es funktioniert aber nicht, ich erhalte die Meldung

File "main.py", line 27, in raten
ergebnis = str(suchwort([zufallsfeld]))
TypeError: 'list' object is not callable

Code: Alles auswählen

def raten():

  
 buchstabe = input(str("Bitte gib einen Buchstaben ein"))
# konvertiere
 ergebnis = str(suchwort([zufallsfeld]))
 resultat = ergebnis.find(buchstabe)
  
 print("Buchstabe ist enthalten", buchstabe)
Muss/kann ich ein einzelnes Listenobjekt (also einen Eintrag einer Liste) auch mit einer for Schleife auf eine Übereinstimmung an einer bestimmten Stelle überprüfen?

Hat jemand einen Tip für mich?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Code: Alles auswählen

suchwort([zufallsfeld])
ist kein Listenobjekt. suchwort ist ein Listenobjekt. Was auch immer zufallsfeld ist, weiss keiner, weil du es nicht zeigst. Und du behandelst suchwort als ob es eine Funktion waere. Ist es aber nicht, du sagst ja selbst, es ist eine Liste. Und das erzaehlt dir auch Python: man kann eine Liste eben nicht wie eine aufrufbare Funktion benutzen.
Benutzeravatar
__blackjack__
User
Beiträge: 14056
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@kalenderfamily: `str()` mit einer literalen Zeichenkette als Argument aufzurufen macht keinen Sinn. Das ist bereits eine Zeichenkette — was denkst Du denn was ein Aufruf von `str()` da bewirken soll?

`find()` würde ich nicht verwenden. Das gibt einen besonderen Wert der aber immer noch ein legaler Index ist. Man muss da also immer aufpassen, dass man das nicht als Index verwendet ohne zu prüfen ob es der Sonderwert ist. `index()` löst in dem Fall eine Ausnahme aus die man nicht mit einem Index verwechseln kann.

Wenn man nur wissen will ob etwas enthalten ist, dann ist das weder `find()` noch `index()` sondern der ``in``-Operator.

Code: Alles auswählen

In [46]: "x" in "hallo"                                                         
Out[46]: False

In [47]: "a" in "hallo"                                                         
Out[47]: True
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
kalenderfamily
User
Beiträge: 23
Registriert: Freitag 18. Juni 2021, 12:30

Aufgrund der Fehlermeldung wollte ich das Listenobjekt (so wie es Python eben anzeigt) in einen String wandeln, natürlich ist im Listenobjekt ein String enthalten. Hier der Code (ohne die bereits weiter oben genannten Verbesserungen):

Code: Alles auswählen

import random


def drehen():

# bestimmt den Drehwert per Zufall

 dreh = random.randint(0,3)

 drehwert = ['100', '200','400','800']

 print("Dein Spielwert ist: EUR", drehwert[dreh])


def raten():

  
 # Achtung! suchwort[zufallsfeld]) ist ein Listenobjekt!
 # konvertiere zu String, für Stringoperation
 # eventuell schon am Anfang konvertieren, dann entfällt hier
  
 buchstabe = input(str("Bitte gib einen Buchstaben ein"))

  
  #ergebnis = join(suchwort([zufallsfeld]))
 #ergebnis = string.join(suchwort([zufallsfeld]))
 ergebnis = str(suchwort([zufallsfeld]))
 resultat = ergebnis.find(buchstabe)
  
 print("Buchstabe ist enthalten", buchstabe)
  
    # if buchstabe in suchwort([zufallsfeld]):
    #print("Buchstabe ist enthalten")
  


#def gesucht():

#
# Sollte in eine Funktion gepackt werden!!
#

# dazugehoerige Kategorie !! muss entsprechend unter dem passenden Wort stehen!

suchkategorie = ["Automarke", "Sprache", "Gericht", "Land", "Religion"]

# Suchwoerter 

suchwort = ["Mercedes","Spanisch","Döner","Marokko","Christentum"]

# Zufallszahl generieren, Wert muss Anzahl der suchwoerter entsprechen
# da Kategorie an selber Stelle wie suchwort braucht man nur einen Zufallswert..

zufallsfeld = random.randint(0,4)

print("Ein Wort dieser Kategorie wird gesucht:", suchkategorie[zufallsfeld])

# kann auskommentiert werden
print(suchwort[zufallsfeld])

print(len(suchwort[zufallsfeld]))

leerzeichen = int(len(suchwort[zufallsfeld]))
# 


# suchfeld startwert
suchfeld = ""

for each in range(leerzeichen):
  suchfeld = suchfeld + '_ '

print(suchfeld)

drehen()
raten()
Benutzeravatar
__blackjack__
User
Beiträge: 14056
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@kalenderfamily: Man wandelt keine Listen in eine Zeichenkettendarstellung um um darauf dann Zeichenkettenoperationen durchzuführen.

Allerdings stimmt es auch gar nicht das Du das `str()` auf eine Liste anwendest. Es wäre wenn es syntaktisch richtig wäre nämlich auch wieder eine Zeichenkette mit der `str` aufgerufen würde, also vollkommen unsinnig weil eine Zeichenkette dadurch nicht irgendwie noch zeichenkettiger wird oder so.

Du solltest auch gar nicht mit so kaputten ”Funktionen” anfangen. Das sind nämlich keine. Funktionen sind dazu da um in sich geschlossene Einheiten zu bilden, mit einer klaren Schnittstelle wo Werte als Argumente rein gehen und als Rückgabewerte raus. Die sind nicht einfach nur ein Name für einen Codeabschnitt als ”Sprungmarke” wo der Code dann wild auf irgendwelche Namen ausserhalb der Funktion zugreift die keine Konstanten sind.

Als erstes muss dazu mal das Hauptprogramm in einer Funktion verschwinden, damit das nicht mal aus versehen passieren kann.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Fang erst gar nicht an, so Kraut und Rüben zu programmieren. Das erst, was man beim Programmieren lernen muß, ist, dass man sorgfältig arbeitet. Genauso wie man beim Schreiben lernen, von anfang an übt, die Buchstaben auf eine Linie zu setzen. Eingerückt wird immer mit 4 Leerzeichen pro Ebene, und Leerzeilen werden sparsam eingesetzt, um die Lesbarkeit zu erhöhen. Bei Dir sorgen sie für das Gegenteil.
Bevor Du hier weiter machst, wende erst einmal das hier gesagte an.
kalenderfamily
User
Beiträge: 23
Registriert: Freitag 18. Juni 2021, 12:30

Danke für die tollen Tipps! Den Fehler habe ich mittlerweile gefunden, es war eine Klammer zuviel (hoffe ich zumindest)...

Ich verkneife mir jetzt mal die Orthographiefehler (Groß-Kleinschreibung, Kommasetzung) in den Antworten aufzuzeigen....ehrlicherweise ist es in meinen Augen schlechter Stil, einerseits auf Genauigkeit zu pochen (Achtung: hier fragen Leute nach Rat! ), diese andererseits selbst aber in den Antworten nicht an den Tag legen zu können. Warum wohl frage ich hier? Sicher nicht, weil ich ein Experte bin!

Wenn das ausschließlich ein Forum für "Experten" ist, dann kennzeichnet das doch auch so! Als ich diesen offenen Brief an Schüler und Studenten und teilweise die Antworten zu Problemen, die hier vorgebracht werden, gelesen habe, musste ich mir wirklich an den Kopf fassen....wenn es jemandem zu blöd ist, kann er es ja lassen..... Ich dachte eigentlich, dass es hier darum geht, Leute für Python zu begeistern?

Bisher habe ich hier wenig Konstruktives gelesen - aber das, was konstruktiv war - hat mich tatsächlich weitergebracht.

Das ist mein offener Brief!
Benutzeravatar
__blackjack__
User
Beiträge: 14056
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@kalenderfamily: Ich kann keine Kommasetzung. Will ich aber auch gar nicht. Wenn ich in einem Rechtschreibforum danach frage was einem gegeben Text von mir falsch ist, dann würde ich mich aber nicht beschweren wenn da jemand die Kommasetzung anspricht.

Das mit der Genauigkeit ist in den Prosatexten in der Regel auch nicht so wichtig. Den lesen Menschen, und die verstehen den in der Regel. Bei Code ist das Zielpublikum auch der Compiler, und der denkt kein Stück über die Bedeutung dessen nach, was er da liest. Der macht ganz stur das was da steht. Wenn man ein Komma vergisst, kann der Leser in der Regel verstehen was gemeint ist. Selbst in Fällen wo streng genommen eine Mehrdeutigkeit entsteht, geht das mit Kontext in der Regel gut. Bei einer vergessenen Klammer sagt der Compiler einfach „Häh?“ und streikt. Das „Häh?“ kommt nicht mal direkt an der Stelle wo die Klammer fehlt, sondern erst an der Stelle wo er sicher ist, dass das mit der Grammatik kein gültiges Programm mehr ist.

Du fragst hier weil Du kein Experte bist. Wir antworten mit relativ vielen Punkten weil Du kein Experte bist. Wie soll sich das sonst ändern, wenn man nichts ansprechen darf?

Was mich hier ein bisschen erschreckt, ist dass Du das nicht nur für Dich lernst, sondern anscheinend in absehbarer Zeit Schülern Programmieren beibringen willst/sollst. Ich muss da spontan an diesen Text von Peter Norvig denken: https://www.norvig.com/21-days.html (Es gibt dort auch einen Link auf eine deutsche Übersetzung). Und finde irgendwie das der Lehrer das können sollte was er vermittelt.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
kalenderfamily
User
Beiträge: 23
Registriert: Freitag 18. Juni 2021, 12:30

Dadurch, dass der Compiler meckert, wird ja der Fehler gelöst, sehe ich in Orthographie eher nicht, denn wohl kaum ein Leser fragt den Autor.

Ich habe gegen das Ansprechen nichts - allerdings muss man den Kontext sehen: 45 Min/Woche, dazu weitere Themen. Gut, kann ich zukünftig vermerken... Also versuche ich, etwas möglichst niederschwellig zu bewerkstelligen - das ist alles. Man würde also Grob- von Feinform unterscheiden, deswegen fragte ich eingangs, ob man beispielsweise das Zufallswort einer Kategorie per randint generieren kann oder ob das Murks ist. Darauf die Antwort, dass Tuples besser wären. Ist völlig in Ordnung, kann ich aber zeitlich nicht umsetzen, geht einfach nicht.

Ich erinnere mich an eine Frage hier, in etwa:"Ich bin Anfänger, was kann ich machen?" Antwort sinngemäß: "Suche dir ein Projekt, es werden Probleme auftreten, die musst du lösen." Noch besser ist ja immer: "einlesen"....musste ich mir an den Kopf fassen! Wie blöd ist das denn: es fragt jemand und erhält eigentlich gar keine Antwort! Es geht hier doch gar nicht darum, etwas für jemanden zu coden - da bin ich d'accord, aber es gibt eine Fülle von Methoden etc., dass man da nicht gleich den Überblick hat, muss doch einleuchten.

Bestätigt sehe ich das bisher Gesagte übrigens in der "Sorge": Wieso wohl frage ich hier?...genau, weil ich kein Programmierer bin und ich mir Python aneigne. Übrigens auch geil: jemand, der engagiert ist, bekommt noch gesagt, er müsse es besser können - das ist mega! Man ist besorgt, weil ein Lehrer fragt, weil er es nicht kann?!? Wie geil ist das denn!...
Darfst ruhig besorgt sein, ich wäre an deiner Stelle um alle die besorgt, die sich nicht informieren und nicht engagieren.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du hast doch bereits festgestellt, dass wir zwar Experten fuer Python sind. Aber nicht notwendigerweise fuer alles andere. Unter anderem nicht fuer Didaktik in der Realschule. Das solltest hoffentlich du sein. Dein ewiges darauf rumgereite, dass es "45 min/Woche, REALSCHULE!!!!!!1!!" ist, bringt also nix.

Auch ist es ueblicherweise so, dass jemand, der anderen etwas beibringen soll oder will, das selbst beherrschen muss. Und zwar ein gutes Stueck *besser* als derjenige, dem etwas vermittelt werden soll. Wenn es dir also unzumutbar ist, Python so gut zu lernen, das du auch in die zweite Stunde kommst, ohne bei einer Nachfrage oder einem trivialen Problem gleich ins schwimmen zu kommen, dann wird's halt nix. Das ist bedauerlich fuer deine Schueler, deine Schule, vielleicht sogar fuer dich. Du scheinst aber zu glauben, weil deine Schueler nur 45 Minuten die Woche eruebrigen sollen, wuerde das fuer dich auch funktionieren. Wird nichts draus.

Das du dich selbst als "engagiert" bezeichnist, ist, um meine Mutter zu zitieren, "zum schiessen". Wenn Engagement so aussieht, dass jemand Absichtserklaerungen und flotte Sprueche raushaut, aber dann von anderen einfordert, sie sollen gefaelligst haarklein alles vorkauen, und ein Curriculum fuer den gemeinen Realschueler auf die Beine stellen - in ihrer unbezahlten Freizeit, selbstverstaendlich - und veraergert mit dem Fuss aufstampft, wenn das nicht passiert - dann nennt man das nicht Engagement, sonder Anmassung.

Mein offener Brief...
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Du als Lehrer mußt natürlich alles 120% korrekt machen, auch wenn es bei Deine Schüler nicht erwartet werden kann. Dazu gehört es, dass Du Dich an die Konventionen hältst und als gutes Beispiel voran gehst und saubere Variablennamen benutzt.
Du bist hoffentlich älter als 13 Jahren und kannst zwischen fachlicher Kritik und persönlichen Angriffen unterscheiden.

Wenn es für Dich (und angeblich für Deine Schüler) zu kompliziert ist, mit Tupeln zu arbeiten, dann mußt Du Dein Programm entsprechend vereinfachen, heißt hier konkret, die Kategorie macht das Programm zu komplex, lass sie weg, und wähle aus der fixen Kategorie Sprachen fünf verschiedene Sprachen aus, und schon brauchst Du keine Tuple mehr.
Benutzeravatar
__blackjack__
User
Beiträge: 14056
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@kalenderfamily: Wobei man Tupel können muss. Sequenztypen sind Grundlagen. Wenn man sagt Tupel sind zu kompliziert, dann sind auch Listen zu kompliziert. Oder andersherum: wenn Listen verwendet/gelehrt werden können, dann sind Tupel auch kein Problem. Und ohne Sequenztypen kommt man nicht aus.

Der Tipp mit dem Projekt suchen und an den auftretenden Problemen zu wachsen ist ein üblicher. Also in Themen einarbeiten und bei konkreten Problemen nachfragen und/oder fertigen Quelltext zum Review stellen. Das sagen auch Leute, die sich im Gegensatz zu den meisten Antwortenden hier, mit Didaktik und Lehre auskennen. Der verlinkte Peter Norvig beispielsweise, auch in genau dem Essay. Warum fasst Du Dir da an den Kopf? Wichtig ist bei so etwas auch, dass das Projekt den fragenden *interessiert* und da kann man halt schlecht sagen, schreib einen Raytracer, eine Adressverwaltung, ein Ratespiel, eine Dart-Ligaverwaltung, oder irgend was anderes konkretes, weil ein Projekt, das inhaltlich total uninteressant für den Lernenden ist, ein Hindernis statt eine Hilfe ist. Das demotiviert sehr schnell wenn Probleme und Frust auftreten. Und es *werden* Probleme und Frust auftreten.

Zum Engagement: Ich sage nicht Du müsstest das jetzt schon besser können, ich sage Du musst das deutlich besser können bevor Du das anderen sinnvoll beibringen kannst. Die Sorge ist nicht, dass Du das grundsätzlich nicht schaffen könntest, sondern dass ich den Zeitrahmen dafür zu eng sehe. Weil ich schon programmieren kann, und aus eigener direkter Erfahrung und Beobachtung weiss, dass das nicht so schnell geht, und dass es nicht nur ein bisschen Syntax lernen und zwei, drei Tutorials durcharbeiten ist. Essays wie das von Peter Norvig bestätigen mich darin.

Viele Anfänger-Tutorials und -Bücher gehen nur die Syntax und ein paar wenige Grundlagen durch. Wenige gehen tiefer darauf ein wie man Programme strukturiert, oder auch nur wie man gute Namen wählt. Wie man wart- und testbaren Code schreibt. Wie man testet und Fehler sucht.

Ich würde sagen ein Lehrer müsste mindestens das Python-Tutorial durchgearbeitet haben. Selbst wenn man Klassen für die Zielgruppe nicht braucht, sind die für das Verständnis der Sprache wichtig, denn auch wenn man selber keine schreibt, so ist ja jeder Datentyp in Python eine Klasse. Dann sollten die Konventionen aus PEP 8 bekannt sein, und man sollte sich da möglichst dran halten. Automatisierte Tests/Unit-Tests sollten zum Werkzeugkasten gehören. Am einfachsten mit ``pytest``, das erlaubt es einfacher Tests zu schreiben als das `unittest`-Modul aus der Standardbibliothek. Tests helfen auch beim schreiben von gutem Code, weil man damit ”Druck” hat einfach testbaren Code zu schreiben, also sinnvolle Schnittstellen und ”Unit”-Grössen zu wählen. Allgemeinere, sprachunabhängige Literatur wie „Weniger schlecht Programmieren“ von Kathrin Passig oder „Code Craft“ von Pete Goodliffe oder etwas vergleichbares sollte bekannt sein. Allerdings mit der notwendigen Erfahrung das auch auf eine konkrete Sprache und deren idiomatische Verwendung anzupassen, denn nicht alles gilt für alle Programmiersprachen gleich (stark).
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

"Suche dir ein Projekt, es werden Probleme auftreten, die musst du lösen."
Ja, so etwas hatte ich kürzlich auch mal hier geschrieben. Da darf ich mich dann vielleicht auch nochmal einmischen...
@kalenderfamily, ich weiß nicht in welchem Kontext du es gelesen hattest. Ich kann nur sagen, dass das genau die Art und Weise ist, wie ich auch heute noch täglich lerne.
Dazu kommen natürlich die Aufgaben, die einem das tägliche Leben stellt. Aber gerade die Herausforderungen, die man sich selber stellt sind doch oft die, die einen am meisten motivieren.
Dabei merkt man dann erst, wo man noch Schwächen hat. Dafür muss man dann auch mal um Rat fragen und Lesen und - ja, es sich erarbeiten.
Ich denke das ist eigentlich offensichtlich und du hast es nur falsch verstanden.

Und ja, der Ton hier ist manchmal zu rau und unpassend. Da hast du völlig Recht und das hat mich auch schon öfters "gewundert". Aber das dürfte in vielen Foren, bedingt durch die Anonymität, so sein.
Man darf auch nicht vergessen, dass die Forumsveteranen hier 7 Tage die Woche fast stündlich exzellente Ratschläge geben -und das über Jahre!
Ohne das gäbe es kein Deutsches Python-Forum, jedenfalls nicht in der Qualität.
... jemand, der engagiert ist, ...
Ja, das bist du sicher. Ich finde es gut, dass du dir die Mühe machst, deinen Schülern in der gegebenen Zeit wenigsten etwas beizubringen.

Was ich nicht verstehe, und was mich manchmal so richtig ärgert, ist, dass es im Deutschen Schulsystem anscheinen nicht möglich ist, die Lehrer mit anständigem Lehrmaterial zu versorgen und ordentlich zu schulen.
Ich kann es einfach nicht verstehen! Hier wird die zukünftige Generation tatsächlich vernachlässigt. Wo ist die Greta Thunberg der Informatik die sagt: "How dare you...?"
Dafür kannst du nichts, und wie gesagt, ich schätze deinen Einsatz!

So, ich habe mich mal als "Experte" für Programmieraugaben der 9. Klasse versucht.

Anmerkung: So programmiert man eigentlich nicht, da Python einem viel mächtigere Werkzeuge zur Verfügung stellt.
Das kann man aber nicht von heute auf morgen lernen und irgendwo muss man ja auch mal anfangen.

Auf dem Lehrplan stehen:
- Texteingabe
- Textausgabe
- verschiedene Zeichenkettenoperationen
- While-Schleifen
- For-Schleifen
- Funktionen (mit und ohne Eingangsparameter, mit und ohne Rückgabeparameter)
- Verzweigungen
- Zufallsfunktionen

Eigentlich schon eine ganze Menge!

Und! Das ist natürlich nur ein Beispiel und Anregung, so wie ICH es machen würde, - sicherlich noch verbesserungswürdig.
Ich möchte dich ausdrücklich ermutigen an Deinem Programm weiter zu arbeiten.

Code: Alles auswählen

import random


def zufalls_suchwort(wahl):
    if wahl == "1":
        berufe = ["Müller", "Becker", "Maler"]
        return random.choice(berufe)
    elif wahl == "2":
        pflanzen = ["Baum", "Blume", "Busch"]
        return random.choice(pflanzen)
    elif wahl == "3":
        tiere = ["Elefant", "Affe", "Giraffe"]
        return random.choice(tiere)


def raten(suchwort, ausgabe_wort):
    print(ausgabe_wort)
    rate_buchstabe = input("Rate einen Buchstaben: ").lower()

    ausgabe_wort_neu = ""
    for position in range(len(suchwort)):
        such_buchstabe = suchwort[position]

        if rate_buchstabe == such_buchstabe.lower():
            ausgabe_wort_neu += such_buchstabe + " "
        else:
            ausgabe_wort_neu += ausgabe_wort[position * 2] + " "

    return ausgabe_wort_neu


def auswahl():
    while True:
        print("1: Berufe")
        print("2: Pflanzen")
        print("3: Tiere")
        wahl = input("Wähle eine Kategorie 1, 2 oder 3: ")

        if wahl in ["1", "2", "3"]:
            break
        else:
            print("Das war eine falsche Eingabe, bitte triff deine Wahl erneut!")

    suchwort = zufalls_suchwort(wahl)

    print("Los gehts!")
    return suchwort


def main():
    suchwort = auswahl()
    suchwort_zeichen = len(suchwort)
    ausgabe_wort = "_ " * suchwort_zeichen

    while "_" in ausgabe_wort:
        ausgabe_wort = raten(suchwort, ausgabe_wort)

    print(ausgabe_wort)
    print("Herzlichen Glückwunsch!!!")


main()
Die Kategorien und Suchworte kann man natürlich besser wählen...
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

@rogerb: was sol das `position * 2`, woher kommt das? Wie kommt man drauf? Es ist verwirrend. Das Suchwort hat 7 Zeichen, das ausgabe_wort aber 14. Es ist also kein Wort mehr, sondern ein Wort mit Lücken. Etwas viel komplexeres, was das Programm kompliziert macht.
Dabei braucht man die Lücken nur für die Ausgabe.
Also, was brauche ich? Eine Funktion, die ein Wort mit Lücken ausgibt:

Code: Alles auswählen

def print_with_spaces(wort):
    print(" ".join(wort))
Damit wird `raten` viel einfacher:

Code: Alles auswählen

def raten(suchwort, ausgabe_wort):
    print_with_spaces(ausgabe_wort)
    rate_buchstabe = input("Rate einen Buchstaben: ").lower()

    ausgabe_wort_neu = ""
    for such_buchstabe, ausgabe_buchstabe in zip(suchwort, ausgabe_wort):
        if rate_buchstabe == such_buchstabe.lower():
            ausgabe_wort_neu += such_buchstabe
        else:
            ausgabe_wort_neu += ausgabe_buchstabe
    return ausgabe_wort_neu
Das ist übrigens ein schönes Beispiel, bei dem man Sets einsetzen kann:

Code: Alles auswählen

def generiere_ausgabe(suchwort, geratene_buchstaben):
    return "".join(
        zeichen if zeichen.lower() in geratene_buchstaben else "_"
        for zeichen in suchwort
    )

def main():
    suchwort = auswahl()
    geratene_buchstaben = set()
    while True:
        ausgabe_wort = generiere_ausgabe(suchwort, geratene_buchstaben)
        print_with_spaces(ausgabe_wort)
        if "_" not in ausgabe_wort:
            break
        rate_buchstabe = input("Rate einen Buchstaben: ").lower()
        geratene_buchstaben.add(rate_buchstabe)

    print("Herzlichen Glückwunsch!!!")

if __name__ == "__main__":
    main()
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@Sirius3, ich hatte deine Antwort so erwartet. :)

Ich hatte ja auch einiges dazu geschrieben, warum, ich das so und nicht anders mache.
Dein Code ist perfekt! - nicht ironisch gemeint!

Belassen wir es dabei.
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Ich schwanke immer, ob man im Unterricht überhaupt den Zugriff auf eine Liste per Index als erstes zeigen soll, oder vielmehr Listen als etwas darstellen, das man Stück für Stück abarbeiten kann. Im richtigen Leben stehst Du ja auch nicht vor einem Stapel Klausuren und sagst, jetzt nehme ich die erste, korrigiere und lege sie zurück, dann nehme ich die zweite, usw. sondern Du nimmst die oberste und legst sie dann auf einen neuen Stapel.
Benutzeravatar
__blackjack__
User
Beiträge: 14056
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Denke ich auch. Ich denke dieses Indexgehampel, was man in realem Code ja auch nicht macht, stammt einfach noch aus Zeiten, von Leuten, wo man das machen musste weil es nicht einfacher ging und man diese zusätzliche Indirektion über einen Laufindex machen *musste*, nicht weil man das wollte. Das es in allen modernen, imperativen Sprachen mittlerweile eine Syntaxvariante für eine ``foreach``-Schleife gibt, ist ja nicht um Programme komplexer zu machen, sondern weil das eine *Vereinfachung* ist. Und Python geht sogar so weit diese ``for``-Variante als *einzige* ``for``-Schleife anzubieten. Und dann kommen irgendwelche Leute um die Ecke, die das von bei BASIC, Pascal, C & Co nicht kennen, und fangen an Lernenden als erstes die umständliche Variante per Laufindex zu zeigen. Und verwenden dafür in Python eine ``for``-Schleife über ein iterierbares Objekt. Statt direkt einfach erst einmal eine ``for``-Schleife über das iterierbare Objekt zu zeigen über das man letztendlich ja *eigentlich* iterieren möchte. Völlig Banane. IMHO.

Im dem Thema ging es ja auch darum was man in einem bestimmten Zeitrahmen unterbringen kann. Ich vermute sehr stark man käme deutlich weiter wenn man die Ausdrucksstärke von Python gut nutzen würde. Also zum Beispiel auf funktionale Programmierung eingehen würde und das eher so aufbaut, dass man Funktionen beschreibt, und das es Einzeldaten und Folgen von Daten gibt, und dann wie man folgen von Daten erzeugt, aus einer Folge von Daten eine Folge mit veränderten Daten erstellt, aus einer Folge von Daten die, die man haben möchte heraus filtert, und Folgen von Daten zu Einzeldaten aggregiert. Also weniger Python auf das Niveau von Pascal oder C runter zwingen, sondern mehr Iteratoren/Generatoren, `map()`, `filter()`, `itertools` & Co.

Wenn man mehr Hardwarenähe will, dann sollte man keine Hochsprache verwenden. Wenn man eh nicht wirklich über Arrays und Indexzugriffe hinaus kommt, warum dann nicht Pascal oder C, wo das auch tatsächlich der übliche Weg ist das zu programmieren?

Wenn es nur darum geht zu zeigen wie das auf eine niedrigeren Ebene funktioniert, in der man in Python normalerweise nicht programmiert, dann kann man ja immer noch eine Übungsaufgabe stellen wie: „Wenn es ``for`` und ``iter`` nicht gäbe, sondern nur Indexzugriff, wie würde dann eine Schleife über die Elemente einer Liste aussehen“. Das macht man dann *einmal*, in Code von dem die Schüler wissen, dass das so *nicht* in einem normalen Programm stehen sollte. Statt so anzufangen und den Eindruck zu vermitteln, dass sei etwas was man normal so machen würde.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten