c代码:
int x = a>b?6,6;
这种语句Python中也有:
可以通过and or组合来实现。个人认为这种语句尽量少点好。
python把这类型的功能发扬光了大。但是由于这种组合比较绕,所以有时候比较纠结:
比如:
5 or 6 and 6 返回what?
0 or 5 返回what?
8 and 7 返回what?
于是整理了下:
1.pyhon 中用 0 ,‘’,[],(),{},None 来表示False,其它都是True.这个是基础
2.复习下C中短路的原理:
在c中的if语句后面的条件语句 :以下用 A B C 分别表示 条件语句
形如: if(A||B||C)在C语言中会怎么处理呢?
因为存在短路 所以如果A为真,那么C语言根本就不会去test B和C的真假,整个表达式就是真。
形如: if(A&&B&&C)同理:
因为存在短路 所以如果A为假,那么C语言根本就不会去test B和C的真假,整个表达式就是假。
可以这样理解and最怕假。因为只要一个假,就全假了,or最怕真因为只要有一个真就全真了,
还有很重要一点这里的所有的运算顺序都是从左到右的。
3.Python中也类似:
所有的运算都是从左到右:
形如A and B and C,Python会从A->C逐个test,将第一个假返回,如果没有一个是假,那返回最后一个,
因为最后一个的真符合整个表达式的逻辑.
形如 A or B or C,Ptthon 从左到右,将第一个真返回。如果到了最后还没发现真 那就将最后一个C返回,
因为最后一个的假符合真个表达式的逻辑.
4. and 和 or的组合?
因为and 和or 运算优先级相同,所以以下俩式是等价的:
A or B and C == (A or B) and C
挨个运算就可以了。。。。
5.中间有括号咋办?
括号以此类推即可。
总结完毕 呵呵
给个例子:
中的:
def info(object, spacing=10, collapse=1):
"""Print methods and doc strings.
Takes module, class, list, dictionary, or string."""
methodList = [method for method in dir(object) if callable(getattr(object, method))]
processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s)
print "/n".join(["%s %s" %
(method.ljust(spacing),
processFunc(str(getattr(object, method).__doc__)))
for method in methodList])
if __name__ == "__main__":
print info.__doc__
注意标颜色的code
processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s) 中 (lambda s: " ".join(s.split())) 和(lambda s: s) 都是真,不明的参看1.这样唯一不确定的就是 collapse :如果collapse 为真,这样就有 A(真) and B(真) or C(真), 先计算 A and B,由于都是真直接返回 B。于是源表达式等价于 B or C, B C都是真,于是返回了B如果collapse 为假,这样就有 A(假) and B(真) or C(真), 先计算 A and B,返回 A。于是源表达式等价于 A or C, 于是返回了C于是我们学到 可以用变量的真假 来改变函数的行为。 usefully definitely!!!!!!!!实现c中的?a ?b,c 在大部分情况下等价于 a and b or c;但是有特例:>>> a = "" >>> b = "second" >>> 1 and a or b 'second'这里返回的是b
改进方法是
>>> a = "" >>> b = "second" >>> (1 and [a] or [b])[0] ''Quote from dive into python