【发布时间】:2019-12-10 20:55:36
【问题描述】:
我正在做一个小型 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 但是这是一个以后的问题,因为我首先想弄清楚如何让程序在没有 UI 的情况下正常工作。
这里的任何人都知道如何解决这个问题或有一个指向正确方向的指针吗?
考虑到这是我的第一个“真正”项目,非常感谢所有帮助!
【问题讨论】:
-
问题在于,如果只有一个元素,那么第一个 for 循环将在该元素所在的列表上循环。例如,如果仅选择了硼,则 for 循环将在 ("Boron" , 5 , 10.811) 上循环,这意味着它实际上应该在错误之前打印:“元素 B 的原子量为 r”。用 if 语句解决这个问题,确保有多个元素,如果没有,则区别对待。
标签: python python-3.x tuples user-input qlineedit