我是一个相当初学的编码员而且我正在为我的一个项目工作,虽然我遇到了麻烦,我已经在网上寻找任何有用的东西,但我可以&#39似乎能够做到这一点。我试图创建一个解决代数方程的程序,我设法将整个字符串分成两个列表,然后我可以将这些列表连接在一起,但它只打印成一个字符串,我可以' t将其打印为浮点数或整数。
import re
group1 = []
group2 = []
subjects = []
question = input("What is the question?")
questions = list(question)
for i in range(len(questions)):
if questions[i] == "=":
for a in range(i):
group1.append(questions[a])
print(group1)
a = a + 2
for b in range(a,len(questions)):
group2.append(questions[b])
print(group2)
for i in range(len(group1)):
if re.match("[a-z]", str(group1[i])):
subjects.append(group1[i])
print(subjects)
for i in range(len(group2)):
if re.match("[a-z]", str(group2[i])):
subjects.append(group2[i])
pair1 = ''.join(group1)
pair2 = ''.join(group2)
print(int(pair1))
print(pair2)
(这当然没有完成)
当它尝试print (int(pair1))
时,我收到此错误:
ValueError:基数为10的int()的无效文字:' 5 + 6'
我需要帮助才能克服这个问题。
答案 0 :(得分:1)
当它尝试
print (int(pair1))
时,我收到此错误:ValueError: invalid literal for int() with base 10: '5+6'
。
字符串'5+6'
不是有效数字。这很容易复制。例如:
>>> int('5+6')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '5+6'
您需要将字符串拆分为单独的数字(即5
和6
),然后将它们添加到一起。请考虑一下:
>>> intlist = [int(i) for i in '5+6'.split('+')]
>>> sum(intlist)
11
>>> # just displaying list
>>> intlist
[5, 6]
上面的代码使用列表理解,基本上等同于以下代码:
>>> strlist = '5+6'.split('+')
>>> intlist = []
>>> for i in strlist:
... intlist.append(int(i))
...
>>> sum(intlist)
11
>>> # just displaying lists for you
>>> strlist
['5', '6']
>>> intlist
[5, 6]
我上面使用的列表理解大约有2行代码;下面的那个更紧凑,更优雅,和Pythonic:
>>> sum(int(i) for i in '5+6'.split('+'))
11
eval
和exec
eval
和exec
功能很强大,但是这种功能会带来危险,因为它更容易搞砸。 (一切都是权衡。)
所以,虽然写eval('2+2')
看起来很诱人,但你应该考虑它的安全隐患,并且在安全方面犯错误,如果你不确定或不做,就要避免使用它有一个知识渊博的人/团队,可以审查代码(如果这是为生产)。
主要问题是eval
不仅会执行任意数学表达式,而且实际上会尝试在之前执行你发送给的任何 经过验证并被认为是安全的。
例如,假设您要求用户输入要评估的表达式,并且从用户的PoV中,它看起来像这样:
Enter a mathematical expression: 2+5+7+1
15
有效!但是软件开发的第1条规则是:你从不信任用户输入
如果您将代码放在服务器/页面中,它看起来像这样:
>>> eval(input('Enter a mathematical expression: '))
猜猜当我作为用户输入以下输入时会发生什么?
>>> Enter a mathematical expression: print([int(i) for i in '2+5+7+1'.split('+')])
确实,结果将是:
>>> [2, 5, 7, 1]
你的&#34;简单&#34;并且&#34;无辜的&#34; app现在用于在系统中执行任意代码。
我不说你应该&#34;永远&#34;使用这些。我我所说的是,在你做之前,你需要知道自己在做什么。
考虑其他SO帖子:
答案 1 :(得分:-1)
首先尝试拆分对,在每个单独的数字上调用int()而不是整个表达式。因此,例如,如果<Style TargetType="{x:Type MenuItem}" x:Key="MenuItemStyle" >
<Setter Property="BorderBrush" Value="White"></Setter>
<Setter Property="BorderThickness" Value="0,0,0,5"></Setter>
<Setter Property="Background" Value="#0264AD"></Setter>
<Setter Property="Foreground" Value="White"></Setter>
<Setter Property="FontSize" Value="12"></Setter>
<Setter Property="FontFamily" Value="Arial"></Setter>
<Setter Property="FontWeight" Value="Bold"></Setter>
<Setter Property="Margin" Value="-5,0,0,0"></Setter>
<Setter Property="Padding" Value="0,12,0,12"></Setter>
<Style.Triggers>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Foreground" Value="LightGray"></Setter>
<Setter Property="Background" Value="#0264AD"></Setter>
</Trigger>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Foreground" Value="#0264AD"></Setter>
<Setter Property="Background" Value="Yellow"></Setter>
</Trigger>
</Style.Triggers>
</Style>
是字符串<ContextMenu x:Name="settingContextMenu" Width="220" >
<MenuItem Style="{StaticResource MenuItemStyle}" Name="CustomizeLocationNames" Click="CustomizeLocationNames_Click" >
<MenuItem.Header>
<TextBlock Text="Customize Location Names" VerticalAlignment="Center"></TextBlock>
</MenuItem.Header>
</MenuItem>
<MenuItem Style="{StaticResource MenuItemStyle}" Name="ZoomRoute" Click="ZoomRoute_Click">
<MenuItem.Header>
<TextBlock Text="Zoom Route" VerticalAlignment="Center"></TextBlock>
</MenuItem.Header>
</MenuItem>
<MenuItem Style="{StaticResource MenuItemStyle}" Name="PrintRoute" Click="PrintRoute_Click">
<MenuItem.Header>
<TextBlock Text="Print Route" VerticalAlignment="Center" >/TextBlock>
</MenuItem.Header>
</MenuItem>
</ContextMenu>
,请执行以下操作:
pair1
当然,您必须更改&#34; - &#34;,&#34; *&#34;或其他算术运算符的split()表达式,并使用float()如果你的数字不是整数。