Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 这个比较意味着什么?_Python - Fatal编程技术网

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项
  • 如果有2个以上的项目,则返回
    [sys.argv[2]]
  • 否则,返回
    ['test\u out.jpg']
  • 从上一个返回的项目(始终是列表)中,返回项目0
  • 更简单的版本是:

    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
    。。。