为什么Python元组中的空格很重要?

为什么Python元组中的空格很重要?,python,iterable-unpacking,Python,Iterable Unpacking,我得到了一些奇怪的结果,我终于注意到我在元组中放置空格的习惯导致了这个问题。如果你能重现这个问题并告诉我为什么它是这样工作的,你就可以省下我剩下的头发了。谢谢 jcomeau@intrepid:/tmp$ cat haversine.py #!/usr/bin/python def dms_to_float(degrees): d, m, s, compass = degrees d, m, s = int(d), float(m), float(s) float_degrees = d

我得到了一些奇怪的结果,我终于注意到我在元组中放置空格的习惯导致了这个问题。如果你能重现这个问题并告诉我为什么它是这样工作的,你就可以省下我剩下的头发了。谢谢

jcomeau@intrepid:/tmp$ cat haversine.py
#!/usr/bin/python
def dms_to_float(degrees):
 d, m, s, compass = degrees
 d, m, s = int(d), float(m), float(s)
 float_degrees = d + (m / 60) + (s / 3600)
 float_degrees *= [1, -1][compass in ['S', 'W', 'Sw']]
 return float_degrees

jcomeau@intrepid:/tmp$ python
Python 2.6.7 (r267:88850, Jun 13 2011, 22:03:32) 
[GCC 4.6.1 20110608 (prerelease)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from haversine import *
>>> dms_to_float((111, 41, 0, 'SW'))
111.68333333333334
>>> dms_to_float((111,41,0,'Sw'))
-111.68333333333334

对于元组中的空格,答案是错误的。如果没有,答案是正确的。

空格应该没有区别。这种差异是由以下情况造成的:
SW
vs
SW

您不需要在此处检查
SW

compass in ['S', 'W', 'Sw']] 
也许可以改成这样:

compass.upper() in ['S', 'W', 'SW']] 
假设“度”与纬度或经度有关,我无法想象为什么“SW”被视为一个可行的选项。纬度是N或S。经度是E或W。请解释

根据大小为1的示例,用户输入不可信。考虑检查输入,或者至少确保伪输入会引发异常。你似乎喜欢一句台词;试试这个:

float_degrees *= {'n': 1, 's': -1, 'e': 1, 'w': -1}[compass.strip().lower()]

呜呜!让我检查一下,我不敢相信这就是全部(啊……你说得对,我一定看得太久了。我最好改变我的终端字体!我可以在11分钟内接受你的答案。谢谢!我(个人)认为三元运算符
1 if compass.lower()在('s','w','sw'))else-1比用布尔值为数组编制索引要清晰得多。哇,我从来都不知道这种语法!谢谢……旧习惯很难改变:^没有用户输入,只有程序员输入。使用“SW”虽然草率,但符合我的目的。谢谢这不是“程序员”行为。鸭子输入表示“用户”。