-2

Pythonバージョン2.6を実行しているMacとバージョン3.2を実行しているLenovoの2つの異なるマシンで使用する関数があります。この関数はデータをファイルに書き込み、ループ内でwithから呼び出されます。Python 3.2を使用すると、期待どおりに動作し、次のような出力が得られます

25.0    25.0    25.0    0
25.0    25.0    75.0    0
25.0    25.0    125.0   0
25.0    25.0    175.0   0
25.0    25.0    225.0   0
25.0    75.0    25.0    0
25.0    75.0    75.0    0
25.0    75.0    125.0   0
25.0    75.0    175.0   0
25.0    75.0    225.0   0

バージョン2.6を実行しているマシンで実行すると、これが表示されます

175.0   25.0    75.0    2
175.0   25.0    125.0   0
25.0    25.0    25.0    0   Should be first line
175.0   25.0    175.0   0
25.0    25.0    75.0    0   Should be second line
175.0   25.0    225.0   0   
25.0    25.0    125.0   1
175.0   75.0    25.0    0
25.0    25.0    175.0   1
175.0   75.0    75.0    2

これがコードです

def filesave(Xc,Yc,Zc,S): 
 Xc = str(Xc)
 Yc = str(Yc)
 Zc = str(Zc)
 Xs = str(S)
 #Ms = str(Ma)   
 w = open("Myout.txt.","a+")
 w.write(Xc)
 w.write('\t')
 w.write(Yc)
 w.write('\t')
 w.write(Zc)
 w.write('\t')
 w.write(Xs)
 w.write('\n')
 w.close()
 return()

違いを引き起こしている2つのバージョンの間にいくつかの違いはありますか?ありがとう!

編集

残りのコード

def cell_centers():
 read_file(F)
 dx = dy = dz= float(input('Please enter a value for dr:'))    #length of cell side 
 N  = int(input('Please enter a value for N:')) #N^3 Number of cells to be created
 Xc = zeros(N)       #array creation
 Yc = zeros(N)
 Zc = zeros(N)
 x1=0
 y1=0
 z1=0
 county = 0
 countz = 0

 for i in range(N):          #for loops to define cell centers
    Xc[i] = dx/2 +x1                  
    xmin = Xc[i]-dx/2
    xmax = Xc[i]+dx/2
    x1+=dx                   #increments x1 positions by dx
    for j in range(N):
      Yc[j] = dy/2 +y1
      ymin = Yc[j]-dy/2
      ymax = Yc[j]+dy/2
      county+=1
      if county==N:          #if else statement resets y1 to zero
        y1=0
        county=0
      else:
        y1+=dy
      for k in range(N):
         Zc[k] = dz/2 +z1
         countz+=1
         zmin = Zc[k]-dz/2
         zmax = Zc[k]+dz/2
         if countz==N:
          z1=0   
          countz=0
         else:
          z1+=dz
         counter(Xc[i],Yc[j],Zc[k],N,xmin,xmax,ymin,ymax,zmin,zmax,*read_file(F))

 return()        



def counter(Xc,Yc,Zc,N,xmin,xmax,ymin,ymax,zmin,zmax,Xa,Ya,Za):
 Cellcount = zeros(1)   
 S = (((xmin <= Xa) & (Xa <= xmax))& #count what is in specific range
     ((ymin <= Ya) & (Ya <= ymax))&
     ((zmin <= Za) & (Za <= zmax))).sum()

 for l in range(1):
   Cellcount[l]= S
 filesave(Xc,Yc,Zc,S)
 return()
4

2 に答える 2

5

私は手足に出て行き、あなたが観察している違いはバージョン2.xと3.xの間の変更された分割によるものだと言います。(多くの除算が行われているようで、整数と浮動小数点のどちらのタイプかわかりません)

2.xでは、整数で除算を行うと整数の切り捨てが発生します。これはv3.xでは発生しません

Python 2

In [267]: 5 / 2
Out[267]: 2

Python 3:

In [1]: 5 / 2
Out[1]: 2.5

あなたのコードは多くの除算を行います。

それでも古い整数除算の動作が必要な場合は//、Python3で使用できます。

Python 3:

In [2]: 5 // 2
Out[2]: 2

除算演算子を変更すると、これについて詳しく説明されます。

Python 3.0の新機能は、v2から3への大きな変更を超えています

Python 2.2以降で新しい分割動作が必要な場合は、ディレクティブを使用できますfrom __future__ import division(@Jeffに思い出させてくれてありがとう)。

Python 2:

In [1]: 5 / 2
Out[1]: 2

In [2]: from __future__ import division

In [3]: 5 / 2
Out[3]: 2.5

更新

最後に、除算の潜在的な問題を原因として考えてください(したがって、行が乱れていない可能性がありますが、除算によって結果が異なり、そのようにしか表示されません)。それは可能ですか?また、4番目の列(3.x出力)にはすべてゼロがあります。これは2.x出力には存在せず、結果の計算で発生する可能性のある問題をさらに示しています。したがって、実際には結果は異なり、出力されません。注文の。

于 2012-06-09T23:42:50.053 に答える
2

あなたのfilesave機能は大丈夫です。出力の違いは、Python 2が整数除算式から整数を返すのに対し、Python3はfloatを返すためだと思います。

Python 2

>>> 1/2
0
>>> 4/2
2

Python 3

>>> 1/2
0.5
>>> 4/2
2.0

これにより、プログラムでさまざまな数学的結果が得られ、出力のさまざまな順序が考慮される場合があります。

于 2012-06-09T23:43:38.113 に答える