我正在做一个小的python项目,正在制造化学计算器。首先,由于不能更改元组,因此开始制作由所有元素组成的整个元组系列。我希望能够输入单数和多个元素,但由于某种原因,在当前形状下,它似乎只能与multiple输入一起使用。我不得不在这里将eval
与input
结合使用,以便将输入作为元组接收,尽管我听说eval
通常被认为是不好的做法,因为它允许用户进行所有类型的输入,甚至有害的输入
#snippet of element list data in order of name, electrons and atomic weight, hydrogen and oxygen are use in examples.
Hydrogen = ("Hydrogen" , 1 , 1.008)
Helium = ("Helium" , 2 , 4.003)
Lithium = ("Lithium", 2 , 6.941)
Beryllium = ("Berylium" , 4 , 9.0122)
Boron = ("Boron" , 5 , 10.811)
mollmass = eval(input( "Enter atoms in the molecule: ")) #input needs a comma (,) or plus sign(+) to work
#outputs every element entered, can't multiply values, recurring elements need to be enterd multiple times
for elements in mollmass:
print(f"atomic weight of the element", elements[0] , "is", elements[2])
elemental_sum = 0
#calculates total weight of the molecule
for atomic_weight in mollmass:
elemental_sum = elemental_sum + atomic_weight[2]
print("The mollmass of this molecule is", elemental_sum)
此输出为
atomic weight of the element Hydrogen is 1.008
atomic weight of the element Oxygen is 15.999
The mollmass of this molecule is 17.007
但是,当我只输入一个元素时:
TypeError: 'int' object is not subscriptable
一旦我开始添加一些基本的UI元素,情况就会变得更糟,因为我正在使用QlineEdit,所以我在输入区域使用了self.line.text
,但是如果将input
放在那儿,就完全崩溃了我的程序(Windows错误提示),仅具有eval
会导致TypeError: eval() arg 1 must be a string, bytes or code object
,但是这是一个较晚的日期,因为自从我首先想弄清楚如何使该程序正确运行without UI以来,这是一个问题。这里的任何人都知道如何解决这个问题,或者为我指明了正确的方向?
考虑到这是我的第一个“真实”项目,所有帮助都得到了极大的帮助!
2, 3
,则eval('2, 3')
解析为(2, 3)
。5
,则eval('5')
解析为5
。不同之处在于(2, 3)
是整数的tuple,而5
只是单个整数– 不是tuple
。您循环期望mollmass
是某种可迭代的,但是当它是单个int
值时,它将引发TypeError
。
相反,您可以使mollmass
始终解析为可迭代的对象,并在此过程中摆脱eval
:
raw_mollmass = input("Enter atoms in the molecule: ")
mollmass = [int(x) for x in raw_mollmass.split(",")]
要检查一些输出,我在python
repl(控制台)中运行了此命令:
# Testing to see if this works
def get_mollmass_input():
raw_mollmass = input("Enter atoms in the molecule: ")
mollmass = [int(x) for x in raw_mollmass.split(",")]
return mollmass
>>> get_mollmass_input()
Enter atoms in the molecule: 5, 4, 3, 2, 1
[5, 4, 3, 2, 1]
>>> get_mollmass_input()
Enter atoms in the molecule: 3
[3]