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 (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'

これは、シーケンス (リストやタプルなど) に 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-th 要素を指すようになることを意味すると思うと思いますrollersが、それは Python のしくみではありません。それが意味することは、「現在記述さ れているRオブジェクトが何であれ、それが現在参照していることを名前に伝える」ことです。はこの時点で 3 です (使用したリスト内包表記の残り) ので、. に変更すると、rollers[i]iR = 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)

global ではなく、その値を計算に使用しますroller_diameter

最後の数行にインデントエラーがあり、ビットをインデントしたかったR['segments']と思います. ループ内で使用するか、ループ内で設定して、その行が実行されるたびに新しい値を取得するようにします。rollers[3]rollers[i]Rrollers[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 に答える