gesucht wird eine kreative Methode um Sachaufgaben zu erstellen
-
- User
- Beiträge: 978
- Registriert: Sonntag 19. September 2021, 09:40
Na dann muss ich mal schauen, ob ich das verstehe. Danke!
- __blackjack__
- User
- Beiträge: 13533
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@Pitwheazle: Du sollst da gar keinen Text eingeben, denn "list()" ist ja eine Zeichenkette, die ist auch nicht aufrufbar. Aufrufbar heisst das kann man aufrufen. Funktionen und Methoden und Datentypen kann man in Python aufrufen (unter anderem). Wenn Du `list` aufrufst, dann ist das Ergebnis eine neue Liste und bei `dict` bekommt man ein neues Wörterbuch:
Das `default`-Argument muss etwas sein was später von dem Rahmenwerk *aufgerufen* werden kann und daraufhin einen neuen Wert erzeugt, falls man keinen Wert übergeben hat. Irgendwie müssen diese Werte ja erzeugt werden. Du kannst da auch einen Lambda-Ausdruck angeben der erzeugt was Du haben willst, also ``default=lambda: []`` oder ``default=lambda: list()``, oder Du schreibst eine Funktion ``def create_default: return []`` und gibst die an: ``default=create_default``. Am einfachsten ist aber ``default=list`` weil `list` aufrufbar ist und eine neue Liste liefert wenn man das tut.
Code: Alles auswählen
In [7]: list()
Out[7]: []
In [8]: dict()
Out[8]: {}
Code: Alles auswählen
- (void)countSheep {
unsigned int sheep = 0;
while ( ! [self isAsleep]) { ++sheep; }
}
-
- User
- Beiträge: 978
- Registriert: Sonntag 19. September 2021, 09:40
Lieber @__blackjack__, ich habe Abitur (gar nicht mal schlecht), das große Latinum (erschwindelt) ein Mathe- und Physikstudium (allerdings nur Schmalspur als Lehramt) ... und muss jetzt wieder feststellen, dass mich das intelektuell überfordert. Ich fürchte, ich werde das nie endgültig verstehen und werde weiter auf eure geduldige Hilfe angewiesen sein.__blackjack__ hat geschrieben: ↑Dienstag 21. März 2023, 19:01 Das `default`-Argument muss etwas sein was später von dem Rahmenwerk *aufgerufen* werden kann und daraufhin einen neuen Wert erzeugt, falls man keinen Wert übergeben hat. Irgendwie müssen diese Werte ja erzeugt werden. Du kannst da auch einen Lambda-Ausdruck angeben der erzeugt was Du haben willst, also ``default=lambda: []`` oder ``default=lambda: list()``, oder Du schreibst eine Funktion ``def create_default: return []`` und gibst die an: ``default=create_default``. Am einfachsten ist aber ``default=list`` weil `list` aufrufbar ist und eine neue Liste liefert wenn man das tut.
Ich verstehe jetzt (vielleicht erstmalig), wie sich die begriffsstutzigen unter meinen Schülerinnen und Schülern gefühlt haben müssen, wenn sie trotz meiner geduldigen Erklärungen den entsprechenden Sachverhalt nicht verstanden haben.
Das ist ja genial! Das funktioniert prima! Ich mir nicht träumen lassen, dass es sowas fertig gibt. Das "simplify" habe ich in meinem bestehenden Rechntrainer mühselig selbst programmiert.
Das ist das erste Mal, dass ich bewusst eine Bibliothek einsetze. Die muss ich, wenn ich meine Sachaufgaben fertig habe, dann wohl auch in uber.space installieren?
-
- User
- Beiträge: 978
- Registriert: Sonntag 19. September 2021, 09:40
Nachdem das mit der Liste ja funktioniert, erscheint es mir doch sinnvoll, lieber ein dict zu verwenden.
Anstelle von
{"liste_a":[5, 10, 15, 20, 25], "liste_b":[1, 1.2, 1.5, 2, 2.5]}
funktioniert (natürlich) wieder nicht und weder
{"liste_a":5, 10, 15, 20, 25, "liste_b":1, 1.2, 1.5, 2, 2.5}
noch
{"liste_a":(5, 10, 15, 20, 25), "liste_b":(1, 1.2, 1.5, 2, 2.5)}
Was ist da falsch? Bei meiner Suche finde ich hier nur Beispiele mit Strings aber nicht mit Zahlenwerten - geht das nicht?
Anstelle von
wollte ich jeweils eine Liste für die Variablen erstellen, aus der ich dann zufällig eine auswähle, aber[[5, 10, 15, 20, 25], [1, 1.2, 1.5, 2, 2.5]]
{"liste_a":[5, 10, 15, 20, 25], "liste_b":[1, 1.2, 1.5, 2, 2.5]}
funktioniert (natürlich) wieder nicht und weder
{"liste_a":5, 10, 15, 20, 25, "liste_b":1, 1.2, 1.5, 2, 2.5}
noch
{"liste_a":(5, 10, 15, 20, 25), "liste_b":(1, 1.2, 1.5, 2, 2.5)}
Was ist da falsch? Bei meiner Suche finde ich hier nur Beispiele mit Strings aber nicht mit Zahlenwerten - geht das nicht?
Hallo,
was genau funktioniert denn an deinem ersten Beispiel nicht. Bei mir gehts:
Grüße
Dennis
was genau funktioniert denn an deinem ersten Beispiel nicht. Bei mir gehts:
Code: Alles auswählen
>>> pitwheazle_dictonary = {"liste_a":[5, 10, 15, 20, 25], "liste_b":[1, 1.2, 1.5, 2, 2.5]}
>>> print(pitwheazle_dictonary.values())
dict_values([[5, 10, 15, 20, 25], [1, 1.2, 1.5, 2, 2.5]])
>>> print(pitwheazle_dictonary.keys())
dict_keys(['liste_a', 'liste_b'])
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
-
- User
- Beiträge: 978
- Registriert: Sonntag 19. September 2021, 09:40
Ich habe jetzt eine Liste mit einer unterschiedlichen Listen von Variablen - z.B. mit 2 Variablen:
Es kann aber auch nur eine oder mehr als 2 sein. Jetzt habe ich folgenden Code um die Variablen festzulegen:
das lässt sich doch sicher mit
eleganter lösen?
Und ein Nachtrag: Wie ich mich kenne, bekomme ich dann auch diesen Code auch nicht auf die unterschiedliche Anzahl von Variablen angepasst.
Code: Alles auswählen
[[5, 10, 15, 20, 25], [1, 1.2, 1.5, 2, 2.5]]
Code: Alles auswählen
items = len(variable) # variablen insgesamt
a=random.choice(variable[0])
if items>1:
b=random.choice(variable[1])
if items>2:
c=random.choice(variable[2])
if items>3:
d=random.choice(variable[3])...
Code: Alles auswählen
for item in variable ...
Und ein Nachtrag: Wie ich mich kenne, bekomme ich dann auch diesen Code
Code: Alles auswählen
text = aufgabe.text.format(a,b)
Zuletzt geändert von Pitwheazle am Freitag 24. März 2023, 14:31, insgesamt 2-mal geändert.
-
- User
- Beiträge: 978
- Registriert: Sonntag 19. September 2021, 09:40
Entschuldige, ich habe die Antwort anscheinend vergessen loszuschicken:
ich wollte dir die Fehlermeldung kopieren, die angezeigt wird, wenn ich die Beispiele in meinem JSONField eintrage - jetzt funktioniert es - warum auch immer.
Hallo,
ich rätsle schon seit einiger Zeit, aber ich kann immer nur vermuten was das eigentliche Ziel ist. 'aufgabe.text.format(a, b)' nimmt nur zwei Argumente entgegen, weiter oben hast du eine Liste mit einer undefinierten Anzahl von Zahlen, die da irgendwie rein sollen.
Könntest du bitte einen kleinen vollständigen Beispielcode zeigen, damit man sieht was das Ziel ist?
Grüße
Dennis
ich rätsle schon seit einiger Zeit, aber ich kann immer nur vermuten was das eigentliche Ziel ist. 'aufgabe.text.format(a, b)' nimmt nur zwei Argumente entgegen, weiter oben hast du eine Liste mit einer undefinierten Anzahl von Zahlen, die da irgendwie rein sollen.
Könntest du bitte einen kleinen vollständigen Beispielcode zeigen, damit man sieht was das Ziel ist?
Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
-
- User
- Beiträge: 978
- Registriert: Sonntag 19. September 2021, 09:40
Also im Prinzip geht es darum Sachaufgaben mit Zufallszahlen zu erstellen. Die Texte speichere ich in der Datenbank, ebenso Listen (neuerdings Dics) mit den Variablen und den Lösungsweg als String (z.B. a•b). Im View werden die Teile wieder zusammengesetzt. Mit parser.parse('a‘ = a).evaluate({}) usw. wird dann die Lösung berechnet.Da in den verschiedenen Texten unterschiedliche Anzahlen von Variablen auftauchen, wollte ich das Erstellen der Variablen vereinfachen. Für den „parser“ Code benötige ich die Namen der Variablen, also z.B. „a=20“ - die Namen kann man aber wohl nicht aus den keys der dicts erstellen. Ich habe Kollegen im Netz gefunden, die ähnliche Probleme haben, aber keine Lösungen dazu. Ich werde das wohl mit „if“, „eilif“ ... anstelle von „for ... in“ lösen.
"Variable" im Sinne von Variable in Python und/oder "Variable" im Sinne von Variable in der Mathematik?Pitwheazle hat geschrieben: ↑Freitag 24. März 2023, 14:13 Und ein Nachtrag: Wie ich mich kenne, bekomme ich dann auch diesen Codeauch nicht auf die unterschiedliche Anzahl von Variablen angepasst.Code: Alles auswählen
text = aufgabe.text.format(a,b)
Was ist mit dem *?
Hier als Python-Funktionsdefinition:
Code: Alles auswählen
def format( *a):
print(type(a))
print(str(a))
Code: Alles auswählen
def format(self, *a):
print(type(a))
print(str(a))
___________________________________________________________________________________________________
https://www.python-kurs.eu/index.php
https://learnxinyminutes.com/docs/python/ https://learnxinyminutes.com/docs/de-de/python-de/
https://quickref.me/python | https://docs.python-guide.org/
-
- User
- Beiträge: 978
- Registriert: Sonntag 19. September 2021, 09:40
Dankeschön
Ich bin bei der ganzen Diskussion nicht mehr mitgekommen, wo denn das eigentliche Problem ist.
Eigentlich steht doch schon alles da, nur noch nicht in einem Code:
Eigentlich steht doch schon alles da, nur noch nicht in einem Code:
Code: Alles auswählen
import random
import sympy
text = "Wie viele {a}cm lange Stücke kann man von einer {b}m langen Leiste absägen?"
ergebnis = "100*b/a"
variablen_auswahl = {"a": [5,10,15,20,25], "b": [1,1.2,1.5,2,2.5]}
variablen = {
name: random.choice(werte)
for name, werte in variablen_auswahl.items()
}
print(text.format(**variablen))
print("Lösung:", sympy.sympify(ergebnis).subs(variablen))
mich hat es wohl bei der variablen Verwendung des Wortes Variablen aus der Bahn geworfen... (bei meinen eigenen Programmen nutze ich ja meist deutschsprachige Begriffe für z.b. Variablen- oder Funktionsnamen. Da wähne ich mich dann auf der sicheren Seite dass es zu keinen Namenskollisionen zwischen meinen deutschsprachigen Definitionen und den englischen Bezeichnern der Programmiersprache bzw. Bibliothek kommt. Aber wenn hier gleichzeitig über Mathematik und Programmcode geschrieben wird... und z.b. eben Variablen und Funktionen erwähnt werden...)
___________________________________________________________________________________________________
https://www.python-kurs.eu/index.php
https://learnxinyminutes.com/docs/python/ https://learnxinyminutes.com/docs/de-de/python-de/
https://quickref.me/python | https://docs.python-guide.org/
-
- User
- Beiträge: 978
- Registriert: Sonntag 19. September 2021, 09:40
Das Problem besteht jetzt noch darin, dass ich auch noch ein Ergebnis berechnen muss. @sparrow hatte die geniale Idee mit diesem "parser" Code und der funktioniert auch prima. Da muss ich aber in z.B. "parser.parse('a‘ = a).evaluate({}) " das a mit dem entsprechenden Wert ersetzen und das habe ich noch nicht mittels "for ... in" hinbekommen, da ich die eine wechselnde Anzahl von Variablen von a bis f ersetzen muss.
Ich bin auf Reisen, das dauert alles etwas länger mit meinem kleinen 12" Bildschirm, ich schicke nachher meinen "uneleganten" Code mit "if ... elif".
-
- User
- Beiträge: 978
- Registriert: Sonntag 19. September 2021, 09:40
Ich habe ja auch schon geschrieben, dass ich meinen Code möglichst mit deutschen Benennungen schreibe. Hast du eine Idee, wie ich die Variablen aus der Mathematik "a=20" von denen im Code "a=20" unterscheiden kann?
-
- User
- Beiträge: 978
- Registriert: Sonntag 19. September 2021, 09:40
Hier ist mein uneleganter Code:
Er funktioniert:
{'a': [5, 10, 15, 20, 25], 'b': [1, 1.2, 1.5, 2, 2.5]}
16.666666666666664
Wie viele 15cm lange Stücke kann man von einer 2.5m langen Leiste absägen?
16
100*2,5/15=16+Rest[/code]
Noch eine Anmerkung: Das
habe ich eingefügt, da nicht alle Variable zur Berechnung des Ergebnsisses eingesetzt werden. So kann ich z.B. auch Namen zufällig einsetzen oder Zahlen, die nicht für die Lösung benötigt werden.
Code: Alles auswählen
stellen=parameter[2] # Anz der Dezimalstellen
variable=parameter[3]
print(variable)
term=aufgabe.loe_weg
parser = Parser()
items = len(variable) # varaiable insgesamt
a=b=c=d=e=f=""
if items>0:
a=random.choice(variable["a"])
if 'a' in term:
term=parser.parse(term).substitute('a',a).toString()
if items>1:
b=random.choice(variable["b"])
if 'b' in term:
term=parser.parse(term).substitute('b',b).toString()
if items>2:
c=random.choice(variable["c"])
if 'c' in term:
term=parser.parse(term).substitute('c',c).toString()
if items>3:
d=random.choice(variable["d"])
if 'd' in term:
term=parser.parse(term).substitute('d',d).toString()
if items>4:
e=random.choice(variable["e"])
if 'e' in term:
term=parser.parse(term).substitute('e',e).toString()
if items>5:
e=random.choice(variable["f"])
if 'f' in term:
term=parser.parse(term).substitute('f',f).toString()
term=term.replace("(","").replace(")","")
ergebnis=parser.parse(term).evaluate({})
print(ergebnis)
text = aufgabe.text.format(a,b,c,d,e,f)
print(text)
pro_text = aufgabe.pro_text+term
variable = ""
frage = aufgabe.links_text
einheit = aufgabe.rechts_text
rest=""
if stellen==0:
if ergebnis%1:
anmerkung=aufgabe.anmerkung
rest = "+Rest"
ergebnis=ergebnis//1
print(ergebnis)
term=term.replace(".",",")
lsg = term + "=" + format_zahl(ergebnis,stellen) + rest
print(lsg)
{'a': [5, 10, 15, 20, 25], 'b': [1, 1.2, 1.5, 2, 2.5]}
16.666666666666664
Wie viele 15cm lange Stücke kann man von einer 2.5m langen Leiste absägen?
16
100*2,5/15=16+Rest[/code]
Noch eine Anmerkung: Das
Code: Alles auswählen
if 'x' in term:
Es ist schade, dass Du gar nicht auf meinen Code eingehst. Denn der zeigt, wie man mit dem Deinem Problem umgehen muß.
1. Du hast Variablen, die Namen haben, also ist es wichtig, diese Namen überall einzusetzen, also auch im Aufgabentext.
2. Für die Zuordnung Name -> Wert gibt es in Python Wörterbücher. Und mit Wörterbüchern kann man auch in Schleifen arbeiten.
Wenn man mit replace auf Ausdrücke losgeht, macht man irgendwas falsch, vor allem, wenn man Klammern einfach so löscht.
1. Du hast Variablen, die Namen haben, also ist es wichtig, diese Namen überall einzusetzen, also auch im Aufgabentext.
2. Für die Zuordnung Name -> Wert gibt es in Python Wörterbücher. Und mit Wörterbüchern kann man auch in Schleifen arbeiten.
Wenn man mit replace auf Ausdrücke losgeht, macht man irgendwas falsch, vor allem, wenn man Klammern einfach so löscht.
Nicht wirklich... der Vorschlag Mathematik und Informatik nicht zu vermischen ist ja nun nicht wirklich zielführend. Bei den Gleichungen (also hier die mathematischen Ausdrücke mit Gleichheitszeichen oder ähnlichem) könnte man theoretisch auf die griechischen Buchstaben ausweichen. Aber ob das hier im Forum machbar ist?Pitwheazle hat geschrieben: ↑Sonntag 26. März 2023, 12:20 Ich habe ja auch schon geschrieben, dass ich meinen Code möglichst mit deutschen Benennungen schreibe. Hast du eine Idee, wie ich die Variablen aus der Mathematik "a=20" von denen im Code "a=20" unterscheiden kann?
Nur bei den normalen Sätzen ist eine Variable halt entweder eine Variable (math.) oder eine Variable (Python)....
Wobei.. vielleicht genau so? Aber schön zu lesen ist das dann auch nicht.
___________________________________________________________________________________________________
https://www.python-kurs.eu/index.php
https://learnxinyminutes.com/docs/python/ https://learnxinyminutes.com/docs/de-de/python-de/
https://quickref.me/python | https://docs.python-guide.org/
-
- User
- Beiträge: 978
- Registriert: Sonntag 19. September 2021, 09:40
Ich hatte halt zwischenzeilich schon mal alleine probiert das zum Laufen zu bringen. ich probiere das mit den Namen später noch aus - so ist der Code ja wirklich nicht schön.
Das hatte ich ja versucht. Unbedarft war ich davon ausgegangen, dass "a" im Wörterbuch ein Key ist und ich brauche das a halt dann als Variablenname. Bisher hatte ich das nicht hinbekommen und nach Recherchen im Internet den Versuch aufgegeben (da wurde u.A. empfohlen, den Versuch keys in Varaiablenamen (identifier) zu wandeln aufzugeben) - aber wenn du da hoffnungsvoll bist gehe ich da ebenfalls nochmals hoffnungsvoll dran.
Ich habe zunächst mal die Klammern rausgeworfen, weill ich den Schülerinnen und Schülern, wenn sie auf "Lösung anzeigen" klicken, den Lösungsweg anzeigen wollte und der wurde von parse z.B. zu "(1.2*(100/5))=24" anstelle von - "1,2*100/5" ich fürchte, das verstehen sie nicht auf Anhieb und werden sich auch nicht weiter darauf einlassen. Dass ich bei weiteren Aufgaben u.U. auch eine Klammer im Lösungsweg benötige habe ich schon vorgeplant.
-
- User
- Beiträge: 978
- Registriert: Sonntag 19. September 2021, 09:40
Ich könnte ja in Zukunft "a=20" (math) und "a=20" (code) schreiben? Oder nur "variable (math)" und "variable (code)".grubenfox hat geschrieben: ↑Sonntag 26. März 2023, 13:11Pitwheazle hat geschrieben: ↑Sonntag 26. März 2023, 12:20 Hast du eine Idee, wie ich die Variablen aus der Mathematik "a=20" von denen im Code "a=20" unterscheiden kann?
Griechische Buchstaben sind für mich Benennungen für Winkel und mit denen werde ich mich (oder auch wir uns ) als nächstes beschäftigen. Da habe ich schon große Bedenken, wie ich das mit den kartesischen- und den Polarkoordinaten bei den Winkelbogen löse.