Klausurvorbereitung Python verstehen

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
Chrisseeey
User
Beiträge: 7
Registriert: Donnerstag 9. Juni 2022, 15:02

Hallo ihr Lieben!

Ich lerne gerade für meine Python Klausur am Montag und hab noch ein wenig Verständnis probleme, wie genau ein Code was macht.

Ich arbeite gerade unsere Altklausuren durch und hab folgenden Code:

Code: Alles auswählen

L1 = ["is odd", "is even"]
L2 = [1, 2, 3]
res = ""
for i in L2:
	res += str(i) + " " + L1[i % 2] + "; "
	print(res)
Die Aufgabe lautet: Was ist die genaue Ausgabe des folgenden Codes? Korrigieren Sie den Code.
Der Code soll ja anscheinend bestimmen, ob die Zahl aus L2 gerade oder ungerade ist (L1). So wie es jetzt da steht wird für jedes element in L2 res zurück gegeben mit dem string des elements für L2 und L1 in dem das element durch 2 geteilt wird.
Bitte verurteilt mich nicht, ich bin kein Programmierprofi und gebe mir größte Mühe, alles zu verstehen, ich wüsste nur leider auf anhieb nicht, was genau jetzt geändert werden muss, damit der Code funktioniert.

Falls jemand Zeit und Lust hat mir ein wenig beim Verständnis zu helfen, damit ich die Klausur hoffentlich bestehe, wäre ich überaus dankbar :)
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Na hast du den code mal laufen lassen? Was macht der denn, und was nicht?

Nachtrag: es wird uebrigens nicht geteilt, es wird der Rest der Teilung durch 2 bestimmt.
Chrisseeey
User
Beiträge: 7
Registriert: Donnerstag 9. Juni 2022, 15:02

Ja hab ihn laufen lassen und es kommt natürlich nicht das raus wie es eigentlich sollte :D
Gerade sagt er mir 1 ist gerade und 2 ist ungerade und 3 ist gerade. Wenn ich das % mit // ersetze gibt er mir bis auf die 3 zumindest das richtige raus
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das % ist schon richtig so. Warum gibt er dir denn gerade/ungerade aus? Was passiert da? Wenn du das verstehst, ist der Fix trivial (und hat nichts mit dem Operator zu tun).
Sirius3
User
Beiträge: 18279
Registriert: Sonntag 21. Oktober 2012, 17:20

Warum wird Code in Klausuraufgaben oft so kryptisch geschrieben, dass man ihn gar nicht sofort verstehen kann?

Code: Alles auswählen

EVEN_ODD = ["even", "odd"]

numbers = [1, 2, 3]
result = []
for number in numbers:
    result.append(f"{number} is {EVEN_ODD[number % 2]};")
    print(" ".join(result))
Benutzeravatar
ThomasL
User
Beiträge: 1379
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

@Sirius das print() soll bestimmt nicht in der Schleife stehen, oder?

Man könnte es noch etwas pythonischer machen

Code: Alles auswählen

EVEN_ODD = ["even", "odd"]
numbers = [1, 2, 3]

print("\n".join(f"{number} is {EVEN_ODD[number % 2]};" for number in numbers))

Code: Alles auswählen

1 is odd;
2 is even;
3 is odd;
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Benutzeravatar
noisefloor
User
Beiträge: 4196
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

% ist der Modulo-Operator in Python. D.h `X % 2` gibt immer 0 oder 1 als Ergebnis, wenn X eine natürliche Zahl ist. 0 halt für gerade Zahlen, weil "gerade Zahl geteilt durch 2" immer geht ohne Rest / Nachkommastelle geht und "ungerade Zahl geteilt durch 2" gibt 1, weil sich ungerade Zahlen nicht durch 2 glatt teilen lassen.

Das Ergebnis der Modulo-Division wird dann im Code als Index für den Zugriff auf die Liste "L1" genommen. Ausdrücke werden in Python von innen nach aussen evaluiert, d.h. `L1[i%2], rechnet _erst_ `i%2` und das Ergebnis wird dann als Index eingesetzt, also entweder L[0] oder L[1], je nach Ergebnis. Und der Indexzugriff auf L1 liefert dann das ersten oder zweite Element von L1 zurück.

Gruß, noisefloor

P.S.: Bonuspunkte bekommst du, wenn du unter die Aufgabe schreibst, dass das zusammenbasteln von Strings mit + schlechter Stil ist. Das macht man mit f-Strings oder der Format-Methode von Strings. Bzw. hier besser die Ergebnisse in einer Liste sammeln und die Elemente dann zusammenfügen, wie gezeigt.
Benutzeravatar
__blackjack__
User
Beiträge: 14078
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Alternativ zum Modulo-Operator könnte man hier auch die bitweise Und-Verknüpfung verwenden. Hier mal exemplarisch in einem BASIC-Einzeiler, statt in Python:

Code: Alles auswählen

10 A$(0)="EVEN":A$(1)="ODD":FOR N=1 TO 3:PRINT N;"IS ";A$(N AND 1);";";:NEXT
Testlauf:

Code: Alles auswählen

RUN
 1 IS ODD; 2 IS EVEN; 3 IS ODD;
READY.
Falls jemand Lust auf Code-Golf hat; folgende Ausgabe geht in Python mit 55 Zeichen:

Code: Alles auswählen

1 is odd; 2 is even; 3 is odd;
Also natürlich mit den Zahlen als Daten aus einer Liste und nicht einfach `print()` und eine statische literale Zeichenkette. 🤓
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
narpfel
User
Beiträge: 691
Registriert: Freitag 20. Oktober 2017, 16:10

Also ich komme auf 52 Zeichen für die gezeigte Ausgabe.
bords0
User
Beiträge: 234
Registriert: Mittwoch 4. Juli 2007, 20:40

51 (ohne Zeilenendezeichen):

Code: Alles auswählen

for n in 1,2,3:print(n,"is",["even;","odd;"][n%2])
Benutzeravatar
__blackjack__
User
Beiträge: 14078
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Okay, wenn es auch erlaubt ist die drei Ausgaben jeweils in einer eigenen Zeile zu machen dann 48 (ohne Zeilenendezeichen).
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten