Python 这个比较意味着什么?
我刚刚读了脚本中的以下行:Python 这个比较意味着什么?,python,Python,我刚刚读了脚本中的以下行: fn = (len(sys.argv) > 2 and [sys.argv[2]] or ['test_out.jpg'])[0] 我真的不明白这里发生了什么。所以这里比较了2和or语句的参数数量。作者对此做了什么?这是一种好的编码风格吗 fn = (len(sys.argv) > 2 and [sys.argv[2]] or ['test_out.jpg'])[0] 就像: fn = ([sys.argv[2]] if len(sys.argv) &
fn = (len(sys.argv) > 2 and [sys.argv[2]] or ['test_out.jpg'])[0]
我真的不明白这里发生了什么。所以这里比较了2和or语句的参数数量。作者对此做了什么?这是一种好的编码风格吗
fn = (len(sys.argv) > 2 and [sys.argv[2]] or ['test_out.jpg'])[0]
就像:
fn = ([sys.argv[2]] if len(sys.argv) > 2 else ['test_out.jpg'])[0]
简单地说:
if len(sys.argv) > 2:
fn = [sys.argv[2]][0]
else:
fn = ['test_out.jpg'][0]
如您所见,[…][0]
有些多余。因此,原始声明可替换为以下内容:
fn = len(sys.argv) > 2 and sys.argv[2] or 'test_out.jpg'
如果sys.argv[2]
为空字符串,则上述代码将不起作用。这就是原始代码使用[…][0]
表单的原因。因此,如果可能,请使用以下表格:
fn = sys.argv[2] if len(sys.argv) > 2 else 'test_out.jpg'
就我个人而言,我觉得这是一种糟糕的编码风格,因为发生的事情并不那么明显(因此,你的问题) 它正在做什么:
sys.argv
是否有超过2项[sys.argv[2]]
['test\u out.jpg']
fn = sys.argv[2:] and sys.argv[2] or 'test_out.jpg'
更具可读性的版本:
fn = sys.argv[2] if sys.argv[2:] else 'test_out.jpg'
python中的
和
和或
在某些情况下起着短路的作用
在表达式x和y
中,如果x的计算结果为False
,则甚至不需要查看y,因为结果将为False。比如说,您希望获取sys.argv[2],但只有在有足够参数的情况下。然后你可以做:
len(sys.argv)>2和[sys.argv[2]]
因此,如果sys.argv
的长度小于等于2,则len(sys.argv)>2
将计算为false,而不会计算sys.argv[2]
(因此不会遇到索引器
)
类似地,在表达式x或y
中,只有当x
的计算结果为False
时,才会计算y
。因此,如果参数数量小于或等于2,则fn
将取值['test\u out.jpg']
最后,括号用于使用表达式中的最终[0]
获取第0个索引
总而言之:如果参数的数量是2个或更多,那么将
fn
分配给sys.argv[2]
,否则将fn
分配给'test.out.jpg'
可能是引入PEP308之前的2.5时代之前的残余。感谢您的快速回复。我不是以英语为母语的人,所以在文档中很难找到这段短代码。它是如何命名的?@JasonTS它类似于一个字符串,[…][0]
可能是用来处理sys.argv[2]
是正确的空字符串的情况(这似乎毫无意义)。谢谢-我不知道sys.argv[2:
在功能上等同于len(sys.argv)>2
。。。