Hallo, ein Neuling steckt in Schwierigkeiten :)

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.
hoola
User
Beiträge: 18
Registriert: Samstag 7. Juli 2012, 08:44

Hallo liebe Leute!
Ich bin neu hier und stelle mich daher kurz vor .. mein name ist hoola (haha) und ich bin Student an einer Fachhochschule. Dort studiere ich Anlagentechnik. Zu meinem Studium gehört auch Informatik.
Da nun bald wieder die Prüfungen anstehen bin ich natürlich fleißig am lernen und programmieren, dabei passiert es nicht selten, dass ich bei einigen Problemen einfach nicht weiter komme bzw. sehr sehr lange brauche um die Lösung selbst zu finden.
Daher dachte ich, es sei vielleicht ratsam sich hier anzumelden und bei Bedarf um Hilfe zu bitten, damit das lernen ein bisschen schneller von statten geht.
So .. genug zu mir, nun zu meinem ersten Problem.

In einer Aufgabe geht es darum, dass auf einer Neugeborenen Station in eine Liste eingetragen wird, ob ein Neugeborenes männlich ('m') oder weiblich ('w') ist. Leider lässt das Programm auch fehleingaben zu. So kommt es, dass eine Liste z.B. so aussieht:

Code: Alles auswählen

['w', 'w', 'm', 's', 'w', 'm', 'm']
Aufgabe ist es, eine Funktion zu schreiben, die an den Falsch eingegebenen stellen None zurückgibt:

Code: Alles auswählen

['w', 'w', 'm', None, 'w', 'm', 'm']
Und das ist mein bisheriger Quelltext dazu:

Code: Alles auswählen

def werteAus(liste):
    i=0
    while i < len(liste):
        if liste[i] != 'm' or 'w':
            liste.remove(liste[i])
            liste.insert(i, None)
        i += 1
    return liste

geschlechterliste=['w', 'w', 'm', 's', 'w', 'm', 'm']
werteAus(geschlechterliste)
print(geschlechterliste)
Leider gibt mir dieser Code nur None zurück, an jeder Stelle.
Ich hab schon zig andere Varianten ausprobiert, aber nie das gewünschte Ergebnis bekommen.
Ich schätze mal, das Problem liegt bei

Code: Alles auswählen

if liste[i] != 'm' or 'w':
.

Habt ihr vielleicht einen Tip für mich?

Peace, hoola.

EDIT!!!

Tja, nach dem Aufstehen geht alles ein bisschen besser .. nun hab ich die Lösung doch gerade gefunden, welch Wunder! :)
Mein Code sieht jetzt folgender maßen aus:

Code: Alles auswählen

def werteAus(liste):
    i=0
    m = 0
    w = 0
    n = 0 
    while i < len(liste):
        if liste[i] is 'm':
            m +=1
        elif liste[i] is 'w':
            w += 1
        else:
            liste.remove(liste[i])
            liste.insert(i, None)
            n += 1

        i += 1
    return liste

geschlechterliste=['w', 'w', 'm', 's', 'w', 'm', 'm']
werteAus(geschlechterliste)
print(geschlechterliste)
Die Variablen m, w und n zähle ich hoch, weil in der Aufgabenstellung weiterhin steht, dass anschließend ein Tupel ausgegeben werden soll, in dem steht wieviele männlich, weiblich und wieviele Fehleingaben gemacht worden sind.
Das doofe ist, dass ich nur auf die Lösung gekommen bin, weil ich die 2. Teilaufgabe erstmal lösen wollte.
Hätte man den ersten Quellcode von mir vielleicht auch irgendwie zum laufen gebracht?

Peace, hoola.
Zuletzt geändert von Hyperion am Samstag 7. Juli 2012, 16:34, insgesamt 2-mal geändert.
Grund: Code in Python-Code Tags gesetzt.
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

hoola hat geschrieben:

Code: Alles auswählen


            liste.remove(liste[i])
          
Das Problem liegt auch hier: Schau dir in der Dokumentation mal genau an, was list.remove macht und was es als Parameter erwartet (Hinweis: Es ist nicht die Position, die gelöscht werden soll.)

Nachtrag:
Und ja, die Abfrage sollte besser geklammert werden:

Code: Alles auswählen

if (liste[i] != 'm') or (liste[i] != 'w'):
Würde ich schreiben als:

