Seite 2 von 2
Re: Syntax-Error bei Fehlerlosem code?
Verfasst: Samstag 12. Februar 2011, 16:39
von Hyperion
Meishere hat geschrieben:Also die einzige Lösung die mir einfällt, würde immernoch 5 if-anweisungen beinhalten. Wenn man fünf verschiedene Mlglichkeiten hat, die über eine Benutzereingabe ausgewählt werden, dann geht das doch nicht anders oder?
Doch schon. Eine gängige Methode ist ein Dictionary zu benutzen, welches eine Benutzerauswahl auf ein Objekt mappt. Das Objekt kann z.B. eine Funktion sein oder eben auch wie bei Dir eine Menge an Zeichen:
Code: Alles auswählen
dispatch = {
"a": "ABC",
"b": "DEF",
"c": "GHI"
}
# hier den benutzer wählen lassen
user_input = ...
# und nun ohne if die Auswahl verwenden
random.choice(dispatch.get(user_input, string.ascii_letters))
Re: Syntax-Error bei Fehlerlosem code?
Verfasst: Samstag 12. Februar 2011, 18:48
von Meishere
@ DaMutz: Naja... Es gibt eigentlich 5Möglichkeiten: 1.Alles=ja, 2.keine Zahlen,3.keine Großbuchstaben, 4.keine Kleinbuchstaben, 5.Alles=nein
@Hyperion: Danke für den tipp. Also auf den ersten Blick durchblicke ich das noch nicht so ganz, aber das wird schon noch

Das ist natürlich mehr als wir (bisher) in der Schule hatten, daher kenne ich das noch nicht.
Gruß,
Meishere
Re: Syntax-Error bei Fehlerlosem code?
Verfasst: Samstag 12. Februar 2011, 19:00
von Hyperion
Meishere hat geschrieben:@ DaMutz: Naja... Es gibt eigentlich 5Möglichkeiten: 1.Alles=ja, 2.keine Zahlen,3.keine Großbuchstaben, 4.keine Kleinbuchstaben, 5.Alles=nein
Bei reinen Aufzählungen kann man auch auf eine Liste zurückgreifen und dann die Zahl des Benutzers als Index benutzen. Ungetestet:
Code: Alles auswählen
choices = (
("Alles", string.printbale),
("keine Zahlen", string.letters),
("Kleinbuchstaben", string.lowercase),
("Großbuchstaben", string.uppercase)
# "Alles = nein" kapiere ich nicht ;-)
)
for index, item in enumerate(1, choices):
print "{0} - {1}".format(index, item[0])
menu_index = int(raw_input("Ihre Wahl?")) - 1
random.choice(choices[menu_index][1])
Meishere hat geschrieben:
@Hyperion: Danke für den tipp. Also auf den ersten Blick durchblicke ich das noch nicht so ganz, aber das wird schon noch

Das ist natürlich mehr als wir (bisher) in der Schule hatten, daher kenne ich das noch nicht.
Naja, schad ja nichts, mehr zu lernen

Hattet ihr noch keine Dictionaries? Dann muss man sich deren Funktionsweise erst einmal aneignen, um das zu kapieren

Aber dann ist es auch einfach einzusehen imho

Re: Syntax-Error bei Fehlerlosem code?
Verfasst: Samstag 12. Februar 2011, 19:12
von Meishere
[/quote]
Code: Alles auswählen
choices = (
("Alles", string.printbale),
("keine Zahlen", string.letters),
("Kleinbuchstaben", string.lowercase),
("Großbuchstaben", string.uppercase)
# "Alles = nein" kapiere ich nicht ;-)
)
for index, item in enumerate(1, choices):
print "{0} - {1}".format(index, item[0])
menu_index = int(raw_input("Ihre Wahl?")) - 1
random.choice(choices[menu_index][1])
Naja, schad ja nichts, mehr zu lernen

[/quote]
Also erstmal: Stimmt schon, dass man ruhig mehr lernen kann. Einziges Problem: In der Schule ist es dann so langweilig

Wenn alle 90minuten arbeiten und du das alles schon kennst, dann ist es nicht allzu spannend xD
Und alles=nichts soll einfach nur ne Ausgabe geben, dass mann nichts eingegeben hat

