Typdefinition Problem list

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
rfr-mailbox@gmx.de
User
Beiträge: 14
Registriert: Mittwoch 28. Oktober 2015, 12:48

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
Benutzeravatar
sparrow
User
Beiträge: 4501
Registriert: Freitag 17. April 2009, 10:28

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.
Benutzeravatar
snafu
User
Beiträge: 6830
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Wie die Fehlermeldung schon sagt, kann man einem Funktionsaufruf keinen String zuweisen.

Was du willst, ist wahrscheinlich:

Code: Alles auswählen

for zeile in ef:
    ...
Das sind absolute Grundlagen, die man in so ziemlich jedem Python-Tutorial finden kann...
rfr-mailbox@gmx.de
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?

----------------------------

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] = ","
Benutzeravatar
sparrow
User
Beiträge: 4501
Registriert: Freitag 17. April 2009, 10:28

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.
Benutzeravatar
__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:

Code: Alles auswählen

        for i in range(1, len(inhalt)):
            if inhalt[i] != "\n" or i % 4 == 0:
                continue
            inhalt[i] = ","
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:

Code: Alles auswählen

        for i in range(1, len(inhalt)):
            if not (inhalt[i] != "\n" or i % 4 == 0):
                inhalt[i] = ","
Beziehungsweise:

Code: Alles auswählen

        for i in range(1, len(inhalt)):
            if inhalt[i] == "\n" and i % 4 != 0:
                inhalt[i] = ","
sparrow hat ja schon geschrieben das man eher eine neue Liste aufbaut als in einer vorhandenen Elemente austauscht. Das könnte dann so aussehen:

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
Benutzeravatar
noisefloor
User
Beiträge: 4149
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
zeile.append() = ef.read()
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.

Wobei das Konstrukt oben nie funktionieren kann, das hat nichts nur mit `append` zu tun - siehe vorherige Erklärungen.

Gruß, noisefloor
Antworten