决策控制

决策是指程序根据变量的值做出多个可能行动选择的过程。以交通信号灯为例,当灯是绿色时,我们继续行驶;当灯变成黄色时,我们减速;当灯是红色时,我们停下来。这些都是根据交通信号灯的值做出的逻辑决策。幸运的是,Python有一个决策语句,帮助我们在程序中做出这种决策。

if 语句

下面是一个热身练习——一个简单的程序,计算一个数字的绝对值:

n = input("Integer? ")  # 输入一个整数,如果你的操作系统不支持raw_input,使用input()
n = int(n)  # 将n定义为你选择的整数(或者你也可以自己定义n)
if n < 0:
    print("The absolute value of", n, "is", -n)
else:
    print("The absolute value of", n, "is", n)

如果输入-34,输出为:

Integer? -34
The absolute value of -34 is 34

如果输入1,输出为:

Integer? 1
The absolute value of 1 is 1

程序是如何工作的呢?首先,它提示用户输入一个数字n = input("Integer? "),接着它读取if n < 0:。如果n小于0,Python会执行print("The absolute value of", n, "is", -n)这行代码,否则执行print("The absolute value of", n, "is", n)这行。

更正式地说,Python会判断n < 0这个表达式的真假。如果条件为真,Python会执行if语句后面的代码块。如果条件为假,Python会执行else语句后的代码块。

比较操作符

条件表达式可以通过不同的方式进行测试,以下是常见的操作符:

操作符 含义
< 小于
<= 小于或等于
> 大于
>= 大于或等于
== 等于
!= 不等于

elif 语句

elifelse if的缩写,表示如果最初的if语句条件为假并且elif条件为真,那么就执行elif后面的代码块。以下是一个例子:

a = 0
while a < 10:
    a = a + 1
    if a > 5:
        print(a, ">", 5)
    elif a <= 7:
        print(a, "<=", 7)
    else:
        print("Neither test was true")

输出为:

1 <= 7
2 <= 7
3 <= 7
4 <= 7
5 <= 7
6 > 5
7 > 5
8 > 5
9 > 5
10 > 5

可以注意到,elif a <= 7只有在if语句未为真时才会被测试,elif允许在一个if语句中进行多次条件判断。

if 语句示例

Higher or Lower 猜数字游戏

# 猜数字游戏
answer = 23
question = 'What number am I thinking of?  '
print("Let's play the guessing game!")

while True:
    guess = int(input(question))

    if guess < answer:
        print('Little higher')
    elif guess > answer:
        print('Little lower')
    else:  # guess == answer
        print('MINDREADER!!!')
        break

样例运行:

Let's play the guessing game!
What number am I thinking of?  22
Little higher
What number am I thinking of?  25
Little lower
What number am I thinking of?  23
MINDREADER!!!

输入验证

对于数字验证,可以对ValueError进行异常捕获:

while True:
    inp = input(question)
    try:
        guess = int(inp)
    except ValueError:
        print('Your guess should be a number')
    else:
        if guess < answer:
            print('Little higher')
        elif guess > answer:
            print('Little lower')
        else:  # guess == answer
            print('MINDREADER!!!')
            break

判断奇偶数

# 判断输入的数字是奇数还是偶数
print("Input [x] for exit.")

while True:
    inp = input("Tell me a number: ")
    if inp == 'x':
        break
    try:
        number = float(inp)
    except ValueError:
        print('I said: Tell me a NUMBER!')
    else:
        test = number % 2
        if test == 0:
            print(int(number), "is even.")
        elif test == 1:
            print(int(number), "is odd.")
        else:
            print(number, "is very strange.")

通过这些实例,你可以看到如何利用ifelifelse进行条件判断,如何在Python中构建一个简单的猜数字游戏以及如何进行输入验证。

示例运行

even.py 示例

# 判断一个数字是偶数还是奇数
print("Input [x] for exit.")

