c = (a) + (b) klappt bei mir ausserhalb, jedoch nicht innerhalb von Schleife

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.
Susann.M.23
User
Beiträge: 44
Registriert: Montag 30. März 2020, 13:23

Hallo,

Bei mir als Anfänger funktionieren bestimmte Dinge, die einzeln bei mir funktionieren, nicht innerhalb einer Schleife.

bei mir klappt folgendes unter python 3.x außerhalb einer Schleife. Ich bekomme die erhofften Ausgaben im Terminal und das Terminal bleibt offen, so das ich die Ausgabe lesen kann.

#!/usr/bin/env python3
print ("Ich bin ein Python Anfänger, jedoch weder Schüler noch Student")
a = 1
b = 2
c = (a) + (b)
print (c)
varialble = input ("Zum Schließen des Terminalfensters, beliebige Taste drücken")

Auch folgende Schleife funktioniert bei mir bestens:

#!/usr/bin/env python3

schleifendurchlaufanzahl = 5

# Schleifenanfang
i = 1
while i <= schleifendurchlaufanzahl :
print(i)
i = i + 1

print ("Ich bin ein Python Anfänger, jedoch weder Schüler noch Student")
print ("")

else:
print ("Die gewünschte Anzahl der Durchläufe wurde erledigt")
print ("")
print ("")

varialble = input ("Zum Schließen des Terminalfensters, beliebige Taste drücken")


Nicht funktionieren tut bei mir die Schleife, wenn ich in diese wie folgt erweitere:

#!/usr/bin/env python3

schleifendurchlaufanzahl = 5

# Schleifenanfang
i = 1
while i <= schleifendurchlaufanzahl :
print(i)
i = i + 1

print ("Ich bin ein Python Anfänger, jedoch weder Schüler noch Student")
print ("")

a = 1
b = 2
c = (a) + (b)
print (c)

else:
print ("Die gewünschte Anzahl der Durchläufe wurde erledigt")
print ("")
print ("")

varialble = input ("Zum Schließen des Terminalfensters, beliebige Taste drücken")


Fehlererscheinung:
* Das Terminalfenster schließt sich ohne das ich schnell genug bin eine Fehlermeldung zu erhaschen.