Code: Alles auswählen

if liste[i] not in ['m', 'w']:
Nachtrag 2:

Ich glaub ich bin noch nicht wach; list.remove ist kein Problem und die Klammern brauchts in der Abfrage auch nicht. :roll:
Zuletzt geändert von Pekh am Samstag 7. Juli 2012, 09:25, insgesamt 1-mal geändert.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

hoola hat geschrieben:Ich schätze mal, das Problem liegt bei

Code: Alles auswählen

if liste[i] != 'm' or 'w':
.
Die Syntax die du da verwendest tut nicht das, was du glaubst. Zuerst wir der erste Ausdruck ausgewertet und wenn der falsch ist, dann wird der zweite zurückgegeben.

Code: Alles auswählen

>>> value = 'm'
>>> print value != 'm' or 'w'
w
>>> value = 'w'
>>> print value != 'm' or 'w'
True
>>> value = 'a'
>>> print value != 'm' or 'w'
True
Die Abfrage sollte man besser so schreiben:

Code: Alles auswählen

if liste[i] not in ('m', 'w')
hoola
User
Beiträge: 18
Registriert: Samstag 7. Juli 2012, 08:44

Code: Alles auswählen

if liste[i] not in ['m', 'w']:
Nachtrag 2:

Ich glaub ich bin noch nicht wach; list.remove ist kein Problem und die Klammern brauchts in der Abfrage auch nicht. :roll:
Aber danke für den Tip mit der Schreibweise, sieht wesentlich eleganter aus!
Aber was ist jetzt der Unterschied zwischen

Code: Alles auswählen

if liste[i] not in ['m', 'w']:
und

Code: Alles auswählen

if liste[i] not in ('m', 'w'):
??
Ist beides möglich?
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

hoola hat geschrieben:Aufgabe ist es, eine Funktion zu schreiben, die an den Falsch eingegebenen stellen None zurückgibt
Du änderst zusätzlich noch die Originaldaten und wenn das nicht gefordert ist halte ich das für einen Fehler. Ich würde eine neue Liste aufbauen. Anschließend würde ich die bestehende Liste durchlaufen und in die neue Liste entweder den korrekten vorhandenen Wert oder None eintragen.

Code: Alles auswählen

data = ['w', 'w', 'm', 's', 'w', 'm', 'm']

def clear_entries(entries):
    cleaned_data = []
    for entry in entries:
        if entry in ('m', 'w'):
            cleaned_data.append(entry)
        else:
            cleaned_data.append(None)
    return cleaned_data

print clear_entries(data)
Das ist jetzt eine explizite Langfassung des Algorithmus.


Falls die Originaldaten doch geändert werden sollen, dann muss man explizit jedes Element der ursprünglichen Liste untersuchen und bei Bedarf verändern.

Code: Alles auswählen

def clear_entries(entries):
    def get_mapping(value):
        return value if value in ('m', 'w') else None
    return map(get_mapping, entries)
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

hoola hat geschrieben:Aber was ist jetzt der Unterschied zwischen

Code: Alles auswählen

if liste[i] not in ['m', 'w']:
und

Code: Alles auswählen

if liste[i] not in ('m', 'w'):
??
Das eine ist eine Liste, das andere ein Tupel. Beides sind Sequenzen.

Code: Alles auswählen

>>> print type(['m', 'w'])
<type 'list'>
>>> print type(('m', 'w'))
<type 'tuple'>
Ein Tupel ist allerdings unveränderlich (immutable). Das führt dazu, dass intern gewisse Performanceoptimierungen gemacht werden können, die hier allerdings sicher nicht auffallen werden.
hoola
User
Beiträge: 18
Registriert: Samstag 7. Juli 2012, 08:44

Also die Augabenstellung hieß genau so
Schreiben Sie eine Funktion werteAus(), der als Parameter die Liste üubergeben
wird und die
• falsche Einträage ('s') durch den Nichts-Wert None ersetzt
Das ließt sich für mich jetzt erstmal so, als wenn die Originale Liste geändert werden soll.
Allerdings finde ich persönlich auch die Variante mit der neuen Liste besser .. ich denke in so einem Fall würde der Professor trotzdem volle Punktzahl geben, denn das Niveau bei uns ist (wie man anhand der Aufgaben sicher sehen kann) relativ niedrig.

