MINI Rechner (+-*/)

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
computatrum physicus
User
Beiträge: 8
Registriert: Samstag 29. Juli 2017, 16:37

Code: Alles auswählen

print("Mini Taschenrechner 01010100 01001000")
class Operatoren:

	def __init__(self,input,input2):
		self.uinput1 = input
		self.uinput2 = input2
		
	def Addition(self):
		self.x =  self.uinput1+self.uinput2
		return self.x
	def Subtraktion(self):
		self.y =  self.uinput1-self.uinput2
		return self.y
	def Mulitplikation(self):
		self.a =  self.uinput1*self.uinput2
		return self.a
	def Division(self):
		self.b =  self.uinput1/self.uinput2
		return self.b
a = True
while a == True:
	try:
		q = float(input("Geben sie ihre erste Zahl ein."))
	except ValueError:
		print("Bitte eine !Zahl! eingeben!")
		try:
			q = float(input("Geben sie ihre erste Zahl ein."))
		except ValueError:
			print("Tja...")
			a = False
			break
	art = input("Für Addition geben sie 'A', für Subtraktion 'S', für Mulitplikation 'M', für Division 'D' ein.")
	art = art.upper()
	try:
		w = float(input("Geben sie ihre zweite Zahl ein."))
	except ValueError:
		print("Bitte eine !Zahl! eingeben,sonst beendet sich das Programm sofort!")
		try:
			w = float(input("Geben sie ihre zweite Zahl ein."))
		except ValueError:
			print("Tja...")
			a = False
			break
	user1 = Operatoren(q,w)
	if art == "A":
		print(user1.Addition())
	elif art  == "S":
		print(user1.Subtraktion())
	elif art  == "M":
		print(user1.Mulitplikation())
	elif art  == "D":
		print(user1.Division())
	else:
		
		nt = input("Möchtest du es erneut versuchen?Y/N")
		if nt.upper() == "Y":
			continue
		elif nt.upper() == "N":
			a = False
			break
		else:
			print("Deine Eingabe war Falsch!")
			print("Da du erneut zu blöd warst beendet sich das Programm nun von selbst... Deppes ey!")
	Neustart = input("Willst du das Programm beenden? Y/N")
	if Neustart.upper() =="Y":
		a = False
		print("Danke fürs benutzen des Taschenrechners:)")
Bin 14 (j) und lerne seit ca. 2-3 Wochen Python über Youtube (Da ich in der Schule noch kein Informatik-Unterricht habe:/). Würde einfach mal gerne eure Meinung zu dem Mini Rechner hören. Keine Angst er hat bis jetzt so wenig Funktionen da ich erst seit heute daran code und erstmal wissen wollte ob ich vlt. ein dummen Fehler gemacht habe / mache.
Lg Tom H.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@computatrum physicus: »Operatoren« ist der falsche Name für die Klasse, weil sie nur Operanden aufnimmt. Außer in »__init__« sollten keine neuen Attribute eingeführt werden, wobei x, y, a und b gar nirgends benutzt werden und deshalb weggelassen werden können. Methoden sollten Tätigkeiten beschreiben, also »addieren«, »subtrahieren«, etc.

`a` wird nicht wirklich gebraucht, weil immer wenn Du a auf False setzt auch gleichzeitig die Schleife per `break` verläßt. Was hast Du Dir bei dem Namen »user1« gedacht? Was haben zwei Zahlen mit einem User zu tun und was soll die 1 bedeuten? »Neustart« ist falsch geschrieben (weil groß) und weil der Wert "Y" enthält, wenn man nicht neu starten will.
BlackJack

@computatrum physicus: Der Quelltext könnte ein paar Leerzeilen vertragen um das lesbarer zu machen und auch ein paar Leerzeichen. Der Style Guide for Python Code hat da ein paar Richtlinien für. Ebenso für die Namensschreibweisen.

Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.

Die Klasse `Operatoren` macht keinen Sinn. Das sind einfach nur ein paar Funktionen in einer Klasse, die man auch einfach als Funktionen hätte schreiben können und damit auch sollen. Und dann braucht man sie noch nicht einmal selber schreiben, denn die gibt es schon im `operators`-Modul.

