Syntax-Error bei Fehlerlosem code?

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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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))
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Meishere
User
Beiträge: 27
Registriert: Montag 24. Januar 2011, 16:54

@ 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 :D
Das ist natürlich mehr als wir (bisher) in der Schule hatten, daher kenne ich das noch nicht. :D

Gruß,
Meishere
Jetzt sind die guten alten Zeiten, nach denen wir uns in zehn Jahren zurücksehnen.
Peter Ustinov

Jeder Mensch macht Fehler. Das Kunststück liegt darin, sie dann zu machen, wenn keiner zuschaut.
Peter Ustinov
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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 :D
Das ist natürlich mehr als wir (bisher) in der Schule hatten, daher kenne ich das noch nicht. :D
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 ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Meishere
User
Beiträge: 27
Registriert: Montag 24. Januar 2011, 16:54

[/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 :D 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 :D
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).
Jetzt sind die guten alten Zeiten, nach denen wir uns in zehn Jahren zurücksehnen.
Peter Ustinov

Jeder Mensch macht Fehler. Das Kunststück liegt darin, sie dann zu machen, wenn keiner zuschaut.
Peter Ustinov
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Meishere
User
Beiträge: 27
Registriert: Montag 24. Januar 2011, 16:54

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 :D
Jetzt sind die guten alten Zeiten, nach denen wir uns in zehn Jahren zurücksehnen.
Peter Ustinov

Jeder Mensch macht Fehler. Das Kunststück liegt darin, sie dann zu machen, wenn keiner zuschaut.
Peter Ustinov
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Meishere
User
Beiträge: 27
Registriert: Montag 24. Januar 2011, 16:54

Leider löst das noch nicht die Probleme :D
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" :D)
Gruß,
Meishere
Jetzt sind die guten alten Zeiten, nach denen wir uns in zehn Jahren zurücksehnen.
Peter Ustinov

Jeder Mensch macht Fehler. Das Kunststück liegt darin, sie dann zu machen, wenn keiner zuschaut.
Peter Ustinov
BlackJack

@Meishere: Du hast das `string`-Modul aber auch am Anfang importiert, oder? Ansonsten wären *komplette* Fehlermeldungen inklusive Traceback nützlich.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Meishere hat geschrieben: 2. Wenn man choices als ersten parameter nimmt, wird als Auswahlmöglichkeit nur der erste Buchstabe angezeigt.
An welcher Stelle?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Meishere
User
Beiträge: 27
Registriert: Montag 24. Januar 2011, 16:54

@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.
Jetzt sind die guten alten Zeiten, nach denen wir uns in zehn Jahren zurücksehnen.
Peter Ustinov

Jeder Mensch macht Fehler. Das Kunststück liegt darin, sie dann zu machen, wenn keiner zuschaut.
Peter Ustinov
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Meishere
User
Beiträge: 27
Registriert: Montag 24. Januar 2011, 16:54

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 :D
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?
Jetzt sind die guten alten Zeiten, nach denen wir uns in zehn Jahren zurücksehnen.
Peter Ustinov

Jeder Mensch macht Fehler. Das Kunststück liegt darin, sie dann zu machen, wenn keiner zuschaut.
Peter Ustinov
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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:

Code: Alles auswählen

random.choice("".join(choices[menu_index][1]))
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.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Meishere
User
Beiträge: 27
Registriert: Montag 24. Januar 2011, 16:54

Ah, danke :D
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
Jetzt sind die guten alten Zeiten, nach denen wir uns in zehn Jahren zurücksehnen.
Peter Ustinov

Jeder Mensch macht Fehler. Das Kunststück liegt darin, sie dann zu machen, wenn keiner zuschaut.
Peter Ustinov
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.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

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
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Meishere
User
Beiträge: 27
Registriert: Montag 24. Januar 2011, 16:54

Ok, während ich meinen Beitrag schreiben wollte, gab's ja schon Erklärungen :D

Dann habe ich 'join' bisher falsch verstanden. :D
Ich dachte join fügt einfach 2 strings zusammen. Jetzt weiß ich auch was man vor join schreiben muss :D
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 :D Hab dich nur übersehen ;)
EDIT2: Jetzt versteh ich auch die englische Erklärung in der doc :D Hatte ich glatt falsch gelesen/überlesen
Jetzt sind die guten alten Zeiten, nach denen wir uns in zehn Jahren zurücksehnen.
Peter Ustinov

Jeder Mensch macht Fehler. Das Kunststück liegt darin, sie dann zu machen, wenn keiner zuschaut.
Peter Ustinov
Antworten