一、条件判断的意义
1、在编程中,通过设立边界值来判断某种情况发生或不发生。预测程序可能发生的不同情况,针对每种情况制定对应的解决方案。
2、为什么会有这么多需要判断的情况?主要来自于两方面的原因,一方面是程序主要是用来和用户进行交互的,而来自于用户的指令是不确定的,所以我们需要预先制定规则,去预测用户的输入会带来什么情况的发生,并且处理各种情况;另一方面来自于设备中的经过计算而生产的信息是不确定的,比如文件长度问题,可以设定一个边界:文件大小不能超过10M,如果超过就进行禁止上传这样的处理。
二、条件分支阅读规则
c = 1
if c > 1:
print('Test 1')
elif c == 2:
print('Test 2')
else:
print('Opps')
print('This is the end')
1、逐行检查从上到下
2、一旦符合立即执行
3、执行完成就会跳出
三、如何描述情况发生的边界条件?
1、只要是能够产生布尔值的,就可以放在if后面,作为边界条件。当布尔值为True时,就会执行这个条件对应的措施。能产生布尔值(True 或 False)的都叫做布尔表达式。
if condition:
do something
else:
do something
2、场景1:值比较
值比较是常见的边界设置方法,设置的方法是比较一个数值,从而判断边界条件的设置,比如用户可以发言的标准可以转换成注册时间的长度、是否是对网站作出有害的请求可以转换成请求频率。
if user agent == 'IE'
show('Please use Chrome')
elif user_agent == 'FireFox Quantum'
show('You are welcome')
值比较还有一种比较特殊情况就是测等值,写作“==”,等值需要严格意义上的一模一样,才会返回 True 。等值不仅可以用来比较数字,更多时候还可以用来比较文字。
if len(user_register_time) < 2:
warn('Shut up!')
elif len(user_request_time) > 100:
warn('Take a break huh?')
比较运算符汇总
3、场景2:看结果
我们只需要根据函数或者是方法的运算结果来作为条件的衡量标准就可以——因为这种函数或方法通常只返回布尔类型的数据(True or False)。
一般来讲,这种方式使用的函数或方法会整合了一系列复杂的操作和判断,但是对于我们使用起来会很方便——条件判断的边界情况是否发生了,全部由这个函数或方法说了算,我们需要做的只是用它返回的结果的布尔值就可以了。这里还有一个识别这种函数或方法的小窍门:如果一个函数或方法是以 is/has 开头,那么它多半就会返回布尔值。
if Windows.is_open():
show('Hello')
if key.is_pressed():
start_game()
.startswitch() 测定字符串的开头
.endswitch() 测定字符串的结尾
.is_integer 测定对象是否是整数类型
.is_upper 测定字符串是否是大写开头
4、场景3:猜有无
所谓猜有无就是判断某个元素是否存在,从而判断边界条件是否成立。相对简单的一种猜有无,我们使用关键字 in 和 not in 来进行实现, in 用来测试某个元素是否存在于容器中。比如判断用户是否在特殊的组别中;检测用户输入是否有非法字符等等。
另外一种依赖于 Python 中带有「否定意义」的特殊数据。比如,如果用户什么都没有输入会得到一个空的字符串 ' ' ;或者有的函数没有运算出任何数值 trap = print('Trap') ,它的返回结果就会是 None,这种时候的话都会被视作「不存在」或者「无」;这样的时候,我们还有一个简单的方法可以验证单一数值的真伪值,就是使用 bool() 函数。
值得注意的是,如果将否定意义的变量作为布尔表达式实际上是一个「否定意义」的描述方式,一般来讲会加上 not 提高可读性。
username = 'Smith?'
if '?' in username:
message('? is not allowed')
user_save = []
if not user_save:
message('Add some posts to your board')
# 等价于下面的写法
if user_save:
pass
else:
message('Add some posts to your board')
5、常见套路
(1)if do 和 if else do
实际上这个问题可以归结为【条件判断中必须有 else 吗?】,答案是——当然不。因为是否有 else 取决于实际问题本身——前者在于只拦截特定的情况,而后者是对情况内情况外均作处理。针对稍微复杂的情况, else 一定程度上避免了由于没有认清所有可能性带来的副作用。
print(‘Enter your name’)
username = input()
if len(username) < 8
print('can not less than 8')
print(‘Enter your name’)
username = input()
if len(username) < 8
print('can not less than 8')
else:
print(username + 'is available')
(2)and or 和 if if ...else
还有一种较为复杂的条件设置方式,将多条件进行逻辑运算。我们可以使用 and 和 or 来连接两个或以上的条件,and 表示并且,多种条件边界同时出现才算是情况发生。or 表示或者,列举出来的边界有一个成立就算是情况发生。
print('Enter your name')
username = input()
database = ['LIsa','John']
black_list = ['Tom','Jerry']
username_is_ok = username not in database
if username_is_ok:
print('Welcome Back' + username)
这个其实和多条件分支有一些相似之处:前者必须一次成型,不符合都没有机会进行,一旦不符合就会被拒之门外;而后者在于逐次条件过滤,在每一次条件筛选的时候还能进行对应的处理。
print('Enter your name')
username = input()
database = ['LIsa','John']
black_list = ['Tom','Jerry']
if username not in database:
print('This name is avaliable')
if username not in black_list:
print('Welcome Back ' + username)
(3)if/elif 和 if/if
elif 和 if 的区别在于,使用 elif 时满足了一个条件之后,后面的条件就不会再读了。但是如果用 if if 去写条件分支的话就完全不同,即使符合了还要往下挨着个去对比,如果对比成功还是要执行的。
user_list = [
'Patti Smith',
'Iggy Pop',
'joey Ramone?',
'debbie Harry'
]
for user in user_list:
if not user.istitle():
print(user + '- Letter problem')
if '?' in user:
print(user + '- Ends with ?')
这两个没有哪个好哪个坏,而是有着完全不同的使用目的。示例代码中的第三个元素有两个错误,一个是开头小写,另一个是结尾带问号,我想要把所有错误都筛选出来,这时候就应该使用if if去筛干净。
user_list = [
'Patti Smith',
'Iggy Pop',
'joey Ramone?',
'debbie Harry'
]
for user in user_list:
if not user.istitle():
print(user + '- Letter problem')
elif '?' in user:
print(user + '- Ends with ?')
四、总结