Einbuchstabe Namen sind nur sehr selten gute Namen. `i`, `j`, `k` für ganzzahlige Laufvariablen/als Indexwerte weil man die aus der Mathematik kennt, oder `x`, `y`, `z` für Koordinaten. Oder bei Namen deren Gültigkeitsbereich auf einen einzigen Ausdruck beschränkt sind („list comprehensions“, Generatorausdrücke, anonyme Funktionen (``lambda``)). Ansonsten sollte man einen Namen verwenden der dem Leser vermittelt welche Bedeutung der Wert im Programm hat. `a`, `q`, `w`, und `nt` tun das nicht.

`a` ist überflüssig. Fast überall wird die Schleife sowieso mit ``break`` verlassen. Und an der einen Stelle wo das nicht gemacht wird, könnte man es machen. Also weg mit `a`.

Der Code zur Eingabe der beiden Operanden ist fast identisch, das sollte man nur einmal schreiben, in einer Funktion, und die Unterschiede als Argumente übergeben.

``continue`` würde ich vermeiden, was auch so gut wie immer geht. Das ist ein unbedingter Sprung an den Schleifenanfang der nicht an der Einrückung des Quelltextes zu erkennen ist und der den Programmfluss damit undurchsichtiger macht. Und es macht das herausziehen von Code aus einer Schleife in eine eigene Funktion schwieriger und man kann die Schleife auch nicht mehr um Code erweitern der am Ende von jedem Schleifendurchlauf ausgeführt werden soll.

Die ``if``/``elif``\s für `art` kann man durch ein Wörterbuch ersetzen.

Das könnte dann so aussehen (ungetestet):

Code: Alles auswählen

from operator import add, div, mul, sub

LETTER_TO_OPERATION = {
    'A': add,
    'D': div,
    'M': mul,
    'S': sub,
}


def ask_operand(prompt, error_message):
    try:
        return float(input(prompt))
    except ValueError:
        print(error_message)
        try:
            return float(input(prompt))
        except ValueError:
            print('Tja...')
            raise


def main():
    print('Mini Taschenrechner 01010100 01001000')

    while True:
        try:
            operand_a = ask_operand(
                'Geben sie ihre erste Zahl ein.', 'Bitte eine !Zahl! eingeben!'
            )
        except ValueError:
            break

        art = input(
            "Für Addition geben sie 'A', für Subtraktion 'S',"
            " für Mulitplikation 'M', für Division 'D' ein."
        ).upper()

        try:
            operand_b = ask_operand(
                'Geben sie ihre zweite Zahl ein.',
                'Bitte eine !Zahl! eingeben, sonst beendet sich das'
                ' Programm sofort!'
            )
        except ValueError:
            break

        operation = LETTER_TO_OPERATION.get(art)
        if operation:
            print(operation(operand_a, operand_b))

            answer = input('Willst du das Programm beenden? Y/N')
            if answer.upper() == 'Y':
                print("Danke für's benutzen des Taschenrechners:)")
        else:
            answer = input('Möchtest du es erneut versuchen? Y/N')
            if answer.upper() == 'Y':
                pass
            elif answer.upper() == 'N':
                break
            else:
                print('Deine Eingabe war Falsch!')
                print(
                    'Da du erneut zu blöd warst beendet sich das Programm nun'
                    ' von selbst... Deppes ey!'
                )
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

computatrum physicus hat geschrieben:Bin 14 (j) und lerne seit ca. 2-3 Wochen Python
Falls Dein Taschenrechner funktionieren sollte, getestet habe ich ihn nicht, so würde ich den für Dein Alter und nach 2 bis 3 Wochen Python für ausgesprochen gut halten. Die vorausgehenden Hinweise sind alle berechtigt, für etwas ältere Einsteiger nach 2 bis 3 Monaten Python. Behalte die gegebenen Hinweise für zukünftige Projekte im Hinterkopf, ohne Dich jetzt entmutigen zu lassen, der Rest kommt dann mit der Zeit so nach und nach.
BlackJack

