Python编程
决策控制
决策是指程序根据变量的值做出多个可能行动选择的过程。以交通信号灯为例,当灯是绿色时,我们继续行驶;当灯变成黄色时,我们减速;当灯是红色时,我们停下来。这些都是根据交通信号灯的值做出的逻辑决策。幸运的是,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 语句
elif
是else
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.")
通过这些实例,你可以看到如何利用if
、elif
和else
进行条件判断,如何在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
额外练习
-
写一个程序,让用户猜测你的名字,并且只有3次机会。超过3次后,程序退出。如果密码正确,打印“You have successfully logged in.”并退出程序。
-
写一个程序,要求用户输入两个数字。如果这两个数字的和大于100,打印“That's a big number”并退出程序。
-
写一个程序,要求用户输入他们的名字。如果他们输入的是你的名字,告诉他们“That's a nice name”。如果输入的是“John Cleese”或“Michael Palin”,告诉他们你对他们的感受,否则告诉他们“You have a nice name。”
-
写一个程序,要求用户输入密码。如果密码正确,打印“你已经成功登录”,然后退出程序。如果密码错误,打印“密码错误”,并要求用户输入密码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)