Funktion

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
Fakhro
User
Beiträge: 21
Registriert: Mittwoch 13. März 2019, 13:44

Hi leute hänge grad fest an einer aufgabe undzwar
8-9. Magicians:Make a list of magician’s names .Pass the list to a function
called show_magicians(), which prints the name of each magician in the list .

8-10. Great Magicians:Start with a copy of your program from Exercise 8-9 .
Write a function called make_great()that modifies the list of magicians by adding the phrase the Greatto each magician’s name .Call show_magicians()to
see that the list has actually been modified .
def show_magicians(magicians):
""" print magicians names """
for magician in magicians:
print(magician)

magicians = ['freddy', 'robbin', 'krao']
show_magicians(magicians)

def make_great(magicians, great_mag):
""" build the print with the great """
while magicians:
magician = magicians.pop()
print(magician.title() + " the great ")
great_mag.append(magician)

for great_ma in great_mag:
magicians.append(great_ma)

magicians = ['freddy', 'robbin', 'krao']
great_mag = []
show_magicians(magicians)

print("\n")

make_great(magicians, great_mag)
show_magicians(magicians)

Und zwar sollte sich die liste zum schluss ändern aber sie bleibt immer noch die selbe könnt ihr mir helfen bitte ?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte die Code-Tags verwenden, so kann man deinen Sourcecode schwer entziffern.

Und du aenderst eben die Liste nicht, sondern erzeugst eine neue. Einen Eintrag in einer Liste aendern kann man auf diverse Arten und Weisen, aber am einfachsten ist wohl

Code: Alles auswählen

liste[index] = ein_wert
Und wenn man ueber eine Liste iterieren will, und gleichzeitig den Index des Elementes braucht, weil man es ggf. in-place aendern will, dann kann man enumerate benutzen:

Code: Alles auswählen

for i, wert in enumerate(liste):
Last but not least: ich wuerde das niemals so machen, dass ich die Ursprungsliste veraender. Sondern immer einen neue Liste erzeugen, und die dann ggf. an "magicians" binden. Also reicht eine einfach List-Comprehension schon aus:

Code: Alles auswählen

great_magicians = ["Great " + mage for mage in magicians]
Natuerlich muss das als Teil einer Funktion gemacht und zurueck gegeben werden.
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Wenn die Liste gleich bleiben soll würde ich es so machen:

Code: Alles auswählen

def make_great(magicians):
    """ build the print with the great """
    for index, magician in enumerate(magicians):
        magicians[index] = "{} the great".format(magician)
    return magicians
Du übergibst folgende Liste:

Code: Alles auswählen

magicians = ['freddy', 'robbin', 'krao']
mit Enumerate wird für über den Index und den Wert gleichzeitig iteriert.

0 freddy
1 robbin
2 krao
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

@Fakhro: Einrückung ist wichtig, daher solltest Du Code hier im Forum in Code-Tags packen.

Das hin- und her-schieben der Einträge der Liste `magicians` ist schlecht. In Python erzeugt man immer neue Listen, statt alte zu ändern. Statt der while-Schleife benutze eine for-Schleife. Auch ist daher die Aufgabenstellung schlecht, weil sie fordert, dass eine Liste geändert wird. Auch wenn Du das ignorierst, sollte `great_mag` eine lokale Variable sein, und nicht von außen kommen.

Bisher gibst Du nur einen String für jeden Magier aus, statt die geänderten Strings in eine Liste zu stecken. Was Du aber bekommst, ist, dass die Reihenfolge umgedreht ist, was man auch einfacher per `reverse` machen könnte.

Code: Alles auswählen

def make_great(magicians):
    return [f"{m.title()} the great" for m in magicians]
Antworten