@Pythagon: Die Fehlermeldung sagt das man einem Funktionsaufruf nichts zuweisen kann. Was sollte das denn auch bedeuten? Also ``frobnicate() = 42`` — was würde das denn Deiner Meinung nach für einen Effekt haben sollen? Python kann damit nichts anfangen. So etwas kann man beispielsweise in C++ machen wenn `frobnicate()` eine Referenz zurückgeben würde, aber in Python kann man nur an Namen und Attribute Werte zuweisen, nicht an Funktionsaufrufe.
Wobei die Fehlermeldung nicht zum Quelltext passt, denn dort steht ``cookiecrumb([z + 1]) = element([Start + 1])`` während in der Fehlermeldung ``cookiecrumb.chr([z + 1]) = element([Start + 1])`` steht. Macht natürlich keinen Unterschied, weil es egal ist wie der Ausdruck aussieht, der vor den Aufrufklammern steht, es bleibt ein Aufruf.
Du hast auch an anderer Stelle runde Klammern die keinen Sinn machen, aber nicht zu einem Fehler führen. Sollte man trotzdem nicht machen.
`element` und `Start` sind nirgends definiert.
`cookiecrumb` wird mit der leeren Zeichenkette initialisiert und dann wird in einer Schleife über jedes Zeichen in dieser Zeichenkette iteriert – da ist aber keines, also wird die Schleife auch nicht ausgeführt.
Die Bedingung ``not … is …`` würde man als ``… is not …`` schreiben. Allerdings ist ``is`` hier der falsche Operator, denn bei Zeichenketten ist nicht garantiert, dass die tatsächlich *identisch* dein müssen wenn sie gleich sind:
Code: Alles auswählen
In [28]: a
Out[28]: 'equal but not identical'
In [29]: b
Out[29]: 'equal but not identical'
In [30]: a == b
Out[30]: True
In [31]: a is b
Out[31]: False
``is`` und ``is not`` macht nur bei Singletons wie ``None`` Sinn, oder wenn man tatsächlich die Identität und nicht nur den Wert vergleichen will – was eher selten vorkommt. Um auf Werte(un)gleichheit zu testen sind die Operatoren ``==`` und ``!=`` da.
Zeichenketten sind in Python unveränderbar, man kann da also keine Zeichen einem Index zuweisen. Und ein `chr`-Attribut haben Zeichenketten ebenfalls nicht. Wie bist Du denn auf die Idee gekommen?
Mit der Laufvariable der Schleife (`y`) wird in der Schleife gar nichts gemacht.
Gross-/Kleinschreibung ist in Python wichtig. `start` ist ein anderer Name als `Start`. Man schreibt Namen in Python klein_mit_unterstrichen. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase). `Start` und `Tags` wären also `start` und `tags`.
Da sind auch einige schlechte Namen. Finde mal für `y` einen sinnvollen Namen, dann fällt Dir vielleicht auf wie unsinnig kompliziert das in der Schleife ist. Wobei selbst dann würde man an der Stelle die Zeichen nicht einzeln verarbeiten. Schau Dir mal die Operationen auf Zeichenketten und Sequenztypen generell an – einen Teil daraus mit Angabe von Anfangs- und Endposition bekommt man ganz einfach ohne Schleife per „slicing“.
`find()` würde ich nicht verwenden weil der Rückgabewert bei Misserfolg ein gültiger Index ist, und man da immer dran denken muss diesen Fall explizit zu berücksichtigen. Entweder in dem man den Rückgabewert testet, oder in dem man vorher testet ob das was man sucht überhaupt vorhanden ist. Das macht die gleiche Arbeit dann aber unsinnigerweise zweimal. Die `index()`-Methode hat das Problem nicht.
`count` wird definiert aber nicht verwendet.
Die 21 die da addiert wird ist leicht ”magisch”. An der Stelle sollte man die gesuchte Zeichenkette als Variable oder Konstante definieren, insbesondere wenn man den gleichen Wert mehrfach verwendet, entweder direkt oder davon abgeleitete Werte wie diese 21.