Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以让用户输入tuple';python中的数据输出是什么?_Python_Python 3.x_Tuples_User Input_Qlineedit - Fatal编程技术网

是否可以让用户输入tuple';python中的数据输出是什么?

是否可以让用户输入tuple';python中的数据输出是什么?,python,python-3.x,tuples,user-input,qlineedit,Python,Python 3.x,Tuples,User Input,Qlineedit,我正在从事一个小型python项目,在那里我正在制作一个化学计算器。 首先,由于元组不能更改,所以初学者开始制作一系列由所有元素组成的元组。 我希望能够输入单数和多个元素,但在它的当前形状中,它似乎只是出于某种原因与多个输入一起工作。我不得不在这里使用eval与input相结合,以便将输入作为元组提取,尽管我听说eval通常被认为是不好的做法,因为它允许用户进行所有类型的输入,甚至有害的输入 #snippet of element list data in order of name, elec

我正在从事一个小型python项目,在那里我正在制作一个化学计算器。 首先,由于元组不能更改,所以初学者开始制作一系列由所有元素组成的元组。 我希望能够输入单数和多个元素,但在它的当前形状中,它似乎只是出于某种原因与多个输入一起工作。我不得不在这里使用
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必须是字符串,字节或代码对象
但是,这是目前以后的问题,因为我首先想弄清楚如何在没有UI的情况下让程序正常工作。 这里有人知道如何解决这个问题,或者有人给我一个指向正确方向的指针吗

考虑到这是我的第一个“真正的”项目所有的帮助是非常感谢

  • 如果用户键入
    2,3
    ,则
    eval('2,3')
    解析为
    (2,3)
  • 如果用户键入
    5
    ,则
    eval('5')
    解析为
    5
区别在于
(2,3)
是一个整数元组,
5
只是一个整数,而不是
元组。循环期望
mollmass
是某种类型的iterable,但当它是单个
int
值时,它会引发
TypeError

相反,您可以使
mollmass
始终解析为一个iterable,并在过程中去掉
eval

raw\u mollmass=输入(“在分子中输入原子:”)
mollmass=[int(x)表示原始mollmass.split中的x(“,”)]
为了检查一些输出,我在
python
repl(控制台)中运行了以下命令:

#测试是否有效
def get_mollmass_input():
原始质量=输入(“在分子中输入原子:”)
mollmass=[int(x)表示原始mollmass.split中的x(“,”)]
返回质量
>>>获取质量输入()
在分子中输入原子:5,4,3,2,1
[5, 4, 3, 2, 1]
>>>获取质量输入()
在分子中输入原子:3
[3]

问题在于,如果只有一个元素,那么第一个for循环将在元素所在的列表上循环。Ex如果仅为循环选择硼,则循环打开(“硼”,5,10.811),这意味着它应在错误之前实际打印:“元素B的原子量为r”。用if语句解决这个问题,确保有不止一个元素,如果没有,则以不同的方式处理。感谢您的建议和代码参考,我将在有机会正确执行后立即尝试