String als operand übergeben

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
senseye
User
Beiträge: 15
Registriert: Sonntag 12. September 2021, 23:00

Hallo,

gibt es eine möglichkeit einen String als Operand zu übergeben?

Beispiel:

Code: Alles auswählen

x = input("Operand: ")		#	operand hier zum Beispiel +

print(10 x 5)			#	so das hier 15 ausgegeben wird
Wäre dies auch mit Funktionsnamen oder Variablennamen möglich?

Beispiel:

Code: Alles auswählen

min_bereich = 10
max_bereich = 20

x = input("min oder max: ")		#	min eingegeben

print(x_bereich)			#	10 ausgegeben
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Du mußt halt die Eingabe in eine Funktion übersetzen, z.B. über ein Wörterbuch:

Code: Alles auswählen

import operator
OPERATIONS = {
    '+': operator.add,
    '-': operator.sub,
}
operand = input("Operand:")
print(OPERATIONS[operand](10, 5))
Genauso geht das mit Deinen Konstanten.
senseye
User
Beiträge: 15
Registriert: Sonntag 12. September 2021, 23:00

Danke für die schnelle Antwort!

Kannst Du mir bitte noch ein Beispiel schreiben, wie ich das in meinem zweiten Beispiel bewerkstelligen würde.

Funktioniert das auch mit Funktionen?

Beispiel:

Code: Alles auswählen

def hallo():
	print("hallo")

x = input()			#	hier "hallo" eingeben

x()				#	Funktion hallo() wird aufgerufen
senseye
User
Beiträge: 15
Registriert: Sonntag 12. September 2021, 23:00

Mein zweites Beispiel mit "min" war bezogen auf das Ersetzen eines Teils eines Namens, oder eines kompletten Namens, einer Variable.
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

im Prinzip genau so, also über ein Dictornary.

Was hast du denn genau vor? Ggf. lohnt sich für dich mal der Blick auf das cmd-Modul , mit dem sich interaktive, Kommandozeilen-basierte Anwendungen erstellen lassen.

Gruß, noisefloor
senseye
User
Beiträge: 15
Registriert: Sonntag 12. September 2021, 23:00

Sozusagen ein Kopfrechenprogramm.
Der Computer gibt mir zwei zufällige Zahlen vor, ich rechne sie im Kopf zusammen und der Computer sagt mir dann, ob richtig, oder nicht.
https://sylvialange.de/python/Programmieraufgaben.pdf - 16. -> 25. -> 30. -> 31.
Ich bin gerade bei Aufgabe 31. Die Grundaufgabe, das Rechnen und Überprüfen funktioniert.
Nur hatte ich jetzt überlegt, wie ich am sinnvollsten die Operandenübergabe gestallte, da ich nicht mit vier if-Abfragen arbeiten wollte, da das sinnlose Coderedundanz verursachen würde.
Daher hatte ich überlegt die Operanden per Liste oder Dictionary zu übergeben.
Daher dann auch die Frage, ob es möglich ist Operanden als String zu übergeben.
Oder anders ausgedrückt, ob es möglich ist Zeichen (oder Namen) aus Strings "auszupacken" und dann im Code direkt zu benutzen?

Auf die Frage, ob Namen von Funktionen, oder Variablen so übergeben werden können, bin ich nur rein aus Interesse gekommen.

Dass ich Funktionen und Variablen in Dictionarys, Listen, ... speichern und dann über den Index aufrufen kann, wusste ich so auch noch nicht.

Code: Alles auswählen

def f():
	print("jo")
	
x = {"a": f}

x["a"]()
Danke erstmal für eure Hilfe, das hat mir schon weitergeholfen!
senseye
User
Beiträge: 15
Registriert: Sonntag 12. September 2021, 23:00

Ich habe eine Lösung für das Ersetzen von Namensteilen von Namen gefunden:

Code: Alles auswählen

max_bereich = 20

i = input()			#	hier max eingeben

print(eval(i+"_bereich"))
Ausgabe: 20

eval() wertet die angegebene Quelle im Kontext von globals und locals aus.

Aus x (was in diesem Fall "max" ist) und "_bereich" wird durch Verkettung "max_bereich".
Da max_bereich im Namensraum existiert, da vorher definiert, gibt print() den Wert 20 aus.

Das funktioniert auch mit Operatoren:

Code: Alles auswählen

i = input()			#	hier + eingeben

print(eval("1"+i+"2"+i+"3"))	#	"1"+i+"2"+i+"3"  ->   "1+2+3"
Ausgabe: 6
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@senseye: Um Himmels willen nein: Vergiss bitte `eval()` gleich wieder. Der Benutzer kann da sonstwas eingeben was dann einfach als Python-Code ausgeführt wird. So etwas macht man nicht. Die Lösung hatten wir schon: Wörterbücher wo Zeichenketten auf Werte abgebildet werden. Diese Werte können auch Funktionen sein, beispielsweise um ein "+" auf `operator.add()` abzubilden.

`i` ist ein verdammt schlechter Name für alles was nicht eine ganze Zahl ist.

Erster Fall:

Code: Alles auswählen

#!/usr/bin/env python3


def main():
    text_to_value = {"max": 20}

    text = input()  # hier "max" eingeben.

    print(text_to_value[text])


if __name__ == "__main__":
    main()
Zweiter Fall:

Code: Alles auswählen

#!/usr/bin/env python3
from operator import add


def main():
    operator_name_to_function = {"+": add}

    operator_name = input()  # hier "+" eingeben.

    function = operator_name_to_function[operator_name]
    print(function(1, function(2, 3)))


if __name__ == "__main__":
    main()
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten