【发布时间】:2020-06-01 05:03:34
【问题描述】:
我的问题
我的解决方案:
import re
import math
a = input().replace("|","")
op = re.findall("[A-Z]+", a)[0]
a = list(map(float,re.split(r'P|S|M|D',a)))
expressions = {'P':'str(a[0]+a[1])','S':'str(a[0]-a[1])','M':'str(a[0]*a[1])','D':'str(a[0]/a[1])'}
exec('ex = eval(expressions[op])+"0"')
ex = ex[:ex.find(".")+3][::-1]
l = [6]
l.extend([6+3*x for x in range(1,(len(ex)-6)//2+1)])
if ex[-1]=="-":
l.pop()
for i in l:
ex = ex[:i] + "|" + ex[i:]
ex = ex[::-1]
ex = "0"+ex.strip("|") if ex.find("|")==1 else ex.strip("|")
print(ex)
问题:
如果我将此代码包装在一个接受字符串输入并尝试返回我的ex 的函数中,代码会显示错误并且没有任何更改。我的问题是,谁能解释为什么这个单独工作完美并引发错误包裹在函数中时?
【问题讨论】:
-
你为什么不只是(字符串)在空格上分割?
-
@KlausD。我知道其他方法,我能够解决它,但我的问题与 exec 的行为不同。
-
尝试使用
eval/exec解决这个问题是个坏主意。使用实际代码而不是exec更容易、更易于维护和更易于理解。这将避免您的范围问题,并将帮助您避免各种“令人惊讶”的行为。 -
@JanChristophTerasa 我尽量减少代码行。
-
在我看来,您似乎在尝试模拟 lambdas,但由于它们在 Python 中可用,您只需将 lambdas 放入您的
expressions字典中。
标签: python python-3.x list algorithm