跳转到内容

Python 编程/决策控制

来自 Wikibooks,开放的书籍,开放的世界


Python,像许多其他计算机编程语言一样,使用布尔逻辑进行其决策控制。也就是说,Python 解释器比较一个或多个值,以决定是否执行一段代码,前提是语法和指令正确。

决策控制被进一步分为两大类,条件和重复。条件逻辑简单地使用关键字if和布尔表达式来决定是否执行代码块。重复在条件结构的基础上,为我们提供了一种简单的方法,在布尔表达式计算结果为true时,重复执行代码块。

布尔表达式

[编辑 | 编辑源代码]

这里有一个布尔表达式的小例子(你不必输入它)

a = 6
b = 7
c = 42
print (1, a == 6)
print (2, a == 7)
print (3, a == 6 and b == 7)
print (4, a == 7 and b == 7)
print (5, not a == 7 and b == 7)
print (6, a == 7 or b == 7)
print (7, a == 7 or b == 6)
print (8, not (a == 7 and b == 6))
print (9, not a == 7 and b == 6)

输出结果为

1 True
2 False
3 True
4 False
5 True
6 True
7 False
8 True
9 False

发生了什么?程序包含一堆奇怪的print语句。每个print语句打印一个数字和一个表达式。数字用于帮助跟踪我正在处理哪个语句。请注意每个表达式最终都是 True 还是 False;这些是 Python 的内置值。这些行

print (1, a == 6)
print (2, a == 7)

分别打印出 True 和 False,正如预期的那样,因为第一个是真,第二个是假。第三个 print 语句,print (3, a == 6 and b == 7),有点不同。运算符and表示如果之前和之后的语句都为真,那么整个表达式为真,否则整个表达式为假。下一行,print (4, a == 7 and b == 7),展示了如果表达式的一部分为假,那么整个表达式都为假。运算符andandand的行为可以总结如下

表达式 结果
true and true true
true and false false
false and true false
false and false false

请注意,如果第一个表达式为假,Python 不会检查第二个表达式,因为它知道整个表达式为假。

下一行,print (5, not a == 7 and b == 7),使用了not运算符。not它只是给出表达式的相反(表达式可以改写为print (5, a != 7 and b == 7))。这里是表格

表达式 结果
not true false
not false true

接下来的两行,print (6, a == 7 or b == 7)andprint (7, a == 7 or b == 6),使用了or运算符。运算符oror

表达式 结果
如果第一个表达式为真,或者第二个表达式为真,或者两者都为真,则返回真。如果两者都不为真,则返回假。这里是表格 true
true or true true
true or false true
false or true false

false or falseor请注意,如果第一个表达式为真,Python 不会检查第二个表达式,因为它知道整个表达式为真。这是因为

or如果至少一个表达式为真,则为真。第一部分为真,所以第二部分可以是假或真,但整个表达式仍然为真。and接下来的两行,print (8, not (a == 7 and b == 6))notprint (9, not a == 7 and b == 6),展示了括号可以用来分组表达式,并强制先评估一部分。请注意,括号将表达式从假变为真。这是因为括号强制运算符not

应用于整个表达式,而不是仅仅应用于

list = ["Life","The Universe","Everything","Jack","Jill","Life","Jill"]

# Make a copy of the list.
copy = list[:]
# Sort the copy
copy.sort()
prev = copy[0]
del copy[0]

count = 0

# Go through the list searching for a match
while count < len(copy) and copy[count] != prev:
    prev = copy[count]
    count = count + 1

# If a match was not found then count can't be < len
# since the while loop continues while count is < len
# and no match is found
if count < len(copy):
    print ("First Match:",prev)

a == 7

部分。

First Match: Jill

这是一个使用布尔表达式的例子请参见列表章节,以了解 copy = list[:] 中出现的切片运算符 [:] 的解释。这里是输出结果这个程序通过持续检查匹配来工作while count < len(copy) and copy[count] != prev。当countand大于copy的最后一个索引,或者找到匹配项时,while不再为真,所以循环退出。然后

ifand简单地检查以确保andwhile退出是因为找到了匹配项。这个例子中使用了另一个“技巧”。如果你查看and的表格,你会注意到第三个条目是“false and won't check”。如果andcount >= len(copy)and(换句话说,这个程序通过持续检查匹配来工作count < len(copy)。当为假),那么就不会查看 copy[count]。这是因为 Python 知道,如果第一个为假,那么两者不可能都为真。这被称为短路,如果第二个表达式在出现错误时会导致错误,它将非常有用。我使用了第一个表达式(count < len(copy))来检查count.)

是否为

copy

的有效索引。(如果你不信,请删除匹配项“Jill”和“Life”,检查它是否仍然有效,然后反转

count < len(copy) and copy[count] != prev

## This programs asks a user for a name and a password.
# It then checks them to make sure that the user is allowed in.
# Note that this is a simple and insecure example,
# real password code should never be implemented this way.

name = raw_input("What is your name? ")
password = raw_input("What is the password? ")
if name == "Josh" and password == "Friday":
    print ("Welcome Josh")
elif name == "Fred" and password == "Rock":
    print ("Welcome Fred")
else:
    print ("I don't know you.")

的顺序为

What is your name? Josh
What is the password? Friday
Welcome Josh

What is your name? Bill
What is the password? Saturday
I don't know you.

copy[count] != prev and count < len(copy)

布尔表达式可以在你需要同时检查两个或更多不同事物时使用。
  1. 示例

[编辑 | 编辑源代码]

password1.py
华夏公益教科书