2017-05-05 104 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 

具有同样的效果。