2017-05-05 59 views
0

我將java-script(我是初學者)的代碼轉換爲python(中級)。代碼涉及條件(三元)運算符形式的if語句。將「奇怪」三元運算符從java-script轉換爲python

的代碼行是這樣的:

// if dLon over 180° take shorter rhumb line across the anti-meridian: 
if (Math.abs(Δλ) > Math.PI) Δλ = Δλ>0 ? -(2*Math.PI-Δλ) : (2*Math.PI+Δλ); 

我知道definition of ternary operator這是以下幾點:

條件?表達式1:表達式2

然而,我的代碼作爲一個額外的「條件」,我不知道如何解釋:Δλ = Δλ>0

此刻我的Python版本是這樣的:

import numpy as np 
# note: delta_lon = Δλ 
if np.abs(delta_lon) > np.pi: 
      delta_lon = -(2*np.pi - delta_lon) 
     else: 
      delta_lon = 2*np.pi + delta_lon 

但它似乎給出了錯誤的結果。我想這個問題是由前面提到的「條件」給出的,而且我正在重新定義變量delta_lon

整個代碼可以在此link的部分恆寬線距離下找到。

編輯: 這裏是我試圖從JavaScript轉換的完整代碼:

var Δψ = Math.log(Math.tan(Math.PI/4+φ2/2)/Math.tan(Math.PI/4+φ1/2)); 
var q = Math.abs(Δψ) > 10e-12 ? Δφ/Δψ : Math.cos(φ1); // E-W course becomes ill-conditioned with 0/0 

// if dLon over 180° take shorter rhumb line across the anti-meridian: 
if (Math.abs(Δλ) > Math.PI) Δλ = Δλ>0 ? -(2*Math.PI-Δλ) : (2*Math.PI+Δλ); 

var dist = Math.sqrt(Δφ*Δφ + q*q*Δλ*Δλ) * R; 

我能幾乎全部代碼轉換除外,如果前面提到的聲明。如果我不寫這個語句,我的python代碼會返回與javascript代碼相同的結果(因爲我使用了很好的輸入值,所以可以這麼做)。但是,如果我添加上面介紹的行,我不會得到相同的結果,這表明三元運算符已被錯誤地翻譯。

+0

你的Python代碼實際上對我來說確實很好。你能否詳細說明你的結果是什麼「錯誤」? –

+0

''np.pi'來自哪個庫,你爲什麼不使用'數學庫'? –

+0

在python中,我通常使用numpy作爲np ....因此3.14 = np.pi ....我可以使用數學庫以及它應該沒有那麼重要嗎? –

回答

0

您誤解了代碼的意圖。 Δλ只能在[-pi,pi]之外進行修改,然後根據符號在不同的方向上移動。翻譯javascript代碼給

if np.abs(delta_lon) > np.pi: 
    delta_lon = -(2*np.pi - delta_lon) if delta_lon > 0 else 2*np.pi + delta_lon 

或者你可以做

if delta_lon > np.pi: 
    delta_lon = -(2*np.pi - delta_lon) 
elif delta_lon < -np.pi: 
    delta_lon = 2*np.pi + delta_lon 

具有同樣的效果。