Mahlzeit!!
folgendes snippet:
-------------------------8<-----------------
zeile = []
zeile.append() = ef.read() # einlesen aller Elemente
a = len(zeile)
b = zeile.count("\n")
if a == 0:
print("nix gelesen!")
exit()
for i in range (1,a) :
if zeile != "\n":
continue
if zeile =="\n" and i % 4 ==0:
continue
else: zeile = ","
----------------------------8<-----------------
zuerst wird eine Liste erzeugt, weil ich einen mutable sequentiellen
Datentyp brauche. Im letztem statement kommt ein Error:
SyntaxError: cannot assign to function call here. Maybe you meant '==' instead of '='?
zeile wird eingentlich als list erwartet, aber als string geliefert, der
unmutable ist.
SyntaxError: cannot assign to function call here. Maybe you meant '==' instead of '='?
Ich bin derzeit ratlos. Kann jemand weiter helfen?
Gruss
Robert
Typdefinition Problem list
Kannst du bitte den Code vernünftig posten?
In Python sind Einrückungen essentiell. Also müssen die erhalten bleiben.
Poste den Code bitte zwischen code Tags. Die erscheinen automatisch, wenn du im vollständigen Editor den </> Button drückst. Dazwischen gehört dein Code. Copy+Paste mit den entsprechenden Einrückungen.
Dazu bitte den _volständigen_ Stacktrace/Traceback. Exakt der, der bei deinem Programm auftritt.
In Python sind Einrückungen essentiell. Also müssen die erhalten bleiben.
Poste den Code bitte zwischen code Tags. Die erscheinen automatisch, wenn du im vollständigen Editor den </> Button drückst. Dazwischen gehört dein Code. Copy+Paste mit den entsprechenden Einrückungen.
Dazu bitte den _volständigen_ Stacktrace/Traceback. Exakt der, der bei deinem Programm auftritt.
Wie die Fehlermeldung schon sagt, kann man einem Funktionsaufruf keinen String zuweisen.
Was du willst, ist wahrscheinlich:
Das sind absolute Grundlagen, die man in so ziemlich jedem Python-Tutorial finden kann...
Was du willst, ist wahrscheinlich:
Code: Alles auswählen
for zeile in ef:
...
-
- User
- Beiträge: 14
- Registriert: Mittwoch 28. Oktober 2015, 12:48
-
Ich sehe mich veranlasst, die Frage neu zu formulieren.
Ich habe in der ersten zeile eine veränder
liche Struktur vom Typ list erstellen wolle.
Wieso wird das zum unveränderlichen String?
----------------------------
Ich sehe mich veranlasst, die Frage neu zu formulieren.
Ich habe in der ersten zeile eine veränder
liche Struktur vom Typ list erstellen wolle.
Wieso wird das zum unveränderlichen String?
----------------------------
Code: Alles auswählen
zeile = []
zeile.append() = ef.read() # einlesen aller Elemente
a = len(zeile)
b = zeile.count("\n")
if a == 0:
print("nix gelesen!")
exit()
for i in range (1,a) :
if zeile[i] != "\n":
continue
if zeile[i] =="\n" and i % 4 ==0:
continue
else: zeile[i] = ","
Ich sehe mich veranlasst auf meine Antwort zu verweisen.
Kompletter Traceback?
Wie kommst du zu deiner Vermutung, dass da etwas zu einem String wird?
Weiter:
exit() verwendet man nicht, weil das nicht dokumentiert ist und nur für de interaktiven Interpreter existiert. Man beendet ein Programm indem man es zu einem.Ende kommen lässt. Ist das nicht der Fall, stimmt zumeist etwas mit der Struktur nicht.
Was ist das schlecht benannte Objekt "ef"?
Wird das erste empfangene Zeichen absichtlich ignoriert? Oder ist Das die Falschwendung des range Antipatterns?
Warum steht die Zeile nach dem "else" nicht eingerückt in der nächsten Zeile?
Gelebte Praxis ist, eine neue Liste neu zu erstellen statt sie zu verändern, wenn man darüber iteriert.
Kompletter Traceback?
Wie kommst du zu deiner Vermutung, dass da etwas zu einem String wird?
Weiter:
exit() verwendet man nicht, weil das nicht dokumentiert ist und nur für de interaktiven Interpreter existiert. Man beendet ein Programm indem man es zu einem.Ende kommen lässt. Ist das nicht der Fall, stimmt zumeist etwas mit der Struktur nicht.
Was ist das schlecht benannte Objekt "ef"?
Wird das erste empfangene Zeichen absichtlich ignoriert? Oder ist Das die Falschwendung des range Antipatterns?
Warum steht die Zeile nach dem "else" nicht eingerückt in der nächsten Zeile?
Gelebte Praxis ist, eine neue Liste neu zu erstellen statt sie zu verändern, wenn man darüber iteriert.
- __blackjack__
- User
- Beiträge: 13919
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@rfr-mailbox@gmx.de: Der Quelltext enthält ja immer noch das Problem, dass man einem Funktions- oder Methodenaufruf nichts zuweisen kann.
Also müssen wir raten was denn nun Dein Problem ist. Vermutlich hast Du das ``.append()`` dann einfach weggelassen. Dann wird `zeile` tatsächlich an eine unveränderliche Zeichenkette gebunden, denn das ist es was `read()` zurückgibt. Das ändert sich nicht auf magische Weise nur weil an den Namen vorher mal ein Wert mit einem anderen Datentyp gebunden war.
Nach einem ``if`` das zu einem ``continue`` führt, macht es keinen Sinn danach auf die gegenteilige Bedingung zu testen. Wenn der Programmablauf bis dort hin gekommen ist, dann ist die ganz offensichtlich erfüllt, weil ja sonst das ``continue`` verhindert hätte, dass der Ablauf bis dort kommt. Ein ``else`` ist auch unnötig wenn der ``if``-Block mit einem ``continue`` endet.
Dann machen ja die beiden ``if`` ein ``continue`` wenn die jeweilige Bedingung erfüllt ist. Statt das also in zwei ``if`` nacheinander zu schreiben, könnte man das auch einfach zu einem einzigen ``if`` zusammenfassen:
Jetzt sind ``continue`` aber sowieso generell doof, weil sie den Programmablauf beeinflussen und das nicht an der Einrückstruktur ablesbar ist, und weil man nicht mehr die Freiheit hat etwas an jedem Schleifenende zu machen, und herausziehen von Teilen aus einer Schleife in eine eigene Funktion wird dadurch auch behindert, und in den allermeisten Fällen kann man das ganz einfach auch ohne ``continue`` ausdrücken. So auch hier:
Beziehungsweise:
sparrow hat ja schon geschrieben das man eher eine neue Liste aufbaut als in einer vorhandenen Elemente austauscht. Das könnte dann so aussehen:
Also müssen wir raten was denn nun Dein Problem ist. Vermutlich hast Du das ``.append()`` dann einfach weggelassen. Dann wird `zeile` tatsächlich an eine unveränderliche Zeichenkette gebunden, denn das ist es was `read()` zurückgibt. Das ändert sich nicht auf magische Weise nur weil an den Namen vorher mal ein Wert mit einem anderen Datentyp gebunden war.
Nach einem ``if`` das zu einem ``continue`` führt, macht es keinen Sinn danach auf die gegenteilige Bedingung zu testen. Wenn der Programmablauf bis dort hin gekommen ist, dann ist die ganz offensichtlich erfüllt, weil ja sonst das ``continue`` verhindert hätte, dass der Ablauf bis dort kommt. Ein ``else`` ist auch unnötig wenn der ``if``-Block mit einem ``continue`` endet.
Dann machen ja die beiden ``if`` ein ``continue`` wenn die jeweilige Bedingung erfüllt ist. Statt das also in zwei ``if`` nacheinander zu schreiben, könnte man das auch einfach zu einem einzigen ``if`` zusammenfassen:
Code: Alles auswählen
for i in range(1, len(inhalt)):
if inhalt[i] != "\n" or i % 4 == 0:
continue
inhalt[i] = ","
Code: Alles auswählen
for i in range(1, len(inhalt)):
if not (inhalt[i] != "\n" or i % 4 == 0):
inhalt[i] = ","
Code: Alles auswählen
for i in range(1, len(inhalt)):
if inhalt[i] == "\n" and i % 4 != 0:
inhalt[i] = ","
Code: Alles auswählen
inhalt = list(datei.read())
if not inhalt:
print("nix gelesen!")
else:
inhalt = inhalt[:1] + [
"," if zeichen == "\n" and i % 4 != 0 else zeichen
for i, zeichen in enumerate(inhalt[1:])
]
“I am Dyslexic of Borg, Your Ass will be Laminated” — unknown
- noisefloor
- User
- Beiträge: 4149
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
Wobei das Konstrukt oben nie funktionieren kann, das hat nichts nur mit `append` zu tun - siehe vorherige Erklärungen.
Gruß, noisefloor
ist halt grundlegend falsch. So funktioniert die `append` Methode von Listen nicht. Die erwartet als Argument der Methode, was der Liste hinzugefügt werden soll. Siehe auch z.B. die entsprechende Sektion im Python Tutotial: https://docs.python.org/3/tutorial/datastructures.html.zeile.append() = ef.read()
Wobei das Konstrukt oben nie funktionieren kann, das hat nichts nur mit `append` zu tun - siehe vorherige Erklärungen.
Gruß, noisefloor