不能用float类型的非int乘以序列?

时间:2012-09-26 08:20:27

标签: python python-2.7

我被要求写一个模拟器,最终目标是看看在一个可能有15个左右的滚子链的末端的圆柱上有多少墨水。我正在尝试设置一个定义滚轮的字典。由此我想编写一个将用户输入的函数'roller_diameter',找到给定直径与固定直径的比率,并将其转换为整数个“段”。我不是程序员(我正在学习使用互联网资源的Python [2.7])并且正在努力应对TypeError:不能通过非int类型'float'来繁殖序列 我确定这是一个微不足道的问题,我已经看了相关的答案,但一直无法理解具体我做错了什么...任何建议将不胜感激,这里是代码(只有几个'滚子'),请不要笑......

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),但使用的数字没什么区别。我希望它取任何数字(整数或浮点数)并舍入任何浮点数。

2 个答案:

答案 0 :(得分:2)

在这一行:

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 - 元素,但这不是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的新值。

答案 1 :(得分:0)

错误输出显示

R['segments'] = int(round(rollers[i]['segments']*roller_diameter/plate_diameter)) 

您的代码中的位置     R ['segments'] = float(圆形(滚轮[3] ['segment'] * roller_diameter / plate_diameter))

您是否可以运行正确或最新版本的代码?您在这里的代码块是否与您从此处获得此错误的代码相同?

此致