For-Schleife wird nicht ausgeführt, warum?

3 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Erstmal formatieren:

import sys
zahl1= 4 #int(sys.argv[1])
zahl2=14 #int(sys.argv[2])

if zahl1 < zahl2:
   fill= zahl1
   print(zahl1,"\t",zahl2,"\t",fill)
   zahl1 = zahl2
   print(zahl1,"\t",zahl2,"\t",fill)
   zahl2= fill
   print(zahl1,"\t",zahl2,"\t",fill)
print(zahl1,zahl2)
for l in range(zahl1,zahl2+1):
   if(l==zahl1):
       print("\t",end=" ")
   print(l,"\t",end=" ")
   if(l==zahl2):
       print("\n")

for j in range(zahl1,zahl2+1):
   for i in range(zahl1,zahl2+1):
       if(i==zahl1):
           print(j,"\t",j*j,"\t",end=" ")
       else:
           print(j*i,"\t",end=" ")
           if(i==zahl2):
               print("\n")

So, fangen wir vorab mal mit eienr Kleinigkeit an:

if zahl1 < zahl2:
    zahl1,zahl2=zahl2,zahl1 # vereinfachter swap

Warum auch immer Du das swappen willst....

Okay, Du sagst, wenn zahl1 kleiner zahl2, so machst DU ein swap, nun ist zahl1 größer zahl 2.

Bei eienr range muß die kleinere Zahl allerdings zuerst genannt werden, wenn Du ein positives Stepping hast, also wäre wenn:

if zahl1 > zahl2:
    zahl1,zahl2=zahl2,zahl1 

Sinnvoll

Glonn 
Fragesteller
 18.01.2022, 19:16

oh... das sieht sehr viel übersichtlicher aus.

Danke, wusste nicht wie das hier geht, hab einfach Copy-Paste.

Swappen will ich das, da die eingabe eig. vom Nutzer abhängen soll (siehe kommentar zu zahl1 und zahl2)

Sollte dieser nun zuerst eine kleine Zahl eingeben, so kann sich die For schleife gar nicht auflösen. Daher der if zahl1 kleiner als Zahl2.

Die Prints waren zur "Fehlerkontrolle" da. Dachte vllt lief da was falsch, aber bis kurz vor for l in range [..] läuft alles ohne probleme.

0
KarlRanseierIII  18.01.2022, 19:19
@Glonn

Wie gesagt, dreh mal den Vergleichsoperator um, DU wirst staunen.

Übrigens, hier eine andere Formulierung, die für Dein Problem nutzbar wäre:

low,high=min(zahl1,zahl2),max(zahl1,zahl2)

Das ist bei 2 Zahlen vielleicht ein wenig drüber, soll aber eine weitere Option zeigen, wen Du es mal mit größeren iterables zu tun hast.

1
Glonn 
Fragesteller
 18.01.2022, 19:19

Auch dir danke.... ich fühl mich so dumm, wie ich das wohl ne Stunde lang übersehen habe. Vielen Dank !

0
KarlRanseierIII  18.01.2022, 19:27
@Glonn

Passiert. Frag mal wie lange Du bei C vor einem a=b (Zuweisung, Wahrheitswert ergibt sich aus zugewiesenem Wert) statt a==b (Vergleich) sitzen kannst.

Du machst Dir nebenbei bemerkt auch teils das leben unnötig schwer, die Ausgabe des Tabellenheader kannste auch einfacher haben, wenn Du sowas machst:

>>> print("\t".join(str(x) for x in range(3,12)))
3       4       5       6       7       8       9       10      11
0

Nutz doch in Zukunft bitte den Code-Tag hier in Gutefrage. Gerade bei Python ist die Einrückung sehr wichtig und der Code-Tag macht das weiaus besser lesbar

Dann - ohne die Logik vom Programm selbst angeschaut zu haben:

if zahl1 < zahl2:
   fill= zahl1
   print(zahl1,"\t",zahl2,"\t",fill)
   zahl1 = zahl2
   print(zahl1,"\t",zahl2,"\t",fill)
   zahl2= fill
   print(zahl1,"\t",zahl2,"\t",fill)
print(zahl1,zahl2)

Sorgt dafür, dass zahl1 größer (oder gleich) ist wie zahl2, indem diese getauscht werden, wenn zahl1 kleiner ist als zahl2. Sicher, dass du es nicht andersrum wolltest?

Kleiner Hinweis hier: Das lässt sich auch als Einzeiler schreiben, du brauchst keine temporäre Variable in Python

if zahl1 < zahl2:
    zahl1, zahl2 = zahl2, zahl1

Dann:

for l in range(zahl1,zahl2+1):

Macht rein gar nichts, da du hier von der Startzahl 14 immer um eins erhöhst, bis diese kleiner als 5 ist. Offensichtlich ist das nie wahr und wird nie ausgeführt.

Der einzige Fall, in dem das eine einzige Iteration macht, ist, wenn zahl1 = zahl2

Wenn du in Python herunterzählen willst, musst du noch die Schrittweite angeben:

for l in range(start, stop, step):

Bei dir wäre es also:

for l in range(14, 4, -1):

Das würde jetzt alle Zahlen von 14 bis (inklusive) 5 ablaufen.

Glonn 
Fragesteller
 18.01.2022, 19:18

Oh man.... das stimmt... kann nicht glauben das ich das die letzte Stunde übersehen habe.....
Danke!

0

Hallo,

ja, das kann so nicht klappen range liefert ja true oder false zurück

so wie du das machst müsstest du entweder While benutzen und l in der schleife immer l=l+1 machen oder eben for mit einem numerischen Anfangswert und Endwert versehen und einem increment (++1) oder was auch immer

LG

Harry