Javascript 转换;“奇怪”;从java脚本到python的三元运算符

Javascript 转换;“奇怪”;从java脚本到python的三元运算符,javascript,python,if-statement,ternary-operator,Javascript,Python,If Statement,Ternary Operator,我正在将一段代码从java脚本(我是初学者)转换为python(中级)。该代码涉及条件(三元)运算符形式的if语句 代码行如下所示: // if dLon over 180° take shorter rhumb line across the anti-meridian: if (Math.abs(Δλ) > Math.PI) Δλ = Δλ>0 ? -(2*Math.PI-Δλ) : (2*Math.PI+Δλ); 我知道,这是以下几点: 状况?expr1:expr2 然而,我

我正在将一段代码从java脚本(我是初学者)转换为python(中级)。该代码涉及条件(三元)运算符形式的if语句

代码行如下所示:

// if dLon over 180° take shorter rhumb line across the anti-meridian:
if (Math.abs(Δλ) > Math.PI) Δλ = Δλ>0 ? -(2*Math.PI-Δλ) : (2*Math.PI+Δλ);
我知道,这是以下几点:

状况?expr1:expr2

然而,我的代码是一个额外的“条件”,我不知道如何解释:
Δλ=Δλ>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
给出的

整个代码可以在本节中的“等角线距离”下找到

编辑: 下面是我试图从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;

除了前面提到的if语句外,我几乎可以转换整个代码。如果我不编写该语句,我的python代码将返回与javascript代码相同的结果(这是可以的,因为我使用了良好的输入值…)。但是,如果我添加上面介绍的行,我将不再得到相同的结果,这表明三元运算符的翻译方式错误。

您误解了代码的意图。Δλ仅当在[-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
如果delta_lon>np.pi:
delta_-lon=-(2*np.pi-delta_-lon)
elif delta_lon<-np.pi:
delta_-lon=2*np.pi+delta_-lon

这也有同样的效果。

事实上,我觉得你的Python代码看起来还不错。你能详细说明你的结果有什么“错误”吗?
np.pi来自哪个库,为什么不使用
math
库?在python中,我通常使用numpy作为np。。。。因此,3.14=np.pi。。。。我也可以使用math-lib,但这不重要,对吧?我这么问是因为JS和您的Python库使用的
PI
的精度可能有差异。你的电话号码是多少?它们至少与JS编号有很好的相关性吗?如果我不使用我提出的if语句,结果几乎相同(9804.88324 vs 9804.88323)。。。如果我加上if语句,我的结果错误了数千个单位(9804.88324对42456.624004)。。。我不认为pi是错误,但更多的是我对if语句的实现。。。通过写它,我也会得到同样的结果