2016-09-23 3 views
0

私はPythonに問題があり、なぜ私は理解できないのですか? Iが(1/2の確率で)リストの内部番号を変更する「MUT1」関数を作成したいずれか1を加算または1を減算で、0と9を除い:pythonの単項演算子型が不正です - : 'NoneType'

def mut1 (m): 
    i=np.random.randint(1,3) 
    j=np.random.randint(1,3) 
    if i==1: 
     if 0<m<9: 
      if j==1: 
       m=m+1 
      elif j==2: 
       m=m-1 
     elif m==0: 
      if j==1: 
       m=1 
      if j==2: 
       m=9 
     elif m==9: 
      if j==1: 
       m=0 
      if j==2: 
       m=8 
    print m 

MUT1機能をよくするための私は、リストP1作成した場合、:その後

>>>p1=np.array(range(8),int).reshape((4, 2)) 

を私が書く場合、私は

>>>mut1(p1[1,1]) 

Hovewer P1リストに(ここでは3)の数で、 "MUT1" を適用します。

>>> p1[1,1]=mut1(p1[1,1]) 

私はメッセージエラーがあります。

Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: long() argument must be a string or a number, not 'NoneType'

+7

あなたの関数は' NONE'返します。印刷は*同じではありません。それは代わりにコンソールに値を書き込んでいます。 –

答えて

1

あなたmut1結果のnumpy.int64型を返す確認する必要があるため発生します。だから私はあなたの次の修正コードを試して、働いた。

>>> import numpy as np 
>>> import random 
>>> 
>>> def mut1 (m): 
...  i=np.random.randint(1,3) 
...  j=np.random.randint(1,3) 
...  if i==1: 
...   if 0<m<9: 
...    if j==1: 
...     m=m+1 
...    elif j==2: 
...     m=m-1 
...   elif m==0: 
...    if j==1: 
...     m=1 
...    if j==2: 
...     m=9 
...   elif m==9: 
...    if j==1: 
...     m=0 
...    if j==2: 
...     m=8 
...  return np.int64(m) 
... 
>>> p1=np.array(range(8),int).reshape((4, 2)) 
>>> mut1(p1[1,1]) 
2 
>>> p1[1,1]=mut1(p1[1,1]) 
>>> 

ですから、変更する必要がある唯一のものはreturn np.int64(m)print mを交換した後、動作するはずです!これはデバッグコードの以下のようなものをなぜ起こったか

あなたは簡単に理解する:それには `return`文が存在しないため

>>> type(p1[1,1]) 
<type 'numpy.int64'> 
>>> type(mut1(p1[1,1])) 
<type 'NoneType'> 
関連する問題