質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

33027閲覧

unsupported operand type(s) for *: 'NoneType' and 'int'について

suugaku_nyumon

総合スコア37

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/12/11 14:43

質問内容

https://teratail.com/questions/163238

前の質問がこちらでコードを短くしようと試みておりましたが、関数を定義した際に新たに問題が起きました。

条件によって式の係数が変わるので予め、例えば30行目ではdef infect_Cattle(m)のように係数を定義して、条件によって0.75か0.25か変わるようにしておりました。

そして起動してみたのですが以下のエラーメッセージが出てきました。数字と数字を掛け合わせているはずなのにNoneTypeが出ていて困っています。これはどこが問題なのでしょうか?

コード

python3

1from tkinter import * 2import time 3import tkinter as tk 4import random 5import math 6#配列の宣言 7def array2(N1,N2): 8 return [[0 for j in range(N2)]for k in range(N1)] 9def array3(N1,N2,N3): 10 return [array2(N2,N3)for k in range(N1)] 11#セルの初期設定 12def initdt(): 13 A=array3(1000,31,31) 14 B=array3(1000,31,31) 15 for i in range(1,31): 16 for j in range(1,31): 17 if (i == 15 and j == 15): 18 A[0][i][j] = 1 19 B[0][i][j] = 1 20 else: 21 r_i=random.random() 22 if (r_i <= 0.5): 23 A[0][i][j] = 2 24 B[0][i][j] = 0 25 if (r_i > 0.5): 26 A[0][i][j] = 4 27 B[0][i][j] = 0 28 return A , B 29 30def infect_Cattle(m): 31 if m == 1 or m == 2: 32 return 0.75 33 if m == 3 or m == 4: 34 return 0.25 35 36def infect_Bear(m): 37 if m == 1 or m == 2: 38 return 0.10 39 if m == 3 or m == 4: 40 return 0.40 41 42#セルオートマトンの実行 43def execCell(A,B,i1): 44 i2 = 1 + i1 45 for i in range(1,30): 46 for j in range(1,30): 47 alpha = 0.50 48 a = 0.60 49 if A[i1][i][j] == 1: 50 B[i2][i][j] = (1 - alpha) * B[i1][i][j] 51 if B[i2][i][j] >= 0 and B[i2][i][j] < a: 52 A[i2][i][j] = 2 53 if B[i2][i][j] >= a and B[i2][i][j] <= 1.0: 54 A[i2][i][j] = 1 55 if A[i1][i][j] == 2: 56 B[i2][i][j] = (1 - alpha) * B[i1][i][j] + infect_Cattle(A[i1][i-1][j]) * B[i1][i-1][j] + infect_Cattle(A[i1][i+1][j]) * B[i1][i+1][j] + infect_Cattle(A[i1][i][j-1]) * B[i1][i][j-1] + infect_Cattle(A[i1][i][j+1]) * B[i1][i][j+1] 57 if B[i2][i][j] >= 0 and B[i2][i][j] < a: 58 A[i2][i][j] = 2 59 if B[i2][i][j] >= a and B[i2][i][j] <= 1.0: 60 A[i2][i][j] = 1 61 if B[i2][i][j] > 1.0: 62 A[i2][i][j] = 1 63 B[i2][i][j] = 1.0 64 if A[i1][i][j] == 3: 65 B[i2][i][j] = (1 - alpha) * B[i1][i][j] 66 if B[i2][i][j] >= 0 and B[i2][i][j] < a: 67 A[i2][i][j] = 4 68 if B[i2][i][j] >= a and B[i2][i][j] <= 1.0: 69 A[i2][i][j] = 3 70 if A[i1][i][j] == 4: 71 B[i2][i][j] = (1 - alpha) * B[i1][i][j] + infect_Bear(A[i1][i-1][j]) * B[i1][i-1][j] + infect_Bear(A[i1][i+1][j]) * B[i1][i+1][j] + infect_Bear(A[i1][i][j-1]) * B[i1][i][j-1] + infect_Bear(A[i1][i][j+1]) * B[i1][i][j+1] 72 if B[i2][i][j] >= 0 and B[i2][i][j] < a: 73 A[i2][i][j] = 4 74 if B[i2][i][j] >= a and B[i2][i][j] <= 1.0: 75 A[i2][i][j] = 3 76 if B[i2][i][j] > 1.0: 77 A[i2][i][j] = 3 78 B[i2][i][j] = 1.0 79#セルの位置決めとIDの設定 80def drawCell(canvas,A,k): 81 x2=0 82 CID=array2(31,31) 83 for i in range(1,30): 84 x1=x2 85 x2=x1+20 86 y2=0 87 for j in range(1,30): 88 y1=y2 89 y2=y1+20 90 CID[i][j]=canvas.create_rectangle(x1,y1,x2,y2,fill='black') 91 return CID 92#セルの色設定 93def modifyCell(canvas,A,k,CID): 94 CL=['black','#ffffff','#ff0000','#ffffff','#0000ff'] 95 for i in range(1,30): 96 for j in range(1,30): 97 canvas.itemconfig(CID[i][j],fill=CL[A[k][i][j]]) 98 canvas.itemconfig(CID[i][j],outline=CL[A[k][i][j]]) 99#Tk初期設定 100def initTk(): 101 tk=Tk(); tk.title("2D Cell Automaton"); tk.resizable(0,0) 102 return tk 103#画面キャプチャ用 104def leftMouseDown(event): 105 global canvas, A,k,CID 106 modifyCell(canvas,A,k,CID) 107 execCell(A,B,k) 108#実行メイン 109A,B=initdt() 110root=initTk() 111canvas=Canvas(root,width=580,height=580,highlightthickness=0) 112canvas.pack() 113CID=drawCell(canvas,A,0) 114k=0 115 116def animate(): 117 global k 118 modifyCell(canvas, A, k, CID) 119 execCell(A,B,k) 120 k = 1 + k 121 root.after(1000, animate) 122 123root.after(1000, animate) 124root.mainloop()

