将 "strange" 三元运算符从 java-script 转换为 python
Convert "strange" ternary operator from java-script to python
我正在将代码从 java-script(我是初学者)转换为 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+Δλ);
我知道 definition of ternary operator 如下:
condition ? expr1 : expr2
但是,我的代码是额外的 "condition",我不知道如何解释:Δλ = Δλ>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
但它似乎给出了错误的结果。我想这个问题是由前面提到的 "condition" 和我正在重新定义变量 delta_lon
.
的事实引起的
完整的代码可以在这个 link.
的 rhumb line distance 部分找到
编辑:
这是我尝试从 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 代码 returns 与 java 脚本代码的结果相同(没关系,因为我使用了良好的输入值...)。但是,如果我添加上面显示的行,我不会再得到相同的结果,这表明三元运算符的翻译方式有误。
您误解了代码的意图。仅当 Δλ 在 [-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
效果相同
我正在将代码从 java-script(我是初学者)转换为 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+Δλ);
我知道 definition of ternary operator 如下:
condition ? expr1 : expr2
但是,我的代码是额外的 "condition",我不知道如何解释:Δλ = Δλ>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
但它似乎给出了错误的结果。我想这个问题是由前面提到的 "condition" 和我正在重新定义变量 delta_lon
.
完整的代码可以在这个 link.
的 rhumb line distance 部分找到编辑: 这是我尝试从 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 代码 returns 与 java 脚本代码的结果相同(没关系,因为我使用了良好的输入值...)。但是,如果我添加上面显示的行,我不会再得到相同的结果,这表明三元运算符的翻译方式有误。
您误解了代码的意图。仅当 Δλ 在 [-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
效果相同