Seite 1 von 1

Kommacode

Verfasst: Freitag 28. August 2020, 10:48
von namyelusbig
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.

Re: Kommacode

Verfasst: Freitag 28. August 2020, 11:03
von erdbeerblut
Zeile 3 mit eckigen Klammern?

Code: Alles auswählen

spam[i]

Re: Kommacode

Verfasst: Freitag 28. August 2020, 11:09
von sparrow
@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.

Re: Kommacode

Verfasst: Freitag 28. August 2020, 11:48
von __blackjack__
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

Re: Kommacode

Verfasst: Freitag 28. August 2020, 11:52
von Sirius3
`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.