ThinkSSL🔒 一键申购 5分钟快速签发 30天无理由退款 购买更放心 广告
## 条件判断 计算机之所以能做很多自动化的任务,因为它可以自己做条件判断。 比如,输入用户年龄,根据年龄打印不同的内容,在Python程序中,用`if`语句实现: ~~~ age = 20 if age >= 18: print('your age is', age) print('adult') ~~~ 根据Python的缩进规则,如果`if`语句判断是`True`,就把缩进的两行print语句执行了,否则,什么也不做。 也可以给`if`添加一个`else`语句,意思是,如果`if`判断是`False`,不要执行`if`的内容,去把`else`执行了: ~~~ age = 3 if age >= 18: print('your age is', age) print('adult') else: print('your age is', age) print('teenager') ~~~ 注意不要少写了冒号`:`。 当然上面的判断是很粗略的,完全可以用`elif`做更细致的判断: ~~~ age = 3 if age >= 18: print('adult') elif age >= 6: print('teenager') else: print('kid') ~~~ `elif`是`else if`的缩写,完全可以有多个`elif`,所以`if`语句的完整形式就是: ~~~ if <条件判断1>: <执行1> elif <条件判断2>: <执行2> elif <条件判断3>: <执行3> else: <执行4> ~~~ `if`语句执行有个特点,它是从上往下判断,如果在某个判断上是`True`,把该判断对应的语句执行后,就忽略掉剩下的`elif`和`else`,所以,请测试并解释为什么下面的程序打印的是`teenager`: ~~~ age = 20 if age >= 6: print('teenager') elif age >= 18: print('adult') else: print('kid') ~~~ `if`判断条件还可以简写,比如写: ~~~ if x: print('True') ~~~ 只要`x`是非零数值、非空字符串、非空list等,就判断为`True`,否则为`False`。 ## 再议 input 最后看一个有问题的条件判断。很多同学会用`input()`读取用户的输入,这样可以自己输入,程序运行得更有意思: ~~~ birth = input('birth: ') if birth < 2000: print('00前') else: print('00后') ~~~ 输入`1982`,结果报错: ~~~ Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unorderable types: str() > int() ~~~ 这是因为`input()`返回的数据类型是`str`,`str`不能直接和整数比较,必须先把`str`转换成整数。Python提供了`int()`函数来完成这件事情: ~~~ s = input('birth: ') birth = int(s) if birth < 2000: print('00前') else: print('00后') ~~~ 再次运行,就可以得到正确地结果。但是,如果输入`abc`呢?又会得到一个错误信息: ~~~ Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: invalid literal for int() with base 10: 'abc' ~~~ 原来`int()`函数发现一个字符串并不是合法的数字时就会报错,程序就退出了。 如何检查并捕获程序运行期的错误呢?后面的错误和调试会讲到。 ## 练习 小明身高1.75,体重80.5kg。请根据BMI公式(体重除以身高的平方)帮小明计算他的BMI指数,并根据BMI指数: * 低于18.5:过轻 * 18.5-25:正常 * 25-28:过重 * 28-32:肥胖 * 高于32:严重肥胖 用`if-elif`判断并打印结果: ~~~ # -*- coding: utf-8 -*- height = 1.75 weight = 80.5 bmi = ??? if ???: pass ~~~ ## 小结 条件判断可以让计算机自己做选择,Python的`if...elif...else`很灵活。 ![2015-06-24/558a277dd891d](https://box.kancloud.cn/2015-06-24_558a277dd891d.png) ## 参考源码 [do_if.py](https://github.com/michaelliao/learn-python3/blob/master/samples/basic/do_if.py)