我正在使用 Python 3。
我想问这个问题的最好方法是如何在不使用的情况下输入表达式eval(input("Input: "))?
我现在是一个简单的用户,所以我需要 eval 是一个代数计算器。
好.我知道 的 专家 都 讲,你不应该永远使用Python的eval()不受信任的数据,直到永远.我并不比世界其他地方更聪明,甚至不应该尝试这个.但!无论如何,我要去.
我的基本问题是我正在编写一个小计算器评估程序,它将使用python语法的一个子集进行不可信的输入.我知道:使用ply或pyparsing并编写解析器然后我们去.通过传递全局和本地人来解决这个问题是eval()不行的.
我所看到的所有方法(并且一直保持冷漠)试图列举邪恶.在这里,我试图枚举好 - 得到一个AST,只允许几个节点类型,然后验证任何调用是否属于一组白名单函数之一.这是一个迷你实现(和要点):
import ast
import math
SAFE_FX = {
'exp': math.exp,
}
SAFE_NODES = set(
(ast.Expression,
ast.Num,
ast.Call,
ast.Name,
ast.Load,
ast.BinOp,
ast.Add,
ast.Sub,
ast.Mult,
ast.Div,)
)
class CleansingNodeVisitor(ast.NodeVisitor):
def generic_visit(self, node):
if type(node) not in SAFE_NODES:
raise Exception("%s not in SAFE_NODES" % type(node))
super(CleansingNodeVisitor, self).generic_visit(node)
def visit_Call(self, call):
if call.func.id not in SAFE_FX:
raise Exception("Unknown function: %s" % …Run Code Online (Sandbox Code Playgroud) 我正在教一些邻居的孩子用Python编程.我们的第一个项目是将作为罗马数字给出的字符串转换为阿拉伯语值.
因此,我们开发了一个函数来计算一个罗马数字的字符串,该函数接受一个字符串,并创建一个具有阿拉伯语等价物的列表,以及为评估阿拉伯语等价物而进行的操作.
例如,假设你在XI供给的函数将返回[1,"+",10]如果在IX供给的函数将返回[10," - ",1] 由于我们需要处理其中相邻值相等的情况下另外让我们忽略所提供的值是XII的情况,因为它将返回[1,'=',1,'+',10]以及Roman是IIX的情况,因为它将返回[10,' - ', 1, '=',1]
这是功能
def conversion(some_roman):
roman_dict = {'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M',1000}
arabic_list = []
for letter in some_roman.upper():
if len(roman_list) == 0:
arabic_list.append(roman_dict[letter]
continue
previous = roman_list[-1]
current_arabic = roman_dict[letter]
if current_arabic > previous:
arabic_list.extend(['+',current_arabic])
continue
if current_arabic == previous:
arabic_list.extend(['=',current_arabic])
continue
if current_arabic < previous:
arabic_list.extend(['-',current_arabic])
arabic_list.reverse()
return arabic_list
Run Code Online (Sandbox Code Playgroud)
我可以考虑评估结果的唯一方法是使用eval()
就像是
def evaluate(some_list):
list_of_strings = [str(item) for item in some_list]
converted_to_string = ''.join([list_of_strings])
arabic_value = eval(converted_to_string)
return arabic_value
Run Code Online (Sandbox Code Playgroud)
我对这段代码有点紧张,因为在某些时候我读到eval在大多数情况下都很危险,因为它允许有人在你的系统中引入恶作剧.但我无法想出另一种方法来评估从第一个函数返回的列表.所以无需编写更复杂的功能.
孩子们获得了转换功能,所以即使看起来很复杂,他们也会理解罗马数字转换的过程,这是有道理的.当我们谈论评估虽然我可以看到他们迷路了.因此,我真的希望通过某种方式来评估不需要太多复杂代码的转换函数的结果.
对不起,如果这是扭曲的,我就是这样...
我想在Python中的函数参数中传递一个公式,其中公式是其他函数参数的组合.原则上,这将是这样的:
myfunction(x=2,y=2,z=1,formula="x+2*y/z")
6
Run Code Online (Sandbox Code Playgroud)
或更具体:
def myformula(x,y,z,formula):
return formula(x,y,z)
Run Code Online (Sandbox Code Playgroud)
这将允许用户根据x,y和z选择任何算术表达式,而无需创建新函数.
我预见的一种可能性是在函数内的代码行中转换字符串.在Python中有什么可能吗?还是其他任何想法?谢谢
我有一个像这样的变量形式描述的表达式
's1*3 - (s2-s1)*1'
Run Code Online (Sandbox Code Playgroud)
我已经给出了可以根据需要改变的 s1 和 s2 的值
我可以使用 python ast模块通过替换各自的 s1 和 s2 值来评估这个表达式 (s1 = 20,s2=30)
import ast
import operator as op
operators = {ast.Add: op.add, ast.Sub: op.sub, ast.Mult: op.mul,
ast.Div: op.truediv, ast.Pow: op.pow, ast.BitXor: op.xor,
ast.USub: op.neg}
def eval_(node):
if isinstance(node, ast.Num): # <number>
return node.n
elif isinstance(node, ast.BinOp): # <left> <operator> <right>
return operators[type(node.op)](eval_(node.left), eval_(node.right))
elif isinstance(node, ast.UnaryOp): # <operator> <operand> e.g., -1
return operators[type(node.op)](eval_(node.operand))
else:
raise TypeError(node)
>>> str1 = '20*3 - (30-20)*1' …Run Code Online (Sandbox Code Playgroud) 我正在创建一个方法来构造一个匿名方法来返回多个变量的函数,例如f(x,y,z)= b.我希望用户能够传递变量列表:
def get_multivar_lambda(expression, variables=["x"])
Run Code Online (Sandbox Code Playgroud)
然后我希望返回的匿名函数采用精确的len(variables)参数(基于列表索引的位置或基于列表中字符串的关键字).我知道我可以使用*args和检查长度,但这似乎不优雅.
这可能吗?我怎么能这样做?
这是我如何为一个变量(其中seval是一个来自模块simple_eval)的例子:
def get_lambda(expression, variable="x"):
return lambda arg: seval(expression.replace(variable, str(arg)))
Run Code Online (Sandbox Code Playgroud)
这是我如何通过检查arguments*传递的长度来做到的:
def get_multivar_lambda(expression, variables=["x"]):
def to_return(*arguments):
if len(variables) != len(arguments):
raise Exception("Number of arguments != number of variables")
for v, a in zip(variables, arguments):
expression.replace(v, a)
return seval(expression)
return to_return
Run Code Online (Sandbox Code Playgroud)
编辑:我从用户输入中获取表达式和变量,因此一种安全的方法是最好的.
我知道还有像我这样的其他问题,但唯一的问题是他们获得了列表中所有变量的所有组合,但我想要它,以便用户输入想要的数字和他们需要的数字数字。这是我拥有的代码:
numbers = []
operators = ['+', '*', '-', '/']
desire = int(input("Enter the number you want: "))
num1 = int(input("Enter First number: "))
num2 = int(input("Enter Second number: "))
num3 = int(input("Enter Third number: "))
num4 = int(input("Enter Fourth number: "))
numbers.append(num1)
numbers.append(num2)
numbers.append(num3)
numbers.append(num4)
Run Code Online (Sandbox Code Playgroud)
但我不知道如何扩展这个
这是代码应该做什么的示例:
说他们想要的数字是24和
说他们输入的数字是 1, 9, 8, 2
输出应该是这样的:
9 - 1 + 8 * 2 = 24
等等...
需要列出所有可能的解决方案
所有的建议将大大appriciated
我正在研究一种"复制粘贴计算器",它可以检测复制到系统剪贴板的任何数学表达式,对它们进行评估并将答案复制到准备粘贴的剪贴板上.但是,虽然代码使用了eval()函数,但考虑到用户通常知道他们正在复制什么,我并不十分担心.话虽如此,我想找到一种更好的方法,而不会给计算带来障碍(例如,删除计算乘法或指数的能力).
这是我的代码的重要部分:
#! python3
import pyperclip, time
parsedict = {"×": "*",
"÷": "/",
"^": "**"} # Get rid of anything that cannot be evaluated
def stringparse(string): # Remove whitespace and replace unevaluateable objects
a = string
a = a.replace(" ", "")
for i in a:
if i in parsedict.keys():
a = a.replace(i, parsedict[i])
print(a)
return a
def calculate(string):
parsed = stringparse(string)
ans = eval(parsed) # EVIL!!!
print(ans)
pyperclip.copy(str(ans))
def validcheck(string): # Check if the copied item is a math expression …Run Code Online (Sandbox Code Playgroud) 我正在用Python创建一种编程语言,而我基本语言中缺少的一个主要组件就是能够解析数学方程式.我有解析数学的函数,但我需要能够检查输入是否是数学方程式.我正在寻找匹配3*x ^(4*y)+ 1-(7*y*z/x)之类的正则表达式.
以下是我的代码,它的工作原理.它创建两个随机数,一个随机运算符并将它们放在一起,但是在执行此操作后它不会对它们求和.我需要的是程序将其识别为方程,而不是简单地打印出各个变量.
所以,为了避免混淆; 我的问题是:如何使用所选的任何东西得到firstNumber和secondNumber汇总operator,而不是简单地将它们一起打印出来?
from random import choice
from random import randint
ranOperator = ["*", "/", "+", "-"]
def askQuestion():
firstNumber = randint(1,10)
secondNumber = randint(1,10)
operator = choice(ranOperator)
generateQuestion = ' '.join((str(firstNumber), operator, str(secondNumber)))
print(generateQuestion)
askQuestion()
Run Code Online (Sandbox Code Playgroud)
当前输出(示例):
4 + 3
Run Code Online (Sandbox Code Playgroud)
使用上面相同的数字,我想要发生的事情:
7
Run Code Online (Sandbox Code Playgroud) If a have the string calculation = '1+1x8'. How can I convert this into calculation = 1+1*8? I tried doing something like
for char in calculation:
if char == 'x':
calculation = calculation.replace('x', *)
# and
if char == '1':
calculation = calculation.replace('1', 1)
Run Code Online (Sandbox Code Playgroud)
This clearly doesn't work, since you can't replace just one character with an integer. The entire string needs to be an integer, and if I do that it doesn't work either since I can't …
python ×10
eval ×3
math ×3
python-3.x ×3
parsing ×2
calculator ×1
combinations ×1
for-loop ×1
function ×1
lambda ×1
numbers ×1
random ×1
regex ×1
security ×1
types ×1