Deinen unteren Code mit 'get_mapping' usw. verstehe ich aber leider nicht so ganz. Den muss ich mal kurz auf mich wirken lassen :)
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

hoola hat geschrieben:

Code: Alles auswählen

        if liste[i] is 'm':
Hierzu ist noch dringend eine Anmerkung möglich. Du solltest Werte auf keinen Fall mit is vergleichen. Dafür gibt es das doppelte Gleichheitszeichen als Operator. is prüft Objektidentität, nicht Wertegleichheit.

Ich darf das mal demonstrieren:

Code: Alles auswählen

>>> x = 1
>>> x is 1
True
>>> x = 32768
>>> x is 32768
False
>>> x == 32768
True
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

hoola hat geschrieben:Deinen unteren Code mit 'get_mapping' usw. verstehe ich aber leider nicht so ganz. Den muss ich mal kurz auf mich wirken lassen :)
Ja, hier muss man erst das Konzept verstehen. map wendet eine Funktion der Reihe nach auf jeden einzelnen Listeneintrag an. In diesem Fall wird die Funktion get_mapping auf jedes Element der Liste entries angewendet.

Jetzt wird es relativ einfach. Die Funktion erhält den aktuellen Wert als Parameter und gibt den neuen Wert zurück. In diesem Fall bekommt man also entweder ein 'm', 'w' oder ein None. Schon ist der Wert geändert.


Vielleicht fällst du ja auch noch über die Syntax.

Code: Alles auswählen

    def get_mapping(value):
        return value if value in ('m', 'w') else None
Das ließe sich auch so schreiben:

Code: Alles auswählen

    def get_mapping(value):
        if value in ('m', 'w'):
            return value
        else:
            return None

Wenn du tatsächlich die Originalliste ändern möchtest ohne map zu verwenden, dann ist das Rumgefummel mit delete und insert natürlich völliger Overkill. Du brauchst doch nur bei Bedarf den Wert zu ändern und das ist deutlich simpler und weniger kostenaufwändig als Elemente aus der Liste zu entfernen und einzufügen.

Code: Alles auswählen

def clear_entries(entries):
    pos = 0
    for entry in entries:
        if entry not in ('m', 'w'):
            entries[pos] = None
        pos += 1
    return entries
Nun ist es aber eher unpraktisch, den Zähler für die Position selber mitzuschleifen. Python bietet da mit enumerate eine Lösung.

Code: Alles auswählen

def clear_entries(entries):
    for pos, entry in enumerate(entries):
        if entry not in ('m', 'w'):
            entries[pos] = None
    return entries
Zuletzt geändert von /me am Samstag 7. Juli 2012, 10:06, insgesamt 1-mal geändert.
hoola
User
Beiträge: 18
Registriert: Samstag 7. Juli 2012, 08:44

/me hat geschrieben:
hoola hat geschrieben:Aber was ist jetzt der Unterschied zwischen

Code: Alles auswählen

if liste[i] not in ['m', 'w']:
und

Code: Alles auswählen

if liste[i] not in ('m', 'w'):
??
Das eine ist eine Liste, das andere ein Tupel. Beides sind Sequenzen.

Code: Alles auswählen

>>> print type(['m', 'w'])
<type 'list'>
>>> print type(('m', 'w'))
<type 'tuple'>
Ein Tupel ist allerdings unveränderlich (immutable). Das führt dazu, dass intern gewisse Performanceoptimierungen gemacht werden können, die hier allerdings sicher nicht auffallen werden.
Richtig .. da hätte ich auch selbst drauf kommen müssen. Allerdings wusste ich das mit der Performanceoptimierung noch nicht. Aber wie du schon sagtest, das fällt hier nicht weiter auf und ist in meinem Infokurs sicher nicht so wichtig. Trotzdem interessant.

Mein ganzer Quelltext mit der 2. Teilaufgabe (nämlich ein Tupel mit der Anzahl der männlein, weiblein und Fehleingaben auszugeben) sieht mitlerweile so aus

Code: Alles auswählen

def werteAus(liste):
    i=0
    m = 0
    w = 0
    n = 0
    tupel=()
    while i < len(liste):
        if liste[i] == 'm':
            m +=1
        elif liste[i] == 'w':
            w += 1
        else:
            liste.remove(liste[i])
            liste.insert(i, None)
            n += 1

        i += 1
    tupel=(m,w,n)
    print(tupel)
    return liste

geschlechterliste=['w', 'w', 'm', 's', 'w', 'm', 'm']
werteAus(geschlechterliste)
print(geschlechterliste)
Sicher nicht das eleganteste, aber es funktioniert immerhin.
Noch irgendwelche bemerkungen dazu?

Übrigens, danke für die schnellen und kompetenten Antworten, hätte nich gedacht, dass sich so schnell jemand meldet.

EDIT:
Hierzu ist noch dringend eine Anmerkung möglich. Du solltest Werte auf keinen Fall mit is vergleichen. Dafür gibt es das doppelte Gleichheitszeichen als Operator. is prüft Objektidentität, nicht Wertegleichheit.

Ich darf das mal demonstrieren:
Kannst du das noch weiter erklären?
Warum ausgerechnet bei 32768?
Zuletzt geändert von Hyperion am Samstag 7. Juli 2012, 16:40, insgesamt 1-mal geändert.
Grund: Code in Python-Code Tags gesetzt.
hoola
User
Beiträge: 18
Registriert: Samstag 7. Juli 2012, 08:44

/me hat geschrieben: Vielleicht fällst du ja auch noch über die Syntax.

Code: Alles auswählen

    def get_mapping(value):
        return value if value in ('m', 'w') else None
Das ließe sich auch so schreiben:

Code: Alles auswählen

    def get_mapping(value):
        if value in ('m', 'w'):
            return value
        else:
            return None
Ja ich sehe, die Syntax war es wirklich was mich verwirrt hat :D
Aber nachdem ich das jetzt gesehen hab, macht auch

Code: Alles auswählen

    def get_mapping(value):
        return value if value in ('m', 'w') else None
sinn.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Da stimmen gleich mehrere Dinge in deinem Code nicht:

- Wenn du ein Element in einer Liste ändern willst, dann musst du dieses nicht erst löschen und dann wieder einfügen. Abgsehen davon, dass das unglaublich schlechter Stil ist, muss im schlimmsten Fall zwei Mal die gesamte Liste kopiert werden. Wenn du ein Element an der Stelle i ändern willst, dann weise diesem Element einfach einen neuen Wert zu:

Code: Alles auswählen

liste[i] = "neuer wert"
- Weiter ist die while-Schleife hier der falsche Ansatz. Wenn du vorher sicher bist, wie viele Iterationsschritte du durchführst, dann ist eine for-Schleife die richtige Wahl. In diesem Fall brauchst du noch den Index, dazu kannst du enumerate verwenden:

Code: Alles auswählen

for index, element in enumerate(liste):
    if element == 'm':
        m += 1
    ...
    else:
        liste[index] = None
        n += 1
- Auch musst du keine Variablen anlegen, die Zeile ``tupel = ()`` ist also vollkommen überflüssig. Tupels werden auch nicht Klammern erzeugt, sondern mit Kommas. Die Zeile ``tupel=(m,w,n)`` sollte also einfach ``tupel = m, w, n`` heißen. Die Frage ist allerdings, warum du überhaupt ein Tupel erstellst, du könntest die drei Werte auch direkt mittels print ausgeben. Wobei ich davon ausgehe, dass die Ausgabe nur zum Testen da ist.

- Auch die Namen sind sehr schlecht gewählt. m, w, und n sagen gar nicts über den Inhalt aus. Genau so wenig wie tupel, liste oder geschlechterliste. Bei den letztgenannten kommt noch hinzu, dass sich durchaus der Typ mal ändern kann und dann müsstest du überall die Namen anpassen. Sonst wird es nur noch verwirrender. "werteAus" übertrifft alle Namen, es ist doch völlig klar, dass in einer Funktion irgend etwas ausgewertet wird. Vergebe Namen so, dass sie etwas Beschreiben: was wird gemacht oder was haben die Werte für eine Bedeutung.
Zuletzt geändert von Hyperion am Samstag 7. Juli 2012, 16:40, insgesamt 1-mal geändert.
Grund: Fehlenden schließenden Code-Tag ergänzt
Das Leben ist wie ein Tennisball.
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

