1

我被要求编写一个模拟器,最终目标是查看在大约 15 个滚筒链末端的滚筒上最终有多少墨水。我目前正在尝试建立一个定义滚轮的字典。由此我想编写一个函数,它将接受用户输入“roller_diameter”,找到给定直径与固定直径的比率并将其转换为整数个“段”。我不是程序员(我正在使用互联网资源学习 Python [2.7])并且正在努力解决 TypeError: can't multipy sequence by non-int type '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),但使用的数字没有区别。我希望它采用任何数字(整数或浮点数)并舍入任何浮点数。

4

2 回答 2

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]  

我认为您认为这意味着 thatR现在将始终指向 中的i-th 元素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每次执行时都获得一个新值。

于 2012-09-26T12:02:35.790 回答
0

错误输出显示

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

在您的代码中,您有 R['segments'] = float(round(rollers[3]['segments']*roller_diameter/plate_diameter))

您是否正在运行正确或最新版本的代码?您在此处拥有的代码块是否与您从中收到此错误的代码相同?

问候

于 2012-09-26T08:27:15.110 回答