专业人士笔记”系列目录:
创帆云:Python成为专业人士笔记--强烈建议收藏!每日持续更新!
包含if、elif和else等关键字的条件表达式为Python程序提供了根据布尔条件(True或False)执行不同操作的能力,本节介绍Python条件语句、布尔逻辑和三元语句的使用
条件表达式(或“三元运算符”)
三元运算符用于内联条件表达式,它一般用于简单、简明、易读的操作
1、 参数的顺序不同于许多其他语言(如C、Ruby、Java等),当不熟悉Python的“令人吃惊的”行为的人使用它时,可能会导致bug(他们可能颠倒顺序)。
2、有些人认为它“笨拙”,因为它与正常的思维流相反(首先考虑条件,然后考虑结果)。
n = 5
print("大于2" if n > 2 else "小于等于2")
#输出: '大于2'
这个表达式的结果与它在英语中的读法一样——如果条件表达式为真,那么它将对左边的表达式求值,否则将对右边的表达式求值;三元操作也可以嵌套,如下所示:
n = 5
print("你好" if n > 10 else "再见" if n > 5 else "今天天气不错")
#输出:今天天气不错
它们还提供了在lambda匿名函数中包含条件的方法。
if, elif, 和 else
在Python中,您可以为第一个条件使用if,为其余的条件使用elif,直到最后一个(可选的)else,这个else是当上面其它所有条件都匹配不上时,所执行的语句
number = 5
if number > 2:
print("数字比2要大")
elif number < 2: # (您可以有很多个elif)
print("数字比2要小")
else: # 可选子句,但整个流程只能有一个else
print("数字等于2")
#输出:数字比2要大
注意:使用else if而不是elif将触发语法错误,这在python中是不允许的。
True 真值
下列值被认为是假的,它们在应用于布尔运算符时将会直接作为假值
None
False
0, 或任何等于零的数值,例如 0L, 0.0, 0j
空序列 : ''
,
""
, (), []
空字典: {}
用户定义的类型,如bool或len方法返回0或False
除了上面的值,Python中所有其他值的值都是True
布尔逻辑表达式
除了对True或False求值外,布尔逻辑表达式还返回被解释为True或False的值。这是python式的逻辑表示方法,否则可能需要显式使用if-else语句
And 操作
And运算符计算所有表达式,如果所有表达式的值都为True,则返回最后一个表达式。否则,它将返回第一个表达式的值
1 and 2
#输出:2 如上面所说
1 and 0
#输出:0 如上面所说
1 and "Hello World"
#输出:"Hello World"
"" and "Pancakes"
"" # 上面说过,""为False值,则返回第一个表达式
Or 操作
or运算符从左到右计算表达式的值,如果第一个表达式为True则直接返回第一个,否则返回第二个表达式
1 or 2
#输出:1 第一个表达式就代表True了
None or 1
#输出:1 第二个为True,返回第二个
0 or []
#输出:[],返回第二个,因为两个值都代表False
惰性计算
当使用此方法时,请记住计算是惰性的;不需要对表达式求值来确定结果的表达式将不会被求值,例如 :
def print_me():
print('I am here!')
0 and print_me()
#输出:0
在上面的示例中,print me函数从未执行过,因为Python可以在遇到0 (False)时确定整个表达式为False。如果print me必须要执行以服务于你的程序逻辑,请记住这一点
多条件下判断的测试
检查多个条件时的一个常见错误是不正确地应用逻辑
本例尝试检查两个变量是否都大于2,该语句为 if (a)and (b > 2),这会产生一个意外的结果,因为当a不为0时,bool(a)的值为True
a = 1
b = 6
if a and b > 2:
print('yes')
else:
print('no')
#输出:yes
#这里不是我们想要的结果,我们需要的是 如果 a 和 b都大于2,则输出yes
在这种情况下, 每个变量需要分别进行比较:
if a > 2 and b > 2:
print('yes')
else:
print('no')
#输出:no 这才是我们想要的结果
另一个类似的错误是在检查一个变量是否是多个值之一时出错,本例中的语句为 if (a == 3) or (4) or (6);这将产生一个意外的结果,因为bool(4)和bool(6)的值都为True
a = 1
if a == 3 or 4 or 6:
print('yes')
else:
print('no')
#输出:yes 这不符合我们想要的,因为4在python里被认为True,所以判断通过了
这种情况下,同样每个比较必须单独进行 :
if a == 3 or a == 4 or a == 6:
print('yes')
else:
print('no')
#输出:no 这才符合我们想要的
其实, 使用in操作符是一种更规范的写法:
if a in (3, 4, 6):
print('yes')
else:
print('no')
#输出:no
使用cmp函数比较两个对象
Python 2版本中包含一个cmp函数(注意:python3中此函数已删除),它允许您确定一个对象是否小于、等于或大于另一个对象
假设需要输出 ‘比y大’ if x > y, ‘比y小’ if x < y, ‘相等’ if x == y :
[' 相等 ', ' 比y大 ', ' 比y小', ][cmp(x,y)]
#x,y = 1,1 输出: '相等'
#x,y = 1,2 输出: '比y小'
#x,y = 2,1 输出: '比y大'
cmp(x,y)将会返回以下值:
比较结果
x < y -1
x == y 0
x > y 1
这个函数在python3中被删除了。您可以使用位于python3中的functools中的cmp to key(func)帮助函数来将旧的比较函数转换为关键函数
在大多数情况下,在python3中直接使用>,<,或==就可以直接用于比较
Else 语句
if condition:
body
else:
body
else语句只有在之前所有条件语句的值都为False时才会执行它里面的代码
if True:
print "这是真的!"
else:
print "这不是真的!"
# 输出: 这是真的!,里面的else语句永远不会执行
if False:
print "这不是真的!"
else:
print "我是else"
#输出: 我是else 同理,上面的False不会执行,所以会执行else里的语句
判断对象是否为空
我们经常需要判断对象是否为空并进行下一步操作,最简单的方法就是用 is None 判断:
if aDate is None:
aDate=datetime.date.today()
(注意,用is None代替== None更符合python风格)
但是这可以通过利用在布尔表达式中not None的值为True这一概念来稍微优化一下,下面的代码是等效的 :
if not aDate:
aDate=datetime.date.today()
但还有一种更靠近python的方法。下面的代码也是等价的,但个人觉得不好理解 :
aDate=aDate or datetime.date.today()
这里做了一个简单的表达式判断。即如果aDate已经被初始化,并且不是None,那么它将被分配给自己,没有任何效果。如果没有,则将date. date.today()分配给aDate
if 语句
if condition:
body
if语句检查condition条件,如果计算结果为True,则执行If语句的主体。如果计算结果为False,并且后面没有else语句或if false承接的话,则什么也不做
if True:
print "是True!"
#输出 是True!
if False:
print "不是True"
#如果整个流程结果是False,则会输出
if后面的条件语句,可以是任何有效的表达式 :
if 2 + 2 == 4:
print "我知道什么是数学!"
#输出: 我知道什么是数学!
好了,今天的分享就到这里,禁止转载,违者必究!