Python中print()[]的含义是什么?

3
在浏览codegolf时,我发现了这个页面:
g=input();print("Approved","Summer School","Failed")[(g<7)+(g<3)]

我不理解print()后面的[]是什么意思...能否做出解释?

想一下 print, ("Approved","Summer School","Failed")[(g<7)+(g<3)],分别理解它们,你就会明白了。这是元组和索引的运用。 - falsetru
说实话,谁想出 (...)[(g<7)+(g<3)] 这个写法是个疯子! - David Heffernan
@DavidHeffernan 这是代码高尔夫比赛;“疯狂”就是游戏的名字! - arshajii
1
@arshajii 啊,代码高尔夫,那么它需要进一步混淆,这个太容易解码了!! - David Heffernan
值得注意的是,对于未来的开发者而言,这段代码在 Python 3 中将无法工作,因为 print 函数已经改变为使用标准函数语法。 - Silas Ray
@sr2222 嗯,已经完成...... - David Heffernan
3个回答

6
>>> print("Approved","Summer School","Failed")[0]
Approved
>>> print("Approved","Summer School","Failed")[1]
Summer School
>>> print("Approved","Summer School","Failed")[2]
Failed

看到规律了吗?这只是简单的索引。
顺便说一下,我们总是知道 (g<7)+(g<3) 将会是 >= 0 (False + False) 并且 <= 2 (True + True)。
回想一下,boolint 的一个子类,而且 True == 1 以及 False == 0(这就是为什么我们可以像上面那样添加 bool)。
最后,不用说,这种混淆本可以通过额外加一组括号轻松避免:
print(("Approved","Summer School","Failed")[(g<7)+(g<3)])

1
你可能需要明确指出TrueFalse是布尔值,而在Python中boolint的子类,因此True等于1,False等于0... - Martijn Pieters

2
只是元组索引。与这个没有区别:
x = (1, 2, 3)[1]

这段代码将 x 赋值为 2

在您的更复杂的变体中,一个元组的元素被选择并传递给 print

混淆在于这段代码看起来像是调用名为 print 的函数。在 Python 3 中通过将 print 转换为函数来消除了这种混淆。在 Python 3 中,您提出的代码执行完全不同的操作。


1
在Python 3中完全不同的操作:是的,会因为TypeError: 'NoneType' object is not subscriptable而彻底失败。 - Martijn Pieters
@MartijnPieters 请不要告诉我你必须执行它才能知道会发生什么...... 我期望忍者有更高的水平......;-) - David Heffernan
2
不,情况比那更糟。我能背出所有的异常……或者我只是在打开 Python 提示符后输入了 None[0] 来提醒自己。print() 返回 None 是常识,不是吗? - Martijn Pieters
无论是常识还是有根据的猜测,最终结果都是一样的。 - Silas Ray

0

print(x,y,...)[i] 应该被解析为 print (x,y)[i]。它只是后面跟着一个 tuple 的打印。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接