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
Überführen eines Programms in eine Funktionen
@Aneli98: ja, das ist richtig. Du übergibst die Liste an eine Funktion:
Ich hoffe es ist keine UNI-Klausur, sonst wäre nämlich der vorgegebene Code peinlich.
(Und setze Deinen Code bitte in eine Codebox).
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: 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:
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.
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)
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:
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:
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
))
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)
@ 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
Um es in Python-Sprache zu sagen: Ich kann grade mal meinen Namen in Python programmieren
Ich Danke dir
Klar kann man, sollte man aber nicht. Normalerweise benutzt man in Python Iteration als Prinzip:
Klassische for-loops erzeugt man dann, indem die aufzaehlbaren Dinge ein range werden:
Ein Anti-Pattern das man vermeiden sollt ist
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
das alles maximal haesslich uebergeht, dann ist dadurch wirklich nix gewonnen.
Code: Alles auswählen
for ding in aufzaehlbare_dinge:
Code: Alles auswählen
for index in range(start, end, schritt):
Code: Alles auswählen
for i in range(len(liste_von_dingen)):
ding = liste_von_dingen[i]
Wenn man jetzt wie in deinem Beispiel auch noch mit
Code: Alles auswählen
i = 0
while i < irgendwas:
i += 1