Seite 1 von 1

Funktion

Verfasst: Montag 8. April 2019, 13:35
von Fakhro
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 ?

Re: Funktion

Verfasst: Montag 8. April 2019, 13:52
von __deets__
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.

Re: Funktion

Verfasst: Montag 8. April 2019, 14:08
von Jankie
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

Re: Funktion

Verfasst: Montag 8. April 2019, 16:20
von Sirius3
@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]