why is the construct x = (Condition and A or B) used?
这个问题的答案之一是
1 2
| print len(s)>5 and 'y' or 'n'
print(len(s)>5 and 'y' or 'n') #python3 |
如果s > 5的长度,则打印'y',否则打印'n'的长度。请解释这是如何工作的/为什么工作的。谢谢。
我知道这不是推荐的方法,但我想知道它为什么有效。
这是一个老式的黑客。新的方法是:
1
| print 'y' if len(s) > 5 else 'n' |
它起作用的原因是"a和b"将对a进行评估,如果是真的,将对b进行评估。但是如果a是假的,则不需要对b进行评估。同样,"c或d"将对c进行评估,如果是假的,则将继续评估为d。
因此,"A和B或C"与"(A和B)或C"相同。如果a为真,则对b进行计算;如果a为假,则"(a和b)"为假,则对c进行计算。
正如VOO在评论中指出的那样,a的值不必是True或False,而是任何表达式,并且会被python的规则解释为布尔值(0、none和empty containers都是假的,其他都是真的)。
- 哈哈-我的0分答案有一个自己的问题-我解释得晚了!;-)但是很好的修饰;-)
- 为了完整起见,在if... else语法之前的另一个"hack"可能是值得的,它以前是print {False: 'n', True: 'y'}(len(s) > 5)(甚至只是{0:'n',1:'y'})。
- 嗯,没有"完整"的无意义的黑客。那么'ny'[len(s) > 5]呢?滥用语言的方法是无止境的。
- 这里重要的是,如果a和b的值都为真而不仅仅是True,那么A and B的结果就是B。这不一定很明显。
- @VOO:实际上,"A和B"会在A是真正的ISH值时对B进行评估,而不管B的值是多少。请尝试"打印1和0"
- @内德从来没有注意到这一点,但这是有道理的。对我来说,当我得知A and B不一定返回真/假(或当时的1/0),而是返回一个实际值时,这是一件令人惊讶的事情。事实上,这是一个很好的设计IMO(虽然对新来的人来说并不明显),我还是更喜欢foo = expensive_func() or default_val和带有三元if的两行if。
- @VOO:我一直在使用x = maybe_this or that,这是一个很好的结构。这是A and B or C构造,这是一个愚蠢的黑客。