エラーコード

Exception in Tkinter callback Traceback (most recent call last): File "C:\Python37\lib\tkinter\__init__.py", line 1705, in __call__ return self.func(*args) File "C:\Python37\lib\tkinter\__init__.py", line 749, in callit func(*args) File "2d_infect_alter.py", line 150, in animate execCell(A,B,k) File "2d_infect_alter.py", line 56, in execCell B[i2][i][j] = (1 - alpha) * B[i1][i][j] + infect_Cattle(A[i1][i-1][j]) * B[i1][i-1][j] + infect_Cattle(A[i1][i+1][j]) * B[i1][i+1][j] + infect_Cattle(A[i1][i][j-1]) * B[i1][i][j-1] + infect_Cattle(A[i1][i][j+1]) * B[i1][i][j+1] TypeError: unsupported operand type(s) for *: 'NoneType' and 'int'

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

数字と数字を掛け合わせているはずなのにNoneTypeが出ていて

「掛け合わせているはず」ですがこのメッセージが出ているからにはNoneと数値を演算しようとしているのは確実です。

原因はinfect_Cattleなどの関数がNoneを返す場合があるからです。

infect_Cattleの引数に1,2,3,4以外が渡されるケース、つまり「AもBもいないセル」に対してinfect_Cattleを呼び出したケースがありますね。

2つのif文に合致しない場合は感染率を0とみなし最後にreturn 0を追加すればよいでしょう。


閑話休題:

コードの行が長すぎてコードが見づらくなっています。どうしても一行が長くなる場合、適切な場所で継続行にすることをお勧めします。

Python

1B[i2][i][j] = (1 - alpha) * B[i1][i][j] + infect_Cattle(A[i1][i-1][j]) * B[i1][i-1][j] + infect_Cattle(A[i1][i+1][j]) * B[i1][i+1][j] + infect_Cattle(A[i1][i][j-1]) * B[i1][i][j-1] + infect_Cattle(A[i1][i][j+1]) * B[i1][i][j+1] 2 3==> 4 5B[i2][i][j] = (1 - alpha) * B[i1][i][j] \ 6 + infect_Cattle(A[i1][i-1][j]) * B[i1][i-1][j] \ 7 + infect_Cattle(A[i1][i+1][j]) * B[i1][i+1][j] \ 8 + infect_Cattle(A[i1][i][j-1]) * B[i1][i][j-1] \ 9 + infect_Cattle(A[i1][i][j+1]) * B[i1][i][j+1]

投稿2018/12/11 15:05

KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

suugaku_nyumon

2018/12/11 15:48

KSwordOfHasteさん。本当にありがとうございます。 そして、見ずらいコードで申し訳ございません。 これからは1行が長くなりそうな場合は継続行にすることにします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問