@Melewo: Ich gebe ja zu das ich nicht speziell auf das Alter und die Python-Erfahrung Rücksicht genommen habe, aber *alle* Hinweise sind IMHO nicht erst für Ältere, mit mehr Python-Erfahrung. Ich würde sogar sagen fast alle machen auch in dem Alter und nach 2 Wochen Sinn erwähnt zu werden.

Im Original waren keine Importe und kein Wörterbuch. So etwas kann dann aber durchaus der nächste Schritt sein, und ich habe ja auch gezeigt wie das dann aussehen kann. Da kann man also etwas von lernen.

Das meiste vom Rest, also zum Beispiel gute Namen, ``continue`` meiden, und keine Klassen wenn es mit Funktionen einfacher geht, kann man IMHO nicht früh genug lernen. Wenn man sich das gar nicht erst 2-3 Monate lang angewöhnt, muss man es sich später nicht mühsam wieder abgewöhnen.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@computatrum physicus: Auch wenn BlackJack nach eigener Aussage keine altersspezifische Antwort gepostet hat, lohnt es sich für Dich, die freundlicherweise mitgelieferte Beispiellösung durchzuarbeiten (auch wenn er Dir die Klasse weggenommen hat :) ).

Als Ergänzung noch: aus anderen Sprachen magst Du vielleicht schon die switch-Anweisung kennen. Diese gibt es in Python nicht, aber mit dem LETTER_TO_OPERATION-Konstrukt lässt sie sich in Python nachempfinden.

Und am Ende vom Code solltest Du noch

Code: Alles auswählen

if __name__ == '__main__':
    main()

hinzufügen. Das hat BlackJack in Gedanken sicher hingeschrieben, im Quelltext dann aber vergessen.
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

@BlackJack: Na ja, vor gut zwei Jahren wollte ich noch einmal einen Anlauf nehmen, um in einer völlig anderen Richtung eine regionale Arbeitsgemeinschaft für Kinder im schulpflichtigen Alter ins Leben zu rufen. Über Facebook und in der regionalen Presse ohne Altersbegrenzung dafür geworben, es meldeten sich nur ein paar Rentner. Da stellte ich mir schon die Frage, ob ich nur Kids und Jugendliche nicht richtig angesprochen hatte oder ob eine allgemeine Interessenlosigkeit weit verbreitet ist.
Gut, im Bereich Programmierung sollte es genug interessierte Jugendliche geben, bei dem was ich vorhatte, da hätten die sich vor die Tür bewegen müssen. Dennoch so allgemein, wenn jemand von sich aus Interesse zeigt, sollte das erst einmal gefördert werden, wobei ein kleines Lob mehr bringt, als nur auf das verweisen, was noch nicht so richtig ist. Die Hinweise sind ja richtig und gut, nur beides gehört irgendwie zusammen.

Wenn das die Leistung eines 14-jährigen ist, der gerade mit dem Erlernen einer Programmiersprache begonnen hat, dann hat er dafür neben den Hinweisen ein Lob verdient, wenn es die Leistung eines 24-jährigen gewesen wäre, dann sicherlich nicht mehr.
BlackJack

@kbr: :oops: Peinlich. Gut das ich ungetestet dazu geschrieben habe. :-)
computatrum physicus
User
Beiträge: 8
Registriert: Samstag 29. Juli 2017, 16:37

Melewo hat geschrieben:
computatrum physicus hat geschrieben:Bin 14 (j) und lerne seit ca. 2-3 Wochen Python
Falls Dein Taschenrechner funktionieren sollte, getestet habe ich ihn nicht, so würde ich den für Dein Alter und nach 2 bis 3 Wochen Python für ausgesprochen gut halten. Die vorausgehenden Hinweise sind alle berechtigt, für etwas ältere Einsteiger nach 2 bis 3 Monaten Python. Behalte die gegebenen Hinweise für zukünftige Projekte im Hinterkopf, ohne Dich jetzt entmutigen zu lassen, der Rest kommt dann mit der Zeit so nach und nach.
Danke:) Habe heute noch ein kleines Spiel geschrieben wo ich ein wenig mehr auf die Ordnung geachtet habe:D

