Probleme bei meinem ersten Programm in Python

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
MrWasabi
User
Beiträge: 3
Registriert: Sonntag 17. Januar 2016, 13:00

Wie schon gesagt habe ich ein Problem mit meinem ersten Projet Hallo.py. Das Programm macht eingentlich nicht wirklich was außer dich etwas zu fragen, aber es soll, falls falsche Antworten gegebnen werden, erneut fragen. Mein Problem ließe sich einfach durch einen Goto Befehl lösen, da es den aber in Python nicht gibt komme ich nicht weiter.

Danke schonmal im Voraus

Code: Alles auswählen

#!/usr/bin/env python 
# -*- coding: utf-8 -*-
import time 

d = "Das ist schön"
print ("Heyho schön dich zu sehen")
meinName = input("Wie ist dein Name? ")
try:
	x = int(input("Auf einer Skala von 1 bis 10 - Wie gehts dir " + meinName +"? "))
except ValueError:
	# Kommentar: Hier soll das programm nach einer neuen Antwort fragen solange der angegebene Wert kein int wert ist
	time.sleep(3)
	

if (x >= 8 and x < 11):
	print (d)
elif (x >= 5 and x < 11):
	print ("naja immer noch besser als nichts") 
elif (x < 5 and x > 0):
	print ("lass dich nicht unterkriegen!") 
else:
	while x < 1 or x > 10:
		try:
			x = int(input("von einer skala von 1 bis 10... also nochmal "))
		except ValueError:
			# Kommentar: Hier das selbe wie oben
			time.sleep(3)
		if (x >= 8 and x < 11):
			print (d)
			break
		elif (x >= 5 and x < 11):
			print ("naja immer noch besser als nichts") 
			break
		elif (x < 5 and x > 0):
			print ("lass dich nicht unterkriegen!") 
			break
	pass
time.sleep(10)
Zuletzt geändert von Anonymous am Sonntag 17. Januar 2016, 13:30, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@MrWasabi: while-Schleifen kennst Du doch schon. Statt aber alles zu kopieren, solltest Du die Schleife vor den ganzen ifs setzen, so dass dort schon garantiert ist, dass x im gewünschten Bereich liegt.
MrWasabi
User
Beiträge: 3
Registriert: Sonntag 17. Januar 2016, 13:00

aber es gibt doch keine while schleife die abfrägt ob der angebene Wert ein integer ist, oder?
BlackJack

@MrWasabi: Code und Daten *nicht* zu wiederholen ist so wichtig das es einen eigenen Namen hat: Das DRY-Prinzip → *D*on't *R*epeat *Y*ourself.

Bei `print()` solltest Du kein Leerzeichen zwischen dem Funktionsnamen und der öffnenden Klammer machen. Das machst Du doch bei den anderen Funktionen auch nicht.

Bei den Bedingungen bei ``if`` und ``elif`` gehören keine Klammern hin. Ausserdem könnte man hier die Ausdrücke vereinfachen in dem man Operatorverkettung verwendet. Zum Beispiel ``8 <= x < 11`` statt ``8 >= x and x < 11``.

`d` und `x` sind schlechte Namen weil sie dem Leser nicht verraten was der Wert der daran gebunden wird, im Programm bedeutet. Aber genau das will ein Leser ja wissen um den Code zu verstehen, also auch die Stellen an denen ein Name verwendet wird, ohne erst suchen zu müssen wo er an welchen Wert gebunden wurde.

`meinName` sollte als `mein_name` geschrieben werden. Siehe den Style Guide for Python Code.

``pass`` macht in einem Zweig in dem Code steht, keinen Sinn.

Zur letzten Frage: Man schreibt in solchen Fällen eine ”Endlosschleife” (``while True:``) die solange durchlaufen wird bis man in der Schleife das Ergebnis hat was man braucht und sie dann abbricht. Entweder ``break`` oder im Falle einer Funktion manchmal auch mit ``return``.
Antworten