Jak zmienić ciąg znaków, taki jak "+" w operator plus? Dzięki!Włącz ciąg znaków do operatora
Odpowiedz
Użyj tabeli odnośników:
import operator
ops = { "+": operator.add, "-": operator.sub } # etc.
print ops["+"](1,1) # prints 2
Można spróbować użyć eval(), ale jest to niebezpieczne, jeśli słowa nie idą z wami. Else można rozważyć stworzenie słownika:
ops = {"+": (lambda x,y: x+y), "-": (lambda x,y: x-y)}
etc ..., a następnie wywołanie
ops['+'] (1,2)
lub dla danych wejściowych użytkownika:
if ops.haskey(userop):
val = ops[userop](userx,usery)
else:
pass #something about wrong operator
import operator
def get_operator_fn(op):
return {
'+' : operator.add,
'-' : operator.sub,
'*' : operator.mul,
'/' : operator.div,
'%' : operator.mod,
'^' : operator.xor,
}[op]
def eval_binary_expr(op1, oper, op2):
op1,op2 = int(op1), int(op2)
return get_operator_fn(oper)(op1, op2)
print eval_binary_expr(*("1 + 3".split()))
print eval_binary_expr(*("1 * 3".split()))
print eval_binary_expr(*("1 % 3".split()))
print eval_binary_expr(*("1^3".split()))
W python3, daje to: '+': operator.add, AttributeError: obiekt 'str' nie ma atrybutu 'dodaj' –
Problem polega na tym, że źle nazwany 'operator' Parametr koliduje z importowanym modułem operatorskim. Zgaduję, że wstawiłeś 'get_operator_fn' z' eval_binary_expr'. Zmień parametr 'operator' na coś innego, na przykład' oper' i wszystkie odniesienia do niego. Zobacz moją edycję. – PaulMcG
Dla Python3, będziesz także musiał zmienić 'operator.div' na' operator.truediv' i naprawić wszystkie instrukcje drukowania. – PaulMcG
moim zdaniem, odpowiedź proponowany przez Amnon jest właściwy.
Jednak może być również zainteresowany tym artykule o matematycznym parser: http://effbot.org/zone/simple-top-down-parsing.htm
Podczas gdy ten link może odpowiedzieć na pytanie, lepiej umieścić tutaj istotne części odpowiedzi i podać odnośnik. Odpowiedzi dotyczące linków mogą stać się nieprawidłowe, jeśli strona z linkami się zmieni. - [Z recenzji] (/ opinia/niskiej jakości-posts/18628184) – xgord
To należy do sekcji komentarzy, ponieważ nie jest bezpośrednią odpowiedzią. – Pablo
Jest magiczny sposób odpowiadający każdym operatorem
OPERATORS = {'+': 'add', '-': 'sub', '*': 'mul', '/': 'div'}
def apply_operator(a, op, b):
method = '__%s__' % OPERATORS[op]
return getattr(b, method)(a)
apply_operator(1, '+', 2)
to działa dobrze, dzięki za udostępnianie. do sprawdzania poprawności możemy rozszerzyć apply_operator. jeśli PO == '/' i B == 0: \t powrotu np.inf jeśli PO == '/' i == 0: \t powrotu 0 – iratzhash
nie pozwolić [NotImplemented] (https: //docs.python.org/3/library/constants.html#NotImplemented) działa poprawnie. – wim
- 1. ciąg znaków do listy znaków
- 2. Włącz każdą parę znaków w ciągu
- 3. Operatora '==' Operatora 'System.Guid' i 'string' w linq do encji
- 4. Zastępowanie znaków od ciągu jeden do dwóch ciąg znaków
- 5. Szyfruj pusty ciąg znaków
- 6. Podział ciąg do tablicy ciągów pojedynczych znaków
- 7. Angular2 przeanalizuj ciąg znaków do html
- 8. PowerShell: Jak ograniczyć ciąg do N znaków?
- 9. Napisz ciąg danych do tablicy znaków NumPy?
- 10. Jak przeanalizować ciąg znaków do NSTimeInterval
- 11. Ruby taśmy ciąg znaków
- 12. Dlaczego Perl nie obsługuje operatora normalnego [] do indeksowania ciągu znaków?
- 13. Dosłowny szablon operatora: dlaczego nie ciąg?
- 14. Utwórz ciąg znaków N
- 15. Dlaczego AppDomainSetup.ShadowCopyFiles ciąg znaków?
- 16. Szyfrowanie ciąg znaków Java
- 17. przekonwertować ciąg Unicode zbiegłego ciąg znaków ASCII
- 18. Przekształć tablicę znaków na ciąg znaków
- 19. Konwertowanie znaków Unicode na ciąg znaków
- 20. R, podzielony ciąg znaków na pary znaków
- 21. Losowy ciąg znaków z listy ciągów znaków
- 22. Konwertuj ciąg znaków RTF na ciąg XAML
- 23. ciąg :: kasowanie (0) na pusty ciąg znaków?
- 24. Drukuj ciąg znaków bez uciekających
- 25. hex ciąg znaków w Pythonie
- 26. Configparser i ciąg znaków z%
- 27. Zamień ciąg znaków w pliku
- 28. Ciąg znaków RODBC jest przycinany
- 29. Jak sortować alfabetycznie ciąg znaków?
- 30. Utwórz nieprawidłowy ciąg znaków UTF8?
zamiast można konwertować inne rzeczy do sznurka i oceniać http : //stackoverflow.com/questions/729248/python-eval-and-globals – Xinus