Code: Alles auswählen

import random
import time
#Einleitung 

print(
"*******************\n"
"SCHERE STEIN PAPIER\n"
"*******************\n"
)

#Main

#Variablen

SSP = ["Schere","Stein","Papier"]

#Regeln

time.sleep(0.7)
print("Schere schneidet Papier\n")
time.sleep(0.7)
print("Papier umwickelt Stein\n")
time.sleep(0.7)
print("Stein schleift Schere\n")
time.sleep(0.7)

#User1
def Main():
	#1 oder 2 Spieler?
	try:
		SpielerAnzahl = int(input("Möchtest du gegen den Computer[1] oder einen 2.ten Spieler[2] spielen?\n"))
	except ValueError:
		print("Du musst eine ganze Zahl (1/2) eingeben!\n")
		SpielerAnzahl = int(input("Möchtest du gegen den Computer[1] oder einen 2.ten Spieler[2] spielen?\n"))
	if SpielerAnzahl == 2:
		UserName1 = input("Wie möchtest du heißen Spieler 1 ?\n")
		print("Willkommen",UserName1+".\n")
		UserName2 = input("Wie möchtest du heißen Spieler 2 ?\n")
		print("Willkommen",UserName2+".\n")
	elif SpielerAnzahl == 1:
		UserName1 = input("Wie möchtest du heißen?")
		print("Willkommen",UserName1+".\n")
		
		
	try:
		time.sleep(0.7)
		UserInput = int(input(UserName1[0].upper()+UserName1[1:len(UserName1)]+" bitte wähle zwischen Schere[1], Stein[2], Papier[3].\n"))

	except ValueError:
		time.sleep(1)
		print("Deine Eingabe war leider falsch!")
		time.sleep(1)
		UserInput = int(input(UserName1[0].upper()+UserName1[1:len(UserName1)]+" bitte wähle eine ganze Zahl zwischen 1 und 3!\n"))

	if UserInput > 3 or UserInput < 1:
		time.sleep(1)
		UserInput = int(input(UserName1[0].upper()+UserName1[1:len(UserName1)]+" bitte wähle eine ganze Zahl zwischen 1 und 3!\n"))
	
#User2	
	if SpielerAnzahl == 2:
		try:
			time.sleep(0.7)
			User2Input = int(input(UserName2[0].upper()+UserName2[1:len(UserName2)]+" bitte wähle zwischen Schere[1], Stein[2], Papier[3].\n"))

		except ValueError:
			time.sleep(1)
			print("Deine Eingabe war leider falsch!")
			time.sleep(1)
			User2Input = int(input(UserName2[0].upper()+UserName2[1:len(UserName2)]+" bitte wähle eine ganze Zahl zwischen 1 und 3!\n"))

		if User2Input > 3 or User2Input < 1:
			time.sleep(1)
			User2Input = int(input(UserName2[0].upper()+UserName2[1:len(UserName2)]+" bitte wähle eine ganze Zahl zwischen 1 und 3!\n"))
#Ausgabe des Siegers/Verlierers User vs User2
	
		if UserInput == User2Input:
			print("Unendschieden ihr hattet beide", SSP[UserInput-1],".\n")
		elif UserInput == 1 and User2Input == 2:
			print(UserName2[0].upper()+UserName2[1:len(UserName2)],"du hast gewonnen. Du hattest", SSP[User2Input-1],"genommen und ",UserName1, " hatte", SSP[UserInput-1], "genommen.\n")
		elif UserInput == 1 and User2Input == 3:
			print(UserName1[0].upper()+UserName1[1:len(UserName1)],"du hast gewonnen. Du hattest", SSP[UserInput-1],"genommen und ",UserName2," hatte", SSP[User2Input-1], "genommen.\n")
		elif UserInput == 2 and User2Input == 1:
			print(UserName1[0].upper()+UserName1[1:len(UserName1)],"du hast gewonnen. Du hattest", SSP[UserInput-1],"genommen und ",UserName2," hatte", SSP[User2Input-1], "genommen.\n")
		elif UserInput == 2 and User2Input == 3:
			print(UserName2[0].upper()+UserName2[1:len(UserName2)],"du hast gewonnen. Du hattest", SSP[User2Input-1],"genommen und ",UserName1, " hatte", SSP[UserInput-1], "genommen.\n")
		elif UserInput == 3 and User2Input == 1:
			print(UserName2[0].upper()+UserName2[1:len(UserName2)],"du hast gewonnen. Du hattest", SSP[User2Input-1],"genommen und ",UserName1, " hatte", SSP[UserInput-1], "genommen.\n")
		elif UserInput == 3 and User2Input == 2:
			print(UserName1[0].upper()+UserName1[1:len(UserName1)],"du hast gewonnen. Du hattest", SSP[UserInput-1],"genommen und ",UserName2," hatte", SSP[User2Input-1], "genommen.\n")
		else:
			print("Es scheint ein Fehler aufgetreten zu sein:/ Wir versuchen es so schnell wie möglich zu beheben!\n")
#Computer

	elif SpielerAnzahl == 1:
		ComInput = random.randint(1,3)	

#Ausgabe des Siegers/Verlierers User vs Com

		if UserInput == ComInput:
			print("Unendschieden du und der Computer hatten beide", SSP[UserInput-1],"genommen.\n")
		elif UserInput == 1 and ComInput == 2:
			print(UserName1,"du hast leider verloren. Du hattest", SSP[UserInput-1],"genommen und der Computer hatte", SSP[ComInput-1], "genommen.\n")
		elif UserInput == 1 and ComInput == 3:
			print(UserName1[0].upper()+UserName1[1:len(UserName1)],"du hast gewonnen. Du hattest", SSP[UserInput-1],"genommen und der Computer hatte", SSP[ComInput-1], "genommen.\n")
		elif UserInput == 2 and ComInput == 1:
			print(UserName1[0].upper()+UserName1[1:len(UserName1)],"du hast gewonnen. Du hattest", SSP[UserInput-1],"genommen und der Computer hatte", SSP[ComInput-1], "genommen.\n")
		elif UserInput == 2 and ComInput == 3:
			print(UserName1[0].upper()+UserName1[1:len(UserName1)],"du hast leider verloren. Du hattest", SSP[UserInput-1],"genommen und der Computer hatte", SSP[ComInput-1], "genommen.\n")
		elif UserInput == 3 and ComInput == 1:
			print(UserName1[0].upper()+UserName1[1:len(UserName1)],"du hast leider verloren. Du hattest", SSP[UserInput-1],"genommen und der Computer hatte", SSP[ComInput-1], "genommen.\n")
		elif UserInput == 3 and ComInput == 2:
			print(UserName1[0].upper()+UserName1[1:len(UserName1)],"du hast gewonnen. Du hattest", SSP[UserInput-1],"genommen und der Computer hatte", SSP[ComInput-1], "genommen.\n")
		else:
			print("Es scheint ein Fehler aufgetreten zu sein:/ Wir versuchen es so schnell wie möglich zu beheben!\n")

#Noch eine Runde?
	def Neustart():
		time.sleep(0.7)
		Neustart = input("Willst du noch eine Runde spielen? Ja[Y], Nein[N]\n")
	
		if Neustart.upper() == "Y":
			time.sleep(0.7)
			print("Na dann viel Spaß!\n")
			time.sleep(0.7)
			Main()
		elif Neustart.upper() == "N":
			time.sleep(0.7)
			print("Danke fürs spielen!")
		else:
			time.sleep(0.7)
			Neustart()
	Neustart()
Main()
BlackJack

Falls jemand zum Schere, Stein, Papier etwas schreiben möchte, dann bitte hier im eigenen Thema dafür: viewtopic.php?f=9&t=40987

Danke. :-)
Antworten