Seite 1 von 1

String als operand übergeben

Verfasst: Mittwoch 15. September 2021, 17:39
von senseye
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

Re: String als operand übergeben

Verfasst: Mittwoch 15. September 2021, 17:56
von Sirius3
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.

Re: String als operand übergeben

Verfasst: Mittwoch 15. September 2021, 18:20
von senseye
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

Re: String als operand übergeben

Verfasst: Mittwoch 15. September 2021, 18:25
von senseye
Mein zweites Beispiel mit "min" war bezogen auf das Ersetzen eines Teils eines Namens, oder eines kompletten Namens, einer Variable.

Re: String als operand übergeben

Verfasst: Mittwoch 15. September 2021, 18:57
von noisefloor
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

Re: String als operand übergeben

Verfasst: Mittwoch 15. September 2021, 22:55
von senseye
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!

Re: String als operand übergeben

Verfasst: Freitag 17. September 2021, 22:46
von senseye
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

Re: String als operand übergeben

Verfasst: Freitag 17. September 2021, 23:32
von __blackjack__
@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()