EyDu hat geschrieben:Sonst wird es nur noch verwirrender. "werteAus" übertrifft alle Namen, es ist doch völlig klar, dass in einer Funktion irgend etwas ausgewertet wird. Vergebe Namen so, dass sie etwas Beschreiben: was wird gemacht oder was haben die Werte für eine Bedeutung.
Hier muss man hoola in Schutz nehmen - der Name steht so in der Aufgabe:
Schreiben Sie eine Funktion werteAus(), ...
In specifications, Murphy's Law supersedes Ohm's.
BlackJack

@hoola: Falls die Aufgabe wirklich so gestellt ist, dann ist sie schlecht gestellt. Die Funktion vermengt bereinigen der Daten, Zählen der Vorkommen, und dann auch noch die Ausgabe der Anzahlen. Das ist viel zu viel Unterschiedliches in einer Funktion. Die man damit auch nicht wirklich sinnvoll wiederverwenden kann. Es macht in der Regel Sinn Eingabe, Verarbeitung, und Ausgabe jeweils zu trennen. Dann ist die Verarbeitung unabhängig davon ob die Daten vom Benutzer über eine Textkonsole oder eine GUI eingegeben werden, oder ob die Daten aus einem Web-Formular stammen, oder einer Datei, oder Datenbank und so weiter. Das gleiche gilt für die Ausgabe.

Von falschen Werten bereinigen und Histogram erstellen könnte man auch sinnvoll in zwei unabhängige Funktionen aufteilen.

Dass das (fiktive) Programm auch Fehleingaben zulässt kann man übrigens auch positiv sehen, denn 'm' und 'w' sind nicht die einzigen Möglichkeiten die in der Praxis vorkommen. Es sind zwar die Häufigsten, aber sollte doch ein anderer Fall eintreten, wären de facto sowohl 'm' als auch 'w' die eigentlichen Fehleingaben.
hoola
User
Beiträge: 18
Registriert: Samstag 7. Juli 2012, 08:44

Ohwei, ich merke hier sind die Profis am Werk.
Also ich danke euch für die kritik und die verbessrungen, aber mein persönliches Hauptaugenmerk liegt in erster Linie darin, dass das Programm das tut was es tun soll.
Ich weiß, dass Profis bei diesem Programmierstil natürlich das Brechen kriegen, aber noch auf Programmiergepflogenheiten zu achten würde meinen persönlichen Rahmen sprengen.
Ich bin kein großes Programmierer Talent (wie ihr ja bereits gesehen habt) und von daher versuche ich einfach das beste zu geben um die Prüfung bestmöglich zu bestehen .. also verzeiht, wenn ich einige eurer Tipps zwar zur kenntnis nehme, aber nicht weiter auf sie eingehe. Sowas wäre möglich, wenn ich mehr Zeit hätte. Leider schreibe ich die Prüfung aber schon bald.

Einiges war aber trotzdem sehr interessant!
Z.B., dass man ein Element nicht löschen und ein neues eintragen muss, sondern dem vorhandenen Element einfach einen neuen Wert zuweist. Das ist natürlich wesentlich einfacher und daher stilistisch besser .. das sehe ich ein und werd es auch gleich ändern.
Dass Tupel nicht zwingend in Klammern gefasst werden müssen wusste ich ebenfalls nicht .. in meinem Script sah es so aus, dass sich Litsen und Tupel von () bzw. [] unterscheiden. Und die Ausgabe des Tupels ist ebenfalls Bestand der Aufgabenstellung (vom Prof. vorgegeben).

Zur for-Schleife .. ich hatte erst eine for-Schleife programmiert, erschien mir intuitiv auch sinnvoller. Als ich allerdings nichts das gewünschte Ergebnis bekam, habe ich alle möglichen Sachen ausprobiert um auf die Lösung zu kommen .. unter anderem auch einen anderen Schleifen-Typ zu wählen. Aber generell ist es doch so, dass man jeder for-Schleife durch eine while-Schleife ersetzen kann und andersrum, oder nicht?

EDIT: hier mal die ganze Klausur, damit ihr einschätzen könnt, auch welchem Niveau hier programmiert wird und damit es im Weiteren nicht mehr zu Missverständnissen bezüglich der Aufgabenstellungen kommt.
http://www.file-upload.net/download-452 ... 2.pdf.html

Peace, hoola.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Natürlich kannst du jede for-Schleife durch eine while-Schleife ersetzen, oft ist eine for-Schleife aber eben besser geeignet. Sowohl konzeptionell als auch von der Länge des Codes. Wenn du jedes Element einer Liste nacheinander anpackst und eine Elemente löscht oder hinzufügst, dann ist eine for-Schleife immer die richtige Wahl.

