Kommacode

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
namyelusbig
User
Beiträge: 3
Registriert: Freitag 28. August 2020, 10:10

Hallo liebes Python-Forum,

ich lese zur Zeit das. Buch "Routineaufgaben mit Python automatisieren" und ich soll in einer Übungsaufgabe ein Kommode schreiben. Ich habe eine Liste und ich soll eine Funktion schreiben die die Funktion so ausgibt, dass sie nach jedem Element ein Komma ausgibt und nach dem vorletzten Element das Wort "and" setzt.

Code: Alles auswählen

 def a(parameter):
    for i in range(len(spam)):
        return spam(i) + ","



spam = ["apples", "bananas", "tofu", "cat"]
a(spam)
print(spam)
Nun bekomme ich die Fehlermeldung :"Traceback (most recent call last):
File "/Users/suleymankalayci/mu_code/Kommacode.py", line 8, in <module>
a(spam)
File "/Users/suleymankalayci/mu_code/Kommacode.py", line 3, in a
return spam(i) + ","
TypeError: 'list' object is not callable"

Meine Idee war es einfach eine Schleife zu machen die nach jedem Element ein Komma setzt aber bei der Parameter läuft irgendwie was schief und ich verstehe nicht warum.

LG, namyelusbig.
erdbeerblut
User
Beiträge: 9
Registriert: Freitag 28. August 2020, 09:21

Zeile 3 mit eckigen Klammern?

Code: Alles auswählen

spam[i]
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

@namyelusbig: Auf die Modulebene gehören nur Importe, die Deklaration von Konstanten, Funktionen und Klassen und die if-Abfrage zum Starten der main. Dein Code sollte eigentlich so aussehen:

Code: Alles auswählen

def a(parameter):
    for i in range(len(spam)):
        return spam(i) + ","

def main():
    spam = ["apples", "bananas", "tofu", "cat"]
    a(spam)
    print(spam)

if __name__ == "__main__":
    main()
In deinem Code war spam als globale Variable angelegt. Globale Variablen sind böse. Treibe sie aus!
Nun ändert sich die Fehlermeldung und führt dich hoffentlich auf die richtige Spur.
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Lösungsvorschlag:

Code: Alles auswählen

#!/usr/bin/env python3


def format_items(iterable):
    try:
        *items, last_item = iterable
    except ValueError:
        return ""
    else:
        return f"{', '.join(items)} and {last_item}" if items else last_item


def main():
    print(format_items([]))
    print(format_items(["Peter"]))
    print(format_items(["Peter", "Paul"]))
    print(format_items(["Peter", "Paul", "Mary"]))


if __name__ == "__main__":
    main()
Ausgabe:

Code: Alles auswählen

Peter
Peter and Paul
Peter, Paul and Mary
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

`return` beendet eine Funktion, also die for-Schleife wird gleich beim ersten Durchlauf wieder abgebrochen.
Eine Schleife über einen Index ist ein anti-pattern, weil man auch direkt über die Elemente iterieren kann.
Weder `parameter` noch `spam` sind sinnvolle Variablennamen, weil sie nicht aussagen, was sie denn nun enthalten.
`a` ist dann ein ganz schlechter Funktionsname.
Antworten