学习目标
- 使用比较运算符编写布尔表达式。
- 使用random.randint(a,b)或者random.random()函数来生成随机数。
- 编写布尔表达式(AdditionQuiz)。
- 使用单向if语句实现选择控制。
- 使用单向if语句编程。
- 使用双向if-else语句实现选择控制。
- 使用嵌套if和多向if-elif-else语句实现选择控制。
- 避免if语句里的常见错误。
- 使用选择语句编程。
- 使用逻辑运算符(and、or和not)组合各种条件。
- 使用带组合条件的选择语句(LeapYear、Lottery)。
- 编写使用条件表达式的表达式。
- 了解控制运算符优先权和结合性的规则。
- 检测出一个对象的位置。
一、引言
关键点:程序可以根据某个条件决定执行哪条语句。
如果在计算圆的面积程序清单中输入一个负的radius值,程序将产生一个无效结果。如果这个半径是负的,程序将无法计算这个区域。你怎么解决这种情况呢?
就像所有的高级程序设计语言一样,Python提供选择语句让你可以在两个或多个不同条件下选择不同的动作。你可以使用下面的选择语句来替换程序清单中的代码:
if radius < 0:
print("Incorrect input")
else:
area = radius * radius * math.pi
print("Area is", area)
选择语句使用的条件称为布尔表达式。本章将介绍布尔类型、数值、比较运算符以及表达式。
二、布尔类型、 数值和表达式
关键点:布尔表达式是能计算出一个布尔值True或False的表达式。
怎么比较两个数值呢?例如,半径是大于0、等于0还是小于0? Python 提供了六种比较运算符(也称为关系运算符),如表4-1所示,那么哪个用来比较两个数值呢? (表中假设使用的半径是5)。
警告:比较运算符的相等是两个等号(==),而不是单个等号(=),后者是用来赋值的。
比较的结果就是一个布尔逻辑值: True 或False。例如:下面的语句显示结果为True。
radius = 1
print(radius > 0)
存储布尔值的变量被称为布尔变量。布尔数据类型被用来代表布尔值,一个布尔变量可以代表True或False值中的一个。例如:下面的语句将True赋值给变量lightson。
lightsOn = True
True和False都是字面量,就像数字10是字面量一样。它们都是保留字,不能在程序中被当作标识符。
在计算机内部,Python使用1来表示True而使用0来表示False。你可以使用int数将布尔值转换为一个整数。
例如:
print(int(True)) #显示1
print(int(False)) #显示0
你也可以用bool函数将一个数字值转换成一个布尔值。如果值为0,这个函数返回False;否则,这个函数总是返回True。
例如:
print(bool(0)) #显示False
print(boo1(4)) #显示True。
三、产生随机数
关键点:函数randint (a, b)可以用来产生一个a和b之间且包括a和b的随机整数。
设想你要开发一个帮助一年级学生练习加法的程序。这个程序会随机产生两个一位整数: number1和number2,然后显示给学生一个问题: What is 1+7( 1+7=? ),如下面程序清单所示。在学生输入答案后,程序会显示一条消息表明答案是对还是错。
你可以使用函数random模块中的randint (a,b)函数产生一个随机数字。这个函数返回一个在a和b之间包括a和b的随机整数i。使用randint(0,9)获取一个在0到9之间的随机整数。
这个程序会按照如下步骤工作。
- 第1步:产生两个一位整数number1 (例如,4)和number2 (例如,5 )。
- 第2步:提示学生回答What is 4+5。
- 第3步:检测学生的答案是否正确。
import random
number1 = random.randint(0,9)
number2 = random.randint(0,9)
answer = eval(input("What is " + str(number1) +"+"+ str(number2) + "? "))
print (number1, "+" , number2, "=" , answer , "is", number1 + number2 == answer)
程序使用random模块中定义的randint函数。import 语句会导人这个模块(第1行)。
也可以使用random( )函数生成一个满足条件0<=r<=1.0的随机浮点数r。
注意:调用random. random( ) 返回一个0.0到1.0之间(不包括1.0)的随机浮点数。调用函数random.randint(0,1)返回0或1。调用random.randrange(0,1) 总是返回0。
四、if 语句
关键点:如果条件正确就执行一个单向if语句。
前面的程序显示一条像“6+2=7 is false”这样的信息。如果你想将信息改成“6+2=7 is incorrect”,你必须使用选择语句来做这种微小改变。
Python有多种选择语句类型:单向if语句、双向if-else语句、嵌套if语句,多向if-elif-else语句以及条件表达式。这节介绍单向if语句。
当且仅当条件为true时,一条单向if语句执行一个动作。单向if语句的语法如下:
if boolean-expression:
statement(s) # Note that the statement(s) must be indented
这里statement(s)必须相对于if向右至少缩进一个空白,而每条语句也必须使用同样个数的缩进。为了保持一致性。
如果布尔表达式计算的结果为真,那么就会执行if块中的语句。if块里的语句都要在if语句之后缩进。例如:
if radius >= 0:
area = radius * radius * math. pi
print("The area for the circle of radius", radius, "is",area)
在if块中的语句必须在if行后的一.行进行缩进,而且要以相同的空白缩进(即上述代码的第2行和第3行缩进要相同)。
五、双向 if-else 语句
关键点:双向if-else语句根据条件是真还是假来决定执行哪些语句。
如果指定条件是True,那么一条单向if语句会完成一个动作。如果条件是False,那它什么都不做。但是当条件为False时,你想要完成一个或多个动作时应该怎么办?你可以使用一个双向if-else语句。双向if-else语句根据条件是True还是False指定不同的动作。
下面是一个双向if-else 语句的句法:
if boolean-expression:
statement(s)-for-the-true-case
else:
statement(s)-for-the-false-case
六、嵌套 if和多向if-elif-else语句
关键点:将一个if语句放在另一个if语句中就形成了一个嵌套if语句。
if或if-else语句中的语句可以是任意一个合法的Python语句,甚至可以包括另一个if或if-else语句。内部if语句被称为嵌套在外部if语句中。内部if语句也可以包含另一个if语句;事实上,嵌套的深度是没有限制的。例如,下面的语句是一个嵌套if语句:
if i>k:
if j>k:
print("i and j are greater than k" )
else:
print("i is less than or equal to k")
if j>k语句是嵌套在if i>k语句中的。
七、选择语句中常见的错误
关键点:选择语句中的大多数常见错误都是由不正确的缩进问题导致的。
仔细思考a和b中的代码。
在a中,print语句不在if语块内。要将它放进if块中,你必须像b中那样将print语句缩进,如图b所示。
考虑下面a和b中代码的另一个例子。a中的代码有两个if子句和一个else子句。哪个if子句是匹配这个else子句的?缩进表明a中else子句匹配第一个if子句而b中else子句匹配第二个if子句。
因为(i>j) 是false,所以a中的代码显示B,但是b中的语句什么也不显示。
八、逻辑运算符
关键点:逻辑运算符not、 and和or都可以用来创建一个组合条件。
有时候,几个条件组合在一起决定是否执行一条语句。你可以使用逻辑运算符来组合这些条件形成一个组合表达式。逻辑运算符,也被称为布尔运算符,它是在布尔值上的运算并创建出一个新的布尔值。表4-3罗列出所有的布尔运算符。表4-4定义了not运算符。它对True取反得False,对False取反得True。表4-5定义了and运算符。当且仅当两个操作数都为真时,两个操作数的and操作结果是真。表4-6定义了or运算符。至少有一个操作数为真,两个操作数的or操作结果才为真。
九、条件表达式
关键点:条件表达式是根据某个条件计算一个表达式。
你可能想给一个变量赋值,但又受一些条件的限制。例如:下面的语句在x大于0时将1赋值给y,在x小于等于0时将-1赋予y。
ifX>0:
y=1
else:
y=-1
你还可以像下面的例子一样,使用一个条件表达式来获取同样的结果。
y=l if x>0 else -1
条件表达式完全是另一种不同风格。句法结构如下所示:
expression1 if boolean-expression else expression2
如果布尔逻辑表达式(boolean-expression)为真,那么这个条件表达式的结果就是expressionl;否则,这个结果就是expression2。
假设你想将变量numberl和number2中较大的赋值给max。你可以使用下面的条件表达式简单地编写一条语句。
max = number1 if number1 > number2 else number2
对于另一个例子,如果number是偶数,下 面的语句显示消息“ number is even”,否则,显示“number is odd"。
print("number is even" if number% 2 == 0 else "number is odd")
十、运算符的优先级和结合方向
关键点:运算符的优先级和结合方向决定了运算符的计算顺序。
运算符的优先级和结合方向决定Python运算符的计算顺序。假设你有如下的表达式:
3+4*4>5*(4+3)-1
它的值是多少?这些运算符的执行顺序又是什么?
算术上,最先计算括号内的表达式。(括号也可以嵌套,最先执行的是最里面括号中的表达式。)当计算没有括号的表达式时,可以根据优先规则和组合规则使用运算符。
优先规则定义了运算符的优先性。表4-7包含了你至今已经学习过的所有运算符,以从上到下的顺序罗列出来,其优先级越来越弱。逻辑运算符的优先级低于关系运算符,而关系运算符的优先级小于算术运算符。具有相同的优先级的运算符出现在同一行。
如果相同优先级的运算符紧连在一起,那它们的结合方向决定了计算顺序。所有的二元运算符(除赋值运算符外)都是从左到右的结合顺序。例如:因为+和-都有相同的优先级,所以表达式:
注意: Python 有自己内部计算表达式的方法,Python计算的结果和它对应的算术计算是一样的。