(1 and [a] or [b])[0]

(1 and [a] or [b])[0]

>>> a = ""
>>> b = "second"
>>> (1 and [a] or [b])[0]



这里的 (1 and [a] or )[0]应该怎么理解,[0]加在末尾是什么意思?



QUOTE:
原帖由 rubee 于 2007-8-31 10:56 发表
>>> a = ""
>>> b = "second"
>>> (1 and [a] or )[0]


这里的 (1 and [a] or )[0]应该怎么理解,[0]加在末尾是什么意思?

相等于c:
if ( 1 ) {
    return a;
} else {
    return b;
}


可以看看 dive into python 里面专门有这个。


[0]加在末尾表示:
取[a] 中的第一个元素,即a
因为 1 and [a] 始终返回 [a]。
非常感谢!!
()不需要的吧,看起来反倒怪怪的。。
我觉得有了()可读性要强一些吧,当然我的个人意见了。
置顶的二本书里有这个例子的说明。。。

代替 isTure ? yes : no 这样子的东西。。。

二个东西 and ...  如果都为真,取后一个。所以要把a 变成[a]
终于理解

a and b

当a为空 则结果等于a 否则结果等于b

a or b
当a为空 则结果等于b 否则结果等于a

于是
a and [ b ] or c
[ b ]恒不为空
因此 当 a为空 上式等于 a or c 等于 c
当a不为空 上式等于 [ b ] or c 等于[ b ]

0,False,None, '',[],{},()等都为空


另外一个角度理解
a and b 如果结果是True,那么返回b
如果结果是False, 并且两个操作数中只有一个空,那么就返回这个操作数
如果结果是False,并且两个错作数都是空,那么返回第一个操作数

a or b 如果结果是True 并且两个操作数都不是空,那么返回第一个操作数
如果结果是True,两个操作数只有一个不是空,那么返回这个操作数
如果结果是False,那么返回第二个操作数

从堆栈的角度看, 其实返回值就是当表达式的值可以确定的时候,栈顶的那个对象

我是绝对不会去用这样方法写程序的。