Überführen eines Programms in eine Funktionen

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.
Antworten
Aneli98
User
Beiträge: 4
Registriert: Samstag 6. Januar 2018, 11:55

Moin Ihr Lieben,

ich lerne grade für eine Infoklausur und habe schon bei der Aufgabenstellung ein Problem *peinlich*,

Gegeben:

wortliste = ['zischen', 'Zauberer', 'aber', 'aalen', 'Aalen', 'Zug', 'Zischen']
for i in range(len(wortliste)):
wortliste = wortliste.upper()
wortliste.sort()
i = 0
while i < len(wortliste):
if len(wortliste) < 6:
del wortliste

elif i > 0 and wortliste == wortliste[i-1]:
del wortliste

else:
i += 1
print(wortliste)

Die Ausgabe wäre hier ja ['ZAUBERER', 'ZISCHEN']. Soweit hab ich es begriffen.

Problem (Verständnis der Aufgabenstellung):

Überführen des Programms in eine Funktion mit dem Namen wortliste _bearbeiten, dem die zu bearbeitende Liste als Parameter übergeben wird. Anstelle einer Ausgabe erfolge eine Rückgabe. Teile der Gegebenen Programms können verwendet werden.

Meine Frage:

Wenn ich die Funktion schreibe, setzte ich dann die vorher definierte wortliste als Parameter (in die Parameterliste) ein?

def wortliste_bearbeiten (wortliste):
# Funktionsdefinition (Anweisungsblock)
return rueckgabewert

Ich hoffe ich jemand kann mir Helfen. Schönes WE
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@Aneli98: ja, das ist richtig. Du übergibst die Liste an eine Funktion:

Code: Alles auswählen

def wortliste_bearbeiten(wortliste):
    # tue was
    return neue_wortliste

Ich hoffe es ist keine UNI-Klausur, sonst wäre nämlich der vorgegebene Code peinlich.
(Und setze Deinen Code bitte in eine Codebox).
Aneli98
User
Beiträge: 4
Registriert: Samstag 6. Januar 2018, 11:55

@ kbr: Danke dir
Ist eine Hochschule. Ist das Programm falsch oder wie meinst du das? ich habe es noch nicht in Phyton eingegeben.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@Aneli98: Der Dozent mag vielleicht programmieren können, aber nicht in Python. Was Du siehst ist Python-Syntax, aber kein vernünftiges Python-Programm.

Mir ist klar, dass ihr lernen sollt Funktionen zu schreiben, die Vorlage selbst ließe sich aber als Einzeiler formulieren:

Code: Alles auswählen

wortliste = ['zischen', 'Zauberer', 'aber', 'aalen', 'Aalen', 'Zug', 'Zischen']
wortliste = sorted(set(wort.upper() for wort in wortliste if len(wort) > 6))
print(wortliste)
Das kannst Du natürlich nicht als Lösung der Aufgabe verwenden. Der von der Hochschule vorgegebene Code enthält aber so viele Python Anti-Pattern, dass ihr damit nicht vernünftig Python lernen könnt.
narpfel
User
Beiträge: 645
Registriert: Freitag 20. Oktober 2017, 16:10

Moin,

das Programm wird so schon funktionieren, aber es sieht wirklich hässlich aus. In idiomatischem Python würde man das ungefähr so schreiben:

Code: Alles auswählen

def filter_words(words):
    return sorted(set(
        word.upper() 
        for word in words 
        if len(word) >= 6
    ))
Insbesondere ist es in Python sehr unüblich, Listen zu verändern. Normalerweise wird eine neue Liste erstellt, die dann nur die gewünschten Elemente enthält, weil das Verändern einer Liste, über die iteriert wird, umständlich und fehleranfällig ist.

Außerdem benutzt man `for i in range(len(sequence)):` so gut wie nie, weil man direkt über die Elemente einer Sequenz (beispielsweise eine Liste) iterieren kann. Außerdem sollten konkrete Datentypen in Variablennamen nicht genannt werden, weil Code oftmals mit verschiedenen Datentypen klarkommt. `filter_words` kann zum Beispiel auch mit `set`s oder anderen iterierbaren Objekten arbeiten, die Strings enthalten, deshalb wäre es irreführend, das Argument `wortliste` zu nennen. Üblicherweise wird für Listen einfach der Name der Elemente im Plural gewählt.

Eine weitere Lösungsmöglichkeit wäre das hier, wobei das eventuell für einen Anfänger besser zu verstehen ist:

Code: Alles auswählen

def filter_words(words):
    uppercase_words = []
    for word in words:
        uppercase_words.append(word.upper())
        
    long_uppercase_words = []
    for word in uppercase_words:
        if len(word) >= 6:
            long_uppercase_words.append(word)
    
    long_uppercase_unique_words = set(long_uppercase_words)
    
    return sorted(long_uppercase_unique_words)
Aneli98
User
Beiträge: 4
Registriert: Samstag 6. Januar 2018, 11:55

@ kbr: Ahhso ja, dass ist einleuchtend. Ich bin mir aber auch fast sicher, dass unser Prof seine Studenten von der Informatik-Uni die Aufgaben für uns schreiben lässt. Da sind manchmal solch Spacige Aufgabenstellungen dabei, da braucht man erst ne Stunde um die Problemstellung zu verstehen. Viel zu überzogen für meinen Geschmack.

Um es in Python-Sprache zu sagen: Ich kann grade mal meinen Namen in Python programmieren ;)

Ich Danke dir
Aneli98
User
Beiträge: 4
Registriert: Samstag 6. Januar 2018, 11:55

@narpfel: ok, eine neue Liste erzeugen und dann die GROSSBUCHSTABEN da einfügen und nur Zählerschleife? Kann man die Zählerschleife in die While Schleife substituieren?
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Klar kann man, sollte man aber nicht. Normalerweise benutzt man in Python Iteration als Prinzip:

Code: Alles auswählen

for ding in aufzaehlbare_dinge:
Klassische for-loops erzeugt man dann, indem die aufzaehlbaren Dinge ein range werden:

Code: Alles auswählen

for index in range(start, end, schritt):
Ein Anti-Pattern das man vermeiden sollt ist

Code: Alles auswählen

for i in range(len(liste_von_dingen)):
     ding = liste_von_dingen[i]
Es ist mehr Schreibarbeit, weniger flexibel (wir sind von aufzaehlbaren dingen, welche potentiell sogar endlos sind, ploetzlich zu einer endlichen, wahlfrei zugreifbaren Datenstruktur gewechselt), und sieht auch noch haesslicher aus.

Wenn man jetzt wie in deinem Beispiel auch noch mit

Code: Alles auswählen

i = 0
while i < irgendwas:
    i += 1
das alles maximal haesslich uebergeht, dann ist dadurch wirklich nix gewonnen.
Antworten