Das Problem ist, dass string.printable doch ach sonderzeichen enthält, allerdings nicht nach Sonderzeichen gefragt wird und wenn ich nach Sonderzeichen fragen würde, dann müsste ich die ja trotzdem vom Rest trennen können.
P.S.: Gibt "choices" eine numerierte Auswahl aus der der Benutzer wählen kann?
Hab gerade den Code einfach mal in einen leeren script kopiert und ausgeführt. Dann wurde 1. gesagtt, dass das Anführungszeichen an der Stelle "{0} - {1}... falsch sei und als ich diesen Teil gelöscht habe, kam die Meldung dass das Modul kein Attribut "printable" enthält. Das bezweifle ich mal, aber wo liegt das Problem? An der Python-Version?
EDIT: Ok. Das erste lag an Python (in Version 3.1 muss das nach print in extra Klammern).
Re: Syntax-Error bei Fehlerlosem code?
Verfasst: Samstag 12. Februar 2011, 19:18
von Hyperion
Meishere hat geschrieben:
EDIT: Ok. Das erste lag an Python (in Version 3.1 muss das nach print in extra Klammern).
Ja, da ist print eine Funktion, in 2.x ein Statement (so wie if, for, while usw.)
Außerdem musst Du statt raw_input nur input() nehmen in 3.x.
Re: Syntax-Error bei Fehlerlosem code?
Verfasst: Samstag 12. Februar 2011, 19:22
von Meishere
Ja das stimmt.
Aber es gibt noch ein Problem (abgesehen davon, dass er irgendein Problem mit dem string-modul hat O.o).
Wenn ich in den "choices" die string-Aufrufe weglasse, dann sagt er, dass bei "enumerate" choices nicht funktioniert, da choices ein tupel ist und an der Stelle eigentlich ein Integer sein müsste. Ich habe choices und 1 einfach mal getauscht und weiß daher wenigstens wie "choices funktioniert", aber dennoch gibt es halt noch diese Probleme

Re: Syntax-Error bei Fehlerlosem code?
Verfasst: Samstag 12. Februar 2011, 19:31
von Hyperion
Ach, ich hatte da einige Böcke drin, hier der funzende für 2.x:
Code: Alles auswählen
choices = (
("Alles", string.printable),
("keine Zahlen", string.letters),
("Kleinbuchstaben", string.lowercase),
("Großbuchstaben", string.uppercase)
)
for index, item in enumerate(choices, 1):
print "{0} - {1}".format(index, item[0])
menu_index = int(raw_input("Ihre Wahl?")) - 1
random.choice(choices[menu_index][1])
"printable" hatte Buchstabendreher und bei enumerate muss der Startindex natürlich als zweiter Parameter übergeben werden. Sorry.
Re: Syntax-Error bei Fehlerlosem code?
Verfasst: Samstag 12. Februar 2011, 19:40
von Meishere
Leider löst das noch nicht die Probleme

1. Trotz richtiger Schreibung werden weder printable, noch letter, noch die anderen erkannt.
2. Wenn man choices als ersten parameter nimmt, wird als Auswahlmöglichkeit nur der erste Buchstabe angezeigt.
Ich denke, das liegt wieder an der Version, aber leider kenne ich mich da nicht so gut (bin wie gesagt noch im "Anfangs-Lernprozess"

)
Gruß,
Meishere
Re: Syntax-Error bei Fehlerlosem code?
Verfasst: Samstag 12. Februar 2011, 19:50
von BlackJack
@Meishere: Du hast das `string`-Modul aber auch am Anfang importiert, oder? Ansonsten wären *komplette* Fehlermeldungen inklusive Traceback nützlich.
Re: Syntax-Error bei Fehlerlosem code?
Verfasst: Samstag 12. Februar 2011, 19:51
von Hyperion
Meishere hat geschrieben:
2. Wenn man choices als ersten parameter nimmt, wird als Auswahlmöglichkeit nur der erste Buchstabe angezeigt.
An welcher Stelle?
Re: Syntax-Error bei Fehlerlosem code?
Verfasst: Samstag 12. Februar 2011, 19:59
von Meishere
@BlackJack: Ja klar. Habe ich gemacht. Hier der Traceback. Aus irgendeinem Grund erkennt er "printable" jetzt plözlich doch, aber die anderen nicht.
Traceback:
Traceback (most recent call last):
File "C:\Dokumente und Einstellungen\Besitzer\Desktop\a.py", line 6, in <module>
("keine Zahlen", string.letters),
AttributeError: 'module' object has no attribute 'letters'
@Hyperion: Wie meinst du das? Also, wenn man das Programm ausführt, dann wird in der ausgegebenen Liste immer nur 1.A , 2.k, 3.k, 4.G angezeigt. Ich meine, wenn man choices als ersten parameter für enumerate benutzt.
Re: Syntax-Error bei Fehlerlosem code?
Verfasst: Samstag 12. Februar 2011, 20:04
von Hyperion
Meishere hat geschrieben:
Traceback (most recent call last):
File "C:\Dokumente und Einstellungen\Besitzer\Desktop\a.py", line 6, in <module>
("keine Zahlen", string.letters),
AttributeError: 'module' object has no attribute 'letters'
Du musst das 3.x anpassen:
http://docs.python.org/py3k/library/string.html
Meishere hat geschrieben:
@Hyperion: Wie meinst du das? Also, wenn man das Programm ausführt, dann wird in der ausgegebenen Liste immer nur 1.A , 2.k, 3.k, 4.G angezeigt. Ich meine, wenn man choices als ersten parameter für enumerate benutzt.
Hm... und Du hast choices nicht verändert? Was sagt ein print(item) an der Stelle?
Re: Syntax-Error bei Fehlerlosem code?
Verfasst: Samstag 12. Februar 2011, 20:07
von Meishere
Ach ja... Da hätte ich selbst drauf kommen können-.-
Naja, ich hatte vergessen, dass da einascii davor muss. Ich kenne das string-modul aber auch erst seit heute