while True:
    inp = input("Tell me a number: ")
    if inp == 'x':
        break
    try:
        number = float(inp)
    except ValueError:
        print('I said: Tell me a NUMBER!')
    else:
        test = number % 2
        if test == 0:
            print(int(number), "is even.")
        elif test == 1:
            print(int(number), "is odd.")
        else:
            print(number, "is very strange.")

样例运行

Tell me a number: 3
3 is odd.

Tell me a number: 2
2 is even.

Tell me a number: 3.14159
3.14159 is very strange.

average1.py 示例

# 计算三个数字的平均值

print("Welcome to the average calculator program")
print("NOTE- THIS PROGRAM ONLY CALCULATES AVERAGES FOR 3 NUMBERS")
x = int(input("Please enter the first number "))
y = int(input("Please enter the second number "))
z = int(input("Please enter the third number "))
str = x + y + z
print(float(str / 3.0))

样例运行

Welcome to the average calculator program
NOTE- THIS PROGRAM ONLY CALCULATES AVERAGES FOR 3 NUMBERS
Please enter the first number 7
Please enter the second number 6
Please enter the third number 4
5.66666666667

average2.py 示例

# 输入多个数字直到输入的数量达到指定值,计算这些数字的平均值

sum = 0.0
print("This program will take several numbers, then average them.")
count = int(input("How many numbers would you like to sum:  "))
current_count = 0

while current_count < count:
    print("Number", current_count)
    number = float(input("Enter a number:  "))
    sum = sum + number
    current_count += 1

print("The average was:", sum / count)

样例运行

This program will take several numbers, then average them.
How many numbers would you like to sum:  2
Number 0
Enter a number:  3
Number 1
Enter a number:  5
The average was: 4.0
This program will take several numbers, then average them.
How many numbers would you like to sum:  3
Number 0
Enter a number:  1
Number 1
Enter a number:  4
Number 2
Enter a number:  3
The average was: 2.66666666667

average3.py 示例

# 不断更新平均值,直到用户输入新的数字

print("Welcome to the Average Calculator, please insert a number")
currentaverage = 0
numofnums = 0
while True:
    newnumber = int(input("New number "))
    numofnums = numofnums + 1
    currentaverage = (round((((currentaverage * (numofnums - 1)) + newnumber) / numofnums), 3))
    print("The current average is " + str((round(currentaverage, 3))))

样例运行

Welcome to the Average Calculator, please insert a number
New number 1
The current average is 1.0
New number 3
The current average is 2.0
New number 6
The current average is 3.333
New number 6
The current average is 4.0

If 示例

# 高低数字猜测游戏

answer = 23
question = 'What number am I thinking of?  '
print('Let\'s play the guessing game!')

while True:
    guess = int(input(question))

    if guess < answer:
        print('Little higher')
    elif guess > answer:
        print('Little lower')
    else:  # guess == answer
        print('MINDREADER!!!')
        break

样例运行

Let's play the guessing game!
What number am I thinking of?  22
Little higher
What number am I thinking of?  25
Little lower
What number am I thinking of?  23
MINDREADER!!!

密码猜测程序

# 密码猜测程序,统计用户输入错误的次数,超过3次后退出

guess_count = 0
correct_pass = 'dee234'

while True:
    pass_guess = input("Please enter your password: ")
    guess_count += 1

    if pass_guess == correct_pass:
        print('You have successfully logged in.')
        break
    elif pass_guess != correct_pass:
        if guess_count >= 3:
            print("You have been denied access.")
            break

额外练习

  1. 写一个程序,让用户猜测你的名字,并且只有3次机会。超过3次后,程序退出。如果密码正确,打印“You have successfully logged in.”并退出程序。

  2. 写一个程序,要求用户输入两个数字。如果这两个数字的和大于100,打印“That's a big number”并退出程序。

  3. 写一个程序,要求用户输入他们的名字。如果他们输入的是你的名字,告诉他们“That's a nice name”。如果输入的是“John Cleese”或“Michael Palin”,告诉他们你对他们的感受,否则告诉他们“You have a nice name。”

  4. 写一个程序,要求用户输入密码。如果密码正确,打印“你已经成功登录”,然后退出程序。如果密码错误,打印“密码错误”,并要求用户输入密码3次。如果密码错误,打印“你已被拒绝访问”,然后退出程序。

