我被要求写一个模拟器,最终目的是查看在大约15个左右的滚子链的末端,滚筒上的墨水量是多少。我目前正在尝试建立一个定义滚筒的字典。由此,我想编写一个函数,该函数将接受用户输入“ roller_diameter”,找到给定直径与固定直径的比率,并将其转换为整数个“ segments”。我不是程序员(我正在使用互联网资源来学习Python [2.7]),并且在TypeError中苦苦挣扎:无法通过非整数类型“ float”对序列进行乘积运算
我确定这是一个小问题,我已经查看了相关的答案,但无法理解我具体在做什么错...任何建议,我们将不胜感激,这是代码(只有几个'rollers' '),请不要笑...
Rubber = True
Copper = False
CW = 1
ACW = -1
num_rollers = 4
plate_diameter = 406.4
rollers = [{} for i in range(num_rollers)]
rollers[0] = {'top_seg': 0, 'roller_diameter': [], 'segments': [], 'material': Copper, 'direction': ACW, 'ink': []}
rollers[1] = {'top_seg': 0, 'roller_diameter': [], 'segments': [], 'material': Rubber, 'direction': CW, 'ink': []}
rollers[2] = {'top_seg': 0, 'roller_diameter': [], 'segments': [], 'material': Copper, 'direction': ACW, 'ink': []}
rollers[3] = ['top_seg': 0, 'roller_diameter': [], 'segments': [], 'material': Rubber, 'direction': CW, 'ink': []}
R = rollers[i]
def roller_data():
global roller_diameter
roller_diameter = float(raw_input("Enter the roller diameter" + str(i) + ': '))
for i in range(num_rollers):
roller_data()
R['segments'] = int(round(rollers[3]['segments']*roller_diameter/plate_diameter))
R['angle'] = (360.0/R['segments'])
print rollers[3]['segments']
TraceBack是:
Traceback (most recent call last):
File "\\datasvr\users\rioliver\Python2.7\dict_test_v2.py", line 24, in <module>
R['segments'] = int(round(rollers[3]['segments']*roller_diameter/plate_diameter))
TypeError: can't multiply sequence by non-int of type 'float'
当您运行此代码时,输入的直径大小无关紧要(我一直在使用85、95、110、120),但是使用什么数字没有区别。我希望它取任何数字(整数或浮点数)并四舍五入任何浮点数。
最佳答案
在这一行:
R['segments'] = int(round(rollers[3]['segments']*roller_diameter/plate_diameter))
您将
rollers[3]['segments']
乘以roller_diameter
,然后除以plate_diameter
。这给你错误信息TypeError: can't multiply sequence by non-int of type 'float'
这告诉我您正在尝试将一个序列(例如列表或元组)乘以浮点数。如果我理解正确,
rollers[3]['segments']
仍然是一个空列表,您正在尝试将其乘以roller_diameter
,这是一个浮点数。我不确定您要在这里做什么,因为您从未分配任何东西给segments
键,就我所知。其他注意事项:
rollers[3] = ['top_seg': 0, 'roller_diameter': [], 'segments': [], 'material': Rubber, 'direction': CW, 'ink': []}
该行给出了SyntaxError,因此显然不是您运行的代码。请始终将您实际运行的代码复制并粘贴到框中,否则人们必须区分“ OP的代码中的错误”和“ OP如何在StackOverflow上编辑代码的错误”。
R = rollers[i]
我认为您认为这意味着
R
现在将始终指向i
中的rollers
-th元素,但这不是Python的工作方式。它的意思是“告诉名称R
现在指的是rollers[i]
当前描述的任何对象”。此时i
为3(您使用的列表理解的剩余部分),因此R = rollers[3]
。如果将for i in range(num_rollers)
更改为for j in..
,您将获得 R = rollers[i]
NameError: name 'i' is not defined
因为它当时正在尝试获取
i
的值,并且没有i
。def roller_data():
global roller_diameter
print i
roller_diameter = float(raw_input("Enter the roller diameter" + str(i) + ': '))
您在这里不需要全局变量。如果要使输入成为函数,只需返回一个值:
def read_diameter(i):
return float(raw_input("Enter the roller diameter # {}: ".format(i)))
然后在找回它时将其分配到某个位置,例如
rollers[i]['roller_diameter'] = read_diameter(i)
并在计算中使用该值,而不是全局
roller_diameter
。我认为您的最后几行中存在缩进错误,并且您希望缩进
R['segments']
位-但是您随后硬编码了rollers[3]
而不是使用rollers[i]
,所以也许我是错的-但请记住, R
始终为rollers[3]
。在循环中使用rollers[i]
或在循环内部设置R = rollers[i]
,以使该行在每次执行时都获得新的i
值。关于python - 不能将序列乘以float类型的非整数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12597464/