在本章中,我们将更深入地研究问题,以确定设计问题算法所需的输入和输出。我们将使用在第 8 章、Python 简介中学习的概念,其中我们讨论了面向对象编程、字典、列表等。当您练习获取输入并在算法中使用它时,您将能够看到算法的输出取决于输入信息。
在本章中,我们将介绍以下主题:
- 定义输入和输出
- 理解计算思维中的输入和输出
在本章中,我们将重点了解不同类型的输入以及如何在使用Python编程语言编程时使用输出。为了更好地理解这些主题,我们必须首先了解它们的定义。
对于本章,您需要安装最新的 Python 版本。
您可以在这里找到本章使用的源代码:https://github.com/PacktPublishing/Applied-Computational-Thinking-with-Python/tree/master/Chapter09
我们将从研究输入及其定义开始本节,输入及其定义反过来用于提供结果或输出。
输入是输入到系统或机器中的内容。在计算机中,我们有输入设备,然后计算机解释为提供结果,或输出。当我们查看输入的类型以及如何在算法中使用输入时,您将看到我们从这些算法中获得的输出。让我们来看一些输入设备的例子:
- 键盘:当我们使用键盘时,计算机对按键进行解释,并在各种程序中使用这种解释,例如文档写入和搜索栏。
- 鼠标:鼠标用于导航我们的物理屏幕,帮助我们点击内容并滚动页面。
- 操纵杆:操纵杆可用于玩电脑游戏。
- 话筒:在更多现代机器中,话筒不仅用于通过电话和视频应用程序进行通信,还用于为人工智能(AI助手,如Cortana和Siri执行口头命令,以及语音到文本命令。
上述所有输入都被编程到我们的计算机中以便使用。在 Python 中,我们编写使用这些输入的算法。用户输入是指程序要求用户提供信息,然后用于生成输出。请记住,输入和输出可以在算法中的任何时间发生。我们还可以提供需要用户额外输入的输出反馈,等等。让我们来看看如何从 Python 获得用户输入。
Python 为用户提供了一个主要的提示,input()函数。此函数用于获取用户输入,然后自动将输入转换为用户期望的输出。
我们以前在多个程序中使用过这些主要提示,例如第 5 章探索问题分析中的存储示例。让我们看看算法中的一些输入命令是什么样子。请看以下代码段:
ch9_ 输入 1.py
name = input("What is your name? ")
print("Nice to meet you " + name + ".")代码段询问用户的姓名,然后使用输入中的信息打印一条语句。该代码的结果如下所示:
What is your name? Mikayla
Nice to meet you Mikayla.现在,我们可以在不使用任何提示问题的情况下请求输入,但用户不知道询问的内容或如何使用。查看不带提示的代码段,如下所示:
ch9_ 输入 2.py
name = input()
print("Nice to meet you " + name + ".")当我们运行前面的程序时,shell 中不会打印任何内容。但是,我知道我需要键入一些内容,所以请看一下我刚键入一封信时发生的情况:
d
Nice to meet you d.正如您所见,用户不知道该做什么,因为窗口没有询问任何问题;它只提供了一个空格,用户必须假设这就是您键入输入的地方。但是这会引起很多混乱,因为没有任何信息告诉用户它是否需要输入,或者他们必须输入什么类型的内容。
我们可以通过使用print语句来缓解这种混乱,例如,通过向用户提供关于我们需要什么输入的信息。我们还可以将语句作为input()函数的一部分。例如,我们可以使用一行代码,例如name = input('What is your name?'),它将首先在引号中显示语句,以便用户知道我们在问什么。无论哪种方式,当我们设计算法时,提供一个声明以便用户知道需要什么是非常重要的。
正如您在前面的示例中所看到的,input()函数获取一个字符串,然后在print()语句中使用该字符串。让我们看看使用input命令时列表是什么样子:
ch9_ 输入 3.py
#Create the list
names = []
#Ask user how many names will be added
name = int(input("How many names will be in the list? "))
#Iterate to add each name to the list
for i in range(0, name):
people = str(input())
names.append(people)
print(names)在前面的代码片段中,我们首先创建列表,它不会显示给用户。然后询问用户将向列表中添加多少姓名。然后,我们遍历列表,以便用户可以分别输入每个名称。最后,附加名称并打印列表。查看此算法的输出:
How many names will be in the list? 4
Manny
Lisa
John
Katya
['Manny', 'Lisa', 'John', 'Katya']请注意,名称没有提示,因此算法假设用户在输入值4后知道要做什么。这可以通过在迭代中进行简单的添加来缓解。请看下面的代码片段:
ch9_ 输入 4.py
#Create the list
names = []
#Ask user how many names will be added
name = int(input("How many names will be in the list? "))
#Iterate to add each name to the list
for i in range(0, name):
people = input("Type the next name on the list. ")
names.append(people)
print(names)如您所见,每个名称现在都会有一个提示,要求键入下一个名称,这与运行算法时的以下输出类似:
How many names will be in the list? 4
Type the next name on the list. Milo
Type the next name on the list. Sonya
Type the next name on the list. Gabriel
Type the next name on the list. Maxine
['Milo', 'Sonya', 'Gabriel', 'Maxine']前面的输出显示了已完成的列表以及添加到该列表中的每个名称的提示。在算法中对这些提示进行简单的添加可以减轻用户在输入时的困惑。
正如您在本节前面的代码片段中所看到的,输入被读取为整数、字符串和列表。Python 会自动转换这些信息,以便算法可以使用这些信息。
在 Python 中,还有一种方法可以使用一行代码的单独输入定义多个变量。请看以下代码段:
ch9_ 输入 5.py
name1, name2 = input("Enter First Name: "), input("Enter Last Name: ")
print(name1 + " " + name2)正如你在前面的代码中看到的,在 Type T1 命令中的引号(AutoT0})用来分离输入。查看此算法的输出:
Enter First Name: John
Enter Last Name: Doe
John Doe如您所见,程序要求输入在算法的第一行中调用的名字和姓氏。这绝不是我们获取用户输入的唯一方法,也不是我们将使用的唯一输入。
在本节中,我们介绍了在算法中定义输入的一些方法。我们还学习了如何从用户那里获取输入,以便稍后在算法中使用。现在让我们进入下一节,我们将在一些计算思维问题中研究输入和输出。
为了更好地理解输入和输出,我们将在本节中研究计算思维问题。当我们完成算法的设计过程时,我们将重点确定我们的算法需要的输入和输出。让我们来看看我们的第一个问题。
凯撒密码是一种用于对消息进行编码的密码系统。密码学用于保护信息的安全,以便只有预期用户才能读取消息。凯撒密码使用字母的移位对消息进行编码。例如,字母a移动了 3 个位置,将是d。为了构建一个能够为我们实现这一点的算法,我们需要手头上的一些东西:
- 将被编码的消息
- 每个字母的移位量是多少
- 打印的编码信息
让我们思考一下上述几点的含义。该消息需要是用户的输入。移位也是一种输入,因为我们不希望程序总是使用相同的代码。否则,一旦你知道了班次,你就很容易理解原来的信息。打印的编码信息是我们的输出。以下是帮助创建算法的一些步骤:
- 我们首先需要输入消息。
- 然后我们需要定义输入移位。
- 之后,我们需要遍历每个字母。
- 迭代之后,我们根据定义的移位调整每个字母。
- 最后,我们打印出新的编码消息。
我们将借助以下密码算法片段来举例说明前面的步骤:
ch9_ 问题 1.py
#Print initial message for the user
print("This program will take your message and encode it.")
#Ask for the message
msg = input("What message would you like to code? ")
#Ask for shift
shift = int(input("How many places will you shift your message? "))
msgCipher = ""
#Iterate through the letters, adjusting for shift
for letter in msg:
k = ord(letter)
if 48 <= k <= 57:
newk = (k - 48 + shift)%10 + 48
elif 65 <= k <= 90:
newk = (k - 65 + shift)%26 + 65
elif 97 <= k <=122:
newk = (k - 97 + shift)%26 + 97
else:
newk = k
msgCipher += chr(newk)
print("Your coded message is below.")
print(msgCipher)请注意,在迭代过程中,我们正在进行一些数学运算,以计算出字母表中每个字母的值。在使用用户定义的移位值之后,我们使用一些条件语句来定义每个字母的值。
看看运行此算法时产生的输出:
This program will take your message and encode it.
What message would you like to code? Code this message
How many places will you shift your message? 2
Your coded message is below.
Eqfg vjku oguucig从前面的输出中可以看到,消息中的第一个单词和编码消息–Code:
- 移动了两个字母的
C现在是E。 o现在是q,依此类推。
对于消息中的每个字母,字母都移动了两个位置。输出是我们的print()语句加上编码消息,由print(msgCipher)行给出。为了清晰起见,我们的输出包括这两个语句。*第一条信息是否必要?*不是。但是,在一些算法中,最好有一些行,让用户知道算法发生了什么。
让我们来看看另一个问题。
要求您创建一个程序,从数字列表中查找最大值。编号列表由用户提供。所以,为这个问题创建一个算法。
首先,我们需要确定这个特定问题的输入和输出。他们的名单如下:
- 列表中的项目数(输入)
- 列表中的数字(输入)
- 列表中的最大值(输出)
回想本章前面的定义输入和输出部分,我们可以定义一个空列表,然后让用户让程序知道有多少项将输入列表。以下程序举例说明了这一点:
ch9_ 问题 2.py
#Define the list name
maxList = []
#Ask user how many numbers will be entered
quant = int(input("How many data points are you entering? "))
#Iterate, append points, and find maximum
for i in range(0, quant):
dataPoint = int(input("Enter number: "))
maxList.append(dataPoint)
#Print maximum value
print("The maximum value is " + str(max(maxList)) + ".")请注意,在前面的代码中,我们使用了max()函数来查找列表中的最大值。此外,为了让算法正确地将值识别为数字,我们必须添加int()类型。代码通过从0到我们从用户输入中接收的数据点数量的每个数字,我们将其定义为quant变量。当算法遍历这些数字时,它会比较它们并找到最大值。
让我们看看输出的样子:
How many data points are you entering? 6
Enter number: 1
Enter number: 2
Enter number: 8
Enter number: 4
Enter number: 5
Enter number: 7
The maximum value is 8.从前面的输出中可以看到,用户表示将输入6号。然后算法提示用户输入每个值。最后,确定了最大值。
现在让我们看看如何构建一个猜谜游戏。
您被要求构建一个游戏,在这个游戏中,用户可以根据需要获得尽可能多的机会,以正确的顺序识别四位数的数字。当用户输入猜测时,算法将说明任何数字是否正确。
该算法将识别数字是否位于正确位置,但不会识别哪些数字正确或哪些位于正确位置。如果玩家猜对了数字,游戏结束。你可能会发现这个游戏类似于一个叫做智囊团的流行游戏,玩家在游戏中设置四个彩色别针,第二个玩家猜。
在这种情况下,我们使用的是数字而不是颜色,计算机程序将帮助我们识别是否有正确的数字以及它们是否在正确的位置。
为了构建这个游戏,让我们看看我们需要的输入和输出:
- 随机生成的 4 位数字(输入)
- 用户的猜测(输入)
- 算法中有关编号和位置的反馈(输出)
- 猜出数字后结束游戏的消息(输出)
当我们生成数字时,我们需要找到一种方法将该数字的数字与用户输入的数字进行比较。请注意,我们需要为这个特定算法导入random库,以便生成随机的四位数。让我们看一下代码片段:
ch9_ 问题 3.py
import random as rand
number = rand.randint(1000,10000)
guess = int(input("What's your first guess? "))
#Algorithm checks if number is correct.
if (guess == number):
print("That's right! You win!")
else:
i = 0如您所见,这是一个实例,我们需要用户的输入。然而,这只是第一个猜测,所以我们需要从用户那里获得更多的输入,并提供一些提供反馈的输出。请查看来自同一算法的以下代码片段:
#Condition so that user keeps guessing until they win.
while (guess != number):
i = i + 1
#Remember you can also write as i += 1
j = 0
guess = str(guess)
number = str(number)
#Check which numbers are correct and mark incorrect with 'N'
guessY = ['N']*4
#Make sure you check each digit, so run loop 4 times
for q in range(0, 4):
if (guess[q] == number[q]):
j += 1
guessY[q] = guess[q]
else:
continue
#If only some digits are correct, run next condition
if (j < 4) and (j != 0):
print("You have " + str(j) + " digit(s) right.")
print("These numbers were correct.")
for m in guessY:
print(m, end = " ")
#Ask for next input
guess = int(input("What is your next guess? ")) 注意,我们需要在尝试失败后询问每个猜测。如果用户没有识别出正确的四位数,算法需要知道下一个猜测是什么才能继续运行。这就是为什么猜测输入值出现在算法中的多个位置。
一旦用户猜对了,程序需要打印一个最终语句,在这种情况下,我们将让用户知道猜测需要多少次尝试:
#If only some digits are correct, run next condition
if (j < 4) and (j != 0):
print("You have " + str(j) + " digit(s) right.")
print("These numbers were correct.")
for m in guessY:
print(m, end = " ")
#Ask for next input
guess = int(input("What is your next guess? "))
#No digits correct
elif (j == 0):
print("None of these digits are correct.")
guess = int(input("What is your next guess? "))
if guess == number:
print("It took you " + str(i)+ " tries to win!") 如您所见,该算法根据满足的条件在多个位置进行输入,以及输出。输出包括print语句和正确或错误数字的反馈。让我们看看程序执行时输出的样子:
What's your first guess? 1111
None of these digits are correct.
What is your next guess? 2222
None of these digits are correct.
What is your next guess? 3333
You have 1 digit(s) right.
These numbers were correct.
3 N N N What is your next guess? 3444
You have 3 digit(s) right.
These numbers were correct.
3 4 N 4 What is your next guess? 3454
You have 3 digit(s) right.
These numbers were correct.
3 4 N 4 What is your next guess? 3464
You won in 6 attempts.注意,在第三次尝试之后,我们有一个正确的数字,表示为3``N N N。这意味着第一个数字是 3。然后我们不得不猜测其余的数字。在程序或输出中提供反馈,允许用户继续此游戏。
如您所见,理解输入和输出使我们能够创建能够提供反馈、基于条件迭代等的程序。
在本节中,我们学习了在解决问题时如何使用输入和输出。向我们提供的场景允许我们探索某些类型的输入,例如用户定义的输入和算法定义的输入。我们还学习了如何编写算法,为用户提供清晰的输出。
在本章中,我们讨论了 Python 算法中的输入和输出。输入是我们获取算法响应信息的方式。例如,用户可以向一个算法提供输入,该算法会提示输入该信息,正如我们在示例问题中看到的那样。Python 和其他编程语言还可以从鼠标、扫描仪、照相机和其他与程序交互的设备获取输入。
为了编写我们的算法,重要的是确定我们需要什么样的输入,我们在设计中何时需要它们,以及我们需要什么样的程序输出。在第 3 章理解算法和算法思维中,我们使用用户输入查找午餐成本。我们制作了一本字典来帮助我们找到这些信息。类似地,在阅读本章之后,您现在已经具备了构建算法以解决一些其他问题所需的技能,例如我们的数字猜测游戏和最大查找器。
在我们设计算法之前,识别输入和输出是至关重要的,因为我们在算法中做出的条件和决定取决于输入的内容以及我们需要程序提供的输出内容。
在下一章中,我们将讨论控制流,这对于理解如何读取算法以及如何执行指令至关重要。在探索算法中的控制流时,我们还将更仔细地研究函数。