条件语句

许多编程语言(如 Java 和 PHP)都有一种一行条件语句(称为三元运算符),通常用于简化条件访问一个值。例如(在 Java 中):

int in= ; // 从程序输入读取

// 正常的条件赋值
int res;
if(number < 0)
  res = -number;
else
  res = number;

多年来,Python 并没有原生支持这种构造,但是你可以通过构造一个包含结果的元组,并将测试作为元组的索引来模拟它,如下所示:

number = int(input("Enter a number to get its absolute value:"))
res = (-number, number)[number > 0]

需要注意的是,与内建的条件语句不同,三元运算符中的“真”和“假”分支都会在返回之前被计算,这可能导致意外的结果并且如果不小心会导致执行速度变慢。为了避免这个问题,并且作为更好的实践,使用匿名函数调用(lambda 表达式)包装你放入元组中的内容,以防它们在不需要时被计算:

number = int(input("Enter a number to get its absolute value:"))
res = (lambda: number, lambda: -number)[number < 0]()

然而,自 Python 2.5 以来,Python 引入了一个等价的运算符(虽然没有被称为三元运算符,并且语法完全不同):

number = int(input("Enter a number to get its absolute value:"))
res = -number if number < 0 else number

Switch(开关语句)

Switch 是一种控制语句,出现在大多数编程语言中,用于减少一大堆 if - elif 语句。在 Python 3.10 中,Python 引入了一种新的语法,称为 match case,用来实现 switch case 功能。在版本 3.10 之前,Python 并没有官方支持的 switch 语句。可以通过巧妙地使用数组或字典来重现 switch 语句。

x = 1

def hello():
  print("Hello")

def bye():
  print("Bye")

def hola():
  print("Hola is Spanish for Hello")

def adios():
  print("Adios is Spanish for Bye")

# 注意,我们的 switch 语句是一个普通变量,唯一的区别是我们将函数名添加到了其中
# 且没有引号
menu = [hello, bye, hola, adios]

# 调用我们的 switch 语句,只需通过数组索引和一对括号调用函数
menu[3]()   # 调用 adios 函数,因为它是数组中的第 3 个元素

menu[0]()   # 调用 hello 函数,因为它是数组中的第 1 个元素

menu[x]()   # 调用 bye 函数,因为 x = 1,表示数组中的第 2 个元素

这段代码之所以有效,是因为 Python 会将函数的引用保存在数组的特定索引位置,使用一对括号就可以调用该函数。这里的最后一行相当于:

menu[1]()  # 直接调用 bye 函数

使用用户输入调用函数的另一种方式

go = "y"
x = 0
def hello():
  print ("Hello")
 
def bye():
  print ("Bye")
 
def hola():
  print ("Hola is Spanish for Hello")
 
def adios():
  print ("Adios is Spanish for Bye")

menu = [hello, bye, hola, adios]

while x < len(menu):
    print("function", menu[x].__name__, ", press ", "[" + str(x) + "]")
    x += 1
    
while go != "n":
    c = int(input("Select Function: "))
    menu[c]()
    go = input("Try again? [y/n]: ")

print("\nBye!")

使用 if 语句的另一种方式

if x == 0:
    hello()
elif x == 1:
    bye()
elif x == 2:
    hola()
else:
    adios()

使用 Lambda 表达式的另一种方式

result = {
  'a': lambda x: x * 5,
  'b': lambda x: x + 7,
  'c': lambda x: x - 2
}[value](x)

要了解更多关于 lambda 表达式的内容,请参见函数部分中的匿名函数

Last modified: Friday, 31 January 2025, 12:15 AM