Dass du bei einer nahenden Klausur nicht alle Hinweise umsetzen kannst ist verständlich, die meisten sachen, wie zum Beispiel die Benennung, solltest du aber schon beachten. Das wird dir auch in der Klausur helfen (und der Person, die sich deine Arbeit anschauen muss). Auf jeden Fall sieht die Klausur fair und gut schaffbar aus. Auf jeden Fall schon mal viel Erfolg.
Das Leben ist wie ein Tennisball.
hoola
User
Beiträge: 18
Registriert: Samstag 7. Juli 2012, 08:44

@EyDu
Dein Lösungsvorschlag mit der Funktion enumerate() ist zwar gut und schön, allerdings hatten wir sowas z.B. nie in der Vorlesung. Ich denke, dass der Prof beabsichtigt sich nur auf das nötigste Vokabular zu beschränken. Sicher gibt es noch 1000 andere tolle Funktionen mit denen man Aufgaben ganz einfach und geschickt lösen kann. Allerdings würde das sicher unsere 3 Semester Wochenstunden sprengen.

Kann man das mit dem enumerate() nicht auch anders lösen?

Ok und das mit der Benennung werde ich mir mal versuchen anzugewöhnen bzw. mehr darüber nachdenken. Bisher habe ich einfach die erst beste Bezeichnung verwendet, die mir beim lesen der Aufgabe in den Kopf geschossen kam. :)

EDIT:
Hab meinen nun Code verändert, nur funktioniert das ersetzen des None nicht mehr. :(

Code: Alles auswählen

def werteAus(liste):

    m = w = n = 0
    
    for zeichen in liste:
        if zeichen == 'm':
            m +=1
        elif zeichen == 'w':
            w += 1
        else:
            zeichen = None
            n += 1
Was stimmt denn jetzt wieder nicht?
Er hat Probleme mit dem "zeichen = None", das ist klar.
Nun ist die for-Schleife an allen 'm' und 'w' vorbei gekommen bis sie auf das 's' stößt. Dann müsste die Schleife doch in den else: Zweig gehen oder etwa nicht?
Zuletzt geändert von Hyperion am Samstag 7. Juli 2012, 16:33, insgesamt 1-mal geändert.
Grund: Code in Python-Code Tags gesetzt.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

@hoola: Bitte setze Python-Code doch in die speziellen Python-Code-Tags: [ code=python ] Dein Code [ /code ] (natürlich ohne die Leerzeichen) Damit wird der Code hübsch mit Syntax Highlighting verschönert :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
hoola
User
Beiträge: 18
Registriert: Samstag 7. Juli 2012, 08:44

Oh man ich dreh durch!
Bin bei der 2. Teilaufgabe und krieg es einfach nicht hin, eine Fehleingabe abzufangen.
Den Neugeborenen werden jetzt Name, Vorname und Geschlecht zugeordnet.
Eine Fehleingabe des Geschlechts soll abgefangen werden .. so schwer kann das doch nicht sein!
Könnt ihr mir ein paar Tipps geben? (bitte keine Code .. nur nen Denkansatz)

Code: Alles auswählen

def neuesKind(kinderliste):
    name = vorname = geschlecht = ''
    while name == '':
        name = input('Nachname: ')
    while vorname == '':
        vorname = input('Vorname: ')
    
[b]AB HIER sollen wir selber weiter programmieren.[/b]
        
    kinderliste = [name, vorname, geschlecht.lower()]
    
    return kinderliste

liste = []
print(neuesKind(liste))
@Hyperion: done :)
BlackJack

@hoola: Wenn man Element *und* Index benötigt ist `enumerate()` der vorgesehene Weg. Es geht auch anders, aber eigentlich nicht einfacher. Es gibt in der Tat tausende Funktionen, aber `enumerate()` gehört zu denen, die ohne explizit importiert werden zu müssen zur Verfügung stehen. Das gehört also zum Kernbereich der Sprache. Sind in den 3 SWS schon die Stunden inbegriffen, die ihr euch ausserhalb der Vorlesung/Übung damit beschäftigt? Bei uns (Uni) wurde immer betont dass die Veranstaltungen nicht die Programmiersprachen lehren sollen, sondern dass man sich das selbst aneignen muss.
Antworten