Es ergeben sich folgende Fragen:
* Wie kann man vor gehen um doch Fehlermeldungen, die bei einem solchen Script vermutlich aus gegeben werden, zu Gesicht zu bekommen ( beim ?
* Was für Regeln sind innerhalb von Schleifen anders als außerhalb ?
bb1898
User
Beiträge: 200
Registriert: Mittwoch 12. Juli 2006, 14:28

Leider können wir nur raten, wo der Fehler liegen könnte, denn Du hast Dein Programm nicht in Code-Tags gesetzt. Folge: alle Einrückungen sind verschwunden, ein Python-Programm ohne Einrückungen ist aber für den menschlichen Leser unverständlich. Ich rate trotzdem: wenn die letzte Zeile versehentlich mit eingerückt ist, dann würde genau das passieren, was Du beschreibst. Mit den zusätzlichen Anweisungen innerhalb der Schleife hat das nichts zu tun.

Es gibt noch mehr zu dem Programm zu sagen, aber klären wir besser zuerst die Einrückungsfrage. Die Code-Tags findest Du im vollständigen Editor.
Benutzeravatar
__blackjack__
User
Beiträge: 13107
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Susann.M.23: Zur Fehlererscheinung: Das Fenster schliesst sich nur weil Du das Programm falsch startest. Konsolenprogramme startet man in einer bereits offenen Konsole. Dann braucht man keine komischen Sachen machen um die Konsole offen zu halten, und man kann auch Fehlerausgaben in der Konsole lesen.

Das ``else`` zu einer Schleife macht nur Sinn wenn innerhalb der Schleife ein ``break`` vor kommt. Also lass das ``else`` weg und schreib den Code der in diesem Block steht einfach hinter die Schleife.

Edit: Es ist übrigens ein Einrückungsfehler:

Code: Alles auswählen

$ ./forum16.py 
  File "./forum16.py", line 14
    a = 1
        ^
IndentationError: unindent does not match any outer indentation level
Die Klammern im `a` und `b` sind überflüssig.

Und zwischen Funktion/Methode und der öffnenden Klammer für den Aufruf gehört kein Leerzeichen.

Um eine Leerzeile auszugeben muss man `print()` nichts übergeben.

Der Kommentar „Schleifenanfang“ ist überflüssig.

Code: Alles auswählen

#!/usr/bin/env python3

schleifendurchlaufanzahl = 5

i = 1
while i <= schleifendurchlaufanzahl:
    print(i)
    i = i + 1

    print("Ich bin ein Python Anfänger, jedoch weder Schüler noch Student.")
    print()

    a = 1
    b = 2
    c = a + b
    print(c)

print("Die gewünschte Anzahl der Durchläufe wurde erledigt.")
print()
print()
Und das ist eigentlich ein Fall für eine ``for``-Schleife und `range()`.
Zuletzt geändert von __blackjack__ am Montag 30. März 2020, 15:57, insgesamt 1-mal geändert.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Susann.M.23
User
Beiträge: 44
Registriert: Montag 30. März 2020, 13:23

bb1898 hat geschrieben: Montag 30. März 2020, 15:45 Leider können wir nur raten, wo der Fehler liegen könnte, denn Du hast Dein Programm nicht in Code-Tags gesetzt.
Was sind Code Tags ?
bb1898 hat geschrieben: Montag 30. März 2020, 15:45 Ich rate trotzdem: wenn die letzte Zeile versehentlich mit eingerückt ist, dann würde genau das passieren,
Haben Einrückungen irgend welche Auswirkungen in Python auf die Funktion des Codes ?
Susann.M.23
User
Beiträge: 44
Registriert: Montag 30. März 2020, 13:23

__blackjack__ hat geschrieben: Montag 30. März 2020, 15:51 @Susann.M.23: Zur Fehlererscheinung: Das Fenster schliesst sich nur weil Du das Programm falsch startest. Konsolenprogramme startet man in einer bereits offenen Konsole. Dann braucht man keine komischen Sachen machen um die Konsole offen zu halten, und man kann auch Fehlerausgaben in der Konsole lesen.
Das ist interessant. Werde ich gleich mal probieren wie das geht und was das für eine Wirkung hat.
Benutzeravatar
__blackjack__
User
Beiträge: 13107
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Susann.M.23: Ja Einrückungen haben eine Bedeutung. Was denkst Du denn woher Python weiss welcher Code in der Schleife steht und welcher davor und danach‽ Alles was gleich tief eingerückt ist, gehört zusammen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Susann.M.23
User
Beiträge: 44
Registriert: Montag 30. März 2020, 13:23

__blackjack__ hat geschrieben: Montag 30. März 2020, 15:51 @Susann.M.23: Zur Fehlererscheinung: Das Fenster schliesst sich nur weil Du das Programm falsch startest. Konsolenprogramme startet man in einer bereits offenen Konsole. Dann braucht man keine komischen Sachen machen um die Konsole offen zu halten, und man kann auch Fehlerausgaben in der Konsole lesen.
Das ist die Variante die ich heraus gefunden habe. Auch hat sie den Vorteil, das man die Datei hierbei per Doppelklick starten kann. Das scheint mir recht intuitiv zu sein.

Ok. Zu der von Kennern der Materie bevorzugtem Aufruf der .py Datei per Konsole:
* Das ist mir, jetzt wo ich davon Kenntnis erlangt habe, noch nicht gelungen. Was ich gemacht habe ist das ich hierfür in der Konsole folgendes ein gegeben habe:
cd Pfad zur Datei
Enter
Dateiname.py

Aber das finde ich schon noch heraus. Vmtl. gibt es Probleme mit den in dem Pfad enthaltenen Leerzeichen oder Umlauten.
Susann.M.23
User
Beiträge: 44
Registriert: Montag 30. März 2020, 13:23

__blackjack__ hat geschrieben: Montag 30. März 2020, 15:58 @Susann.M.23: Ja Einrückungen haben eine Bedeutung. Was denkst Du denn woher Python weiss welcher Code in der Schleife steht und welcher davor und danach‽ Alles was gleich tief eingerückt ist, gehört zusammen.
Hmm. Das war mir nicht bisher nicht bekannt das das eine funktionelle Bedeutung in Python hat.

Was ist eine übliche und für Python geeignete IDE, die vlt. sogar solche Einrückungen irgend wie anbietet ?
__deets__
User
Beiträge: 14540
Registriert: Mittwoch 14. Oktober 2015, 14:29

Gibt's einiges, zB VSCode, Atom, PyCharm etc. Die unterstuetzen dich da alle drin.
Susann.M.23
User
Beiträge: 44
Registriert: Montag 30. März 2020, 13:23

__deets__ hat geschrieben: Montag 30. März 2020, 16:41 Gibt's einiges, zB VSCode, Atom, PyCharm etc. Die unterstuetzen dich da alle drin.
Bisher habe ich irgend einen Texteditor und vlt. auch mal IDLE verwendet. Aber zu wissen das Einrückungen in Python eine funktionelle Bedeutung haben, lässt mich das Thema Editor doch mit anderen Augen sehen.

Mal sehen ob sich da in IDLE was mit Einrückungen konfigurieren lässt oder wie auch immer das gehen mag.
__deets__
User
Beiträge: 14540
Registriert: Mittwoch 14. Oktober 2015, 14:29

IDLE kann das auch. Magisch geht da eh nix, du musst das schon selbst entscheiden. Aber du kannst zB einen ganzen Ausschnitt von Code markieren, und den dann per tab/shift-tab als ganzes bewegen. Das macht es einfacher. In anderen Sprachen musst du dafuer selbst entscheiden, wo du BEGIN und END schreibst, oder { und }, etc. Das kann einem niemand abnehme.
Susann.M.23
User
Beiträge: 44
Registriert: Montag 30. März 2020, 13:23

__deets__ hat geschrieben: Montag 30. März 2020, 17:05 IDLE kann das auch.
Dann werde ich mal sehen ob ich das in IDLE finde. So weit ich das hier und da gelesen habe, scheint das wohl möglich die gängigste IDE zu sein.
Benutzeravatar
__blackjack__
User
Beiträge: 13107
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Susann.M.23: Eher nicht. Anfänger nehmen das öfter weil das bei Python dabei ist, aber man will früher oder später auf einen Editor oder eine IDE umsteigen der/die universeller einsetzbar ist als IDLE.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Zizibee
User
Beiträge: 229
Registriert: Donnerstag 12. April 2007, 08:36

Susann.M.23 hat geschrieben: Montag 30. März 2020, 16:12
Ok. Zu der von Kennern der Materie bevorzugtem Aufruf der .py Datei per Konsole:
* Das ist mir, jetzt wo ich davon Kenntnis erlangt habe, noch nicht gelungen. Was ich gemacht habe ist das ich hierfür in der Konsole folgendes ein gegeben habe:
cd Pfad zur Datei
Enter
Dateiname.py
Versuche es mal mit:
python Dateiname.py

Also wirklich das Wort python vor den Dateinamen schreiben. Damit weiß dein Computer, dass du die Datei mit Python starten willst.
Susann.M.23
User
Beiträge: 44
Registriert: Montag 30. März 2020, 13:23

Hallo,

die folgende Schleife funktioniert bei mir sehr gut:

Code: Alles auswählen

schleifendurchlaufanzahl = 5
i = 1
while i <= schleifendurchlaufanzahl:
	print(i)
	i = i + 1
Die Anzahl der Schleifendurchgänge kann man prima über die Variable bestimmen. Ich wage es kaum zu sagen, aber ich komme bisher nicht dahinter, wie man die Schleife so auf bohren könnte, das sie zur derzeitigen Funktionalität, zusätzlich die Möglichkeit bietet, das man sie per Variabel, bei Wunsch auch in einen Endlosschleifenzustand versetzen kann.

Gibt es da z.B. ein für diesen Fall, einsetzbares Endloszeichen ?
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Susann.M.23 hat geschrieben: Donnerstag 16. April 2020, 20:17 Gibt es da z.B. ein für diesen Fall, einsetzbares Endloszeichen ?
Das ist ein Klassiker: `while True`. Bei Bedarf kann man die Schleife immer noch mit `break` verlassen.

Man kann das zum Beispiel verwenden wenn man Werte so lange eingeben lassen will, bis sie korrekt sind. Simples Beispiel:

Code: Alles auswählen

while True:
    try:
        value = int(input('Zahl'))
        break
    except ValueError:
        print('Bitte eine Zahl eingeben.')
Susann.M.23
User
Beiträge: 44
Registriert: Montag 30. März 2020, 13:23

Ich such für folgendes eine Möglichkeit, bei Bedarf auch einen nicht endlichen Wert ein geben zu können, so das die Schleife, sofern im Einzelfall durch den Bediener gewünscht, dauerhaft läuft.

Code: Alles auswählen

schleifendurchlaufanzahl = 5
i = 1
while i <= schleifendurchlaufanzahl:
	print(i)
	i = i + 1
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

Das ist keine while-Schleife, sondern eine for-Schleife:

Code: Alles auswählen

for i in range(schleifendurchlaufanzahl):
    print(i)
Eine Endlosschleife wird daraus, wenn man statt range itertools.count benutzt:

Code: Alles auswählen

for i in itertools.count():
    print(i)
Wenn Du das jetzt einstellbar willst, mußt Du die beiden Fälle durch if unterscheiden:

Code: Alles auswählen

if endlos:
    iterator = itertools.count()
else:
    iterator = range(schleifendurchlaufanzahl)
for i in iterator:
    print(i)
Susann.M.23
User
Beiträge: 44
Registriert: Montag 30. März 2020, 13:23

Was wäre in dem folgenden Beispiel, das gesuchte Zeichen was man, wenn im Einzelfall endloser Lauf gewünscht ist, bei der Variable "schleifendurchlaufanzahl" an gibt ?

Code: Alles auswählen

schleifendurchlaufanzahl = 

if endlos:
    iterator = itertools.count()
else:
    iterator = range(schleifendurchlaufanzahl)
for i in iterator:
    print(i)
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

Naja, Du hast hier ein Flag `endlos` das True sein muß, wenn es endlos sein soll.
Antworten