Nahdem ich's an 3.x angepasst habe geht's auch mit der Ausgabe der Liste.
Also alles funktioniert

Danke,
Meishere
Edit: Naja, das einzige Problem ist, dass in "printable" auch Sonderzeichen enthalten sind, aber ich glaube da kann man nichts machen. Kann ich in "choices" statt string.printable: string.letters, string.digits schreiben? Oder etwas ähnliches?
Re: Syntax-Error bei Fehlerlosem code?
Verfasst: Samstag 12. Februar 2011, 20:19
von Hyperion
Du könntest Tupel aus den möglichen Strings machen:
Code: Alles auswählen
choices = (
("Alles", (string.letters, string.digits)),
...
Und dann bei der Auswahl:
join() ist eine Methode auf String-Objekten, die alle Elemente aus einem Iterable zu einem neuen String zusammenfügt. So würden dann alle Elemente aus den Strings oben zusammengefügt.
Re: Syntax-Error bei Fehlerlosem code?
Verfasst: Sonntag 13. Februar 2011, 19:11
von Meishere
Ah, danke

Das scheint zu funktionieren

Aber ich habe noch eine Verständniss-Frage. Warum benutzt man hier "".join. Was haben die Anführungszeichen zu bedeuten? Die muss man doch benutzen, weil es sich um ein tupel handelt, das "gejoint" werden soll, oder?
Gruß,
Meishere
Re: Syntax-Error bei Fehlerlosem code?
Verfasst: Sonntag 13. Februar 2011, 19:20
von BlackJack
@Meishere: Die Anführungzeichen sind eine Zeichenkette. Das es sich um ein Tupel handelt ist nicht so wichtig, das funktioniert mit jedem Objekt über das man iterieren kann und das Zeichenketten liefert.
Re: Syntax-Error bei Fehlerlosem code?
Verfasst: Sonntag 13. Februar 2011, 19:23
von cofi
Nein, da stimmt so gar nichts.
Anführungszeichen werden benutzt, um Strings direkt im Code zu erzeugen (Stringliterale) und `.join` ist eine Operation auf einem String, die ein Iterable (String, Liste, Tupel, ...) nimmt und die Strings darin zu einem zusammensetzt, mit dem String auf dem es aufgerufen wird als Trennzeichen:
http://docs.python.org/library/stdtypes.html#str.join
Hier erzeugt man also aus einem Tupel von Strings einen String, in dem man alle Strings direkt, dh ohne Trennzeichen, zusammensetzt.
Re: Syntax-Error bei Fehlerlosem code?
Verfasst: Sonntag 13. Februar 2011, 19:28
von mutetella
Hat Hyperion doch bereits beschrieben:
Hyperion hat geschrieben:join() ist eine Methode auf String-Objekten, die alle Elemente aus einem Iterable zu einem neuen String zusammenfügt.
Nachdem eine Zeichenkette (String-Objekt!) in Anführungszeichen stehen muss, steht natürlich die Zeichenkette, auf die Du join() anwenden möchtest, auch in Anführungszeichen. Diese Zeichenkette fügt join() dann zwischen jedes String-Objekt aus dem Iterable ein.
Und wenn Du 'nichts' zwischen die Objekte einfügen willst, dann steht eben auch 'nichts' in den Anführungszeichen.
Code: Alles auswählen
In [40]: iterable = ['a', 'b', 'c']
In [41]: ''.join(iterable)
Out[41]: 'abc'
In [42]: '-'.join(iterable)
Out[42]: 'a-b-c'
In [43]: 'ABC'.join(iterable)
Out[43]: 'aABCbABCc'
mutetella
Re: Syntax-Error bei Fehlerlosem code?
Verfasst: Sonntag 13. Februar 2011, 19:32
von Meishere
Ok, während ich meinen Beitrag schreiben wollte, gab's ja schon Erklärungen
Dann habe ich 'join' bisher falsch verstanden.

Ich dachte join fügt einfach 2 strings zusammen. Jetzt weiß ich auch was man vor join schreiben muss

Danke an mutetella für die ausführliche Erklärung, aber natürlich auch ein Danke an cofi

Gruß,
Meishere
Edit: Und danke an BlackJack. Ich will ja niemanden vernachlässigen

Hab dich nur übersehen

EDIT2: Jetzt versteh ich auch die englische Erklärung in der doc

Hatte ich glatt falsch gelesen/überlesen