输入资料和算术运算

算术运算就是对整数、浮点数和Decimal浮点数等数值资料进行计算。这是程式最常使用的功能。现在电脑的CPU每秒可以计算超过三百亿个浮点数,由此可见电脑的计算速度有多惊人!电脑的功能愈来愈强,就是因为它的计算速度愈来愈快。这个单元要介绍如何运用电脑的计算能力,另外还要学习如何让程式读取使用者输入的资料。

让程式读取使用者输入的资料非常容易,只要利用input()这个内建函式,就可以完成以下二件事:

显示输入资料的提示讯息

取得使用者输入的资料

input()函式的用法如下:

变数名称 = input('提示讯息')

input()函式会把使用者输入的内容,当成一个字串资料传回来。就算使用者输入数字,传回来的也是「数字字串」,并不是数值型态的资料。如果希望得到数值资料,必须再利用其他函式,例如int()、float(),把数字字串转换成数值。

python 一秒触发一次函数 python每秒运算多少次_python 一秒触发一次函数

图1 input()函式的执行流程

我们来看一个范例:

name = input('请输入姓名:')

这一行程式码总共会做三件事(请参考图1)。

把提示讯息显示在萤幕上

使用者输入完成,按下Enter键,传回输入的内容

把使用者输入的内容,储存在name变数里头

姓名本身就是字串型态的资料,因此不需要转换成数值。

如果程式需要输入一笔成绩,就需要进行转换如下:

score = input('请输入成绩:')

# 把score里头的「数字字串」转换成整数,再存回score

score = int(score)

第一行程式码的score拿到的是一个字串,接下来的程式码是把score中的字串转换成整数,再存回score。如果需要的是浮点数,就把以上范例的int()函式换成float()函式。如果使用者输入的是非数字的字串,例如'19a',执行最后一行程式码的时候就会发生错误。要处理这种情况,必须在转换数值之前,先检查输入的字串是否是「数字字串」,或是利用「例外处理」技术来加以处理。我们留到后面单元再来介绍详细的作法。

以上输入成绩的范例可以简化成一行程式码如下:

score = int(input('请输入成绩:'))

这行程式码的运作方式是先执行input()函式,因为它是在int()函式里头,所以必须先执行。然后把input()函式传回来的结果输入给int()函式,最后把int()函式得到的结果储存到score变数。

到目前为止,我们已经很习惯使用等号「=」,读者应该不会觉得它有什么特别,但是现在我们要花点工夫,好好解释一下它的功能。如果从数学的角度来看,「=」有二种用途。例如「x = 5」是把变数x的值设定为5。但是如果我们说「假如x = 5」,则是把x的值和5作比较,看看二者是不是相等。也就是说,等号在数学中有「指定」和「比较」二种功能。但是在Python语言中,等号就是指定的功能,所以我们称它为「指定运算子」。

「运算子」就是运算符号,「运算元」就是要运算的资料。不管是数学还是电脑程式,「运算式」都是由「运算子」和「运算元」组成。

在程式中,等号的用法如下:

变数 = 值、变数或是运算式

Python语言的等号是让左边的变数「使用」右边的值。读者看到这句话可能会觉得有点奇怪,因为上一个单元(也就是图2)我们的解释是「把右边的值,存入左边的变数」。其他程式语言是这样做没有错,但是Python语言的作法是先创造右边的值出来,再让左边的变数使用它。也就是说等号左边的变数和右边的值,并不是在记忆体的同一个位置,但是等号左边的变数会记录等号右边这个值的位置,所以可以找到它来使用。这样做的好处是,只要改变变数记录的值的位置,就可以让同一个变数随意使用各种型态的资料,例如字串、整数、浮点数。这是其他程式语言无法做到的功能。

python 一秒触发一次函数 python每秒运算多少次_算术运算_02

图2 Python指定运算子的作法

我们用一个实际的例子来解释以上讨论的情况:

ch_score = 100

en_score = 100

执行这二行程式码的时候,Python会先创造100这个值出来,然后让ch_score和en_score这二个变数一起使用它(Python很聪明,它不会创造二个一样的值),如图2。如果修改其中一个变数的值如下:

ch_score = 90

python 一秒触发一次函数 python每秒运算多少次_浮点数_03

图3 改变ch_score变数的值

Python会创造另一个值90,让ch_score使用它,如图3。这就是Python变数的实际运作方式。指定运算子还可以串接起来,如以下范例。这行程式码的执行结果就是三个变数都是使用100这个值。

ch_score = en_score = math_score = 100

另外Python语言还有一项特殊功能:

等号左边和右边可以有一个以上的变数和资料,每一个变数和资料之间必须用逗号隔开。

我们看以下范例:

第一行程式码是把使用者输入的整个字串,存入name_score变数中,name_score就成为一个字串物件(请参考「补充说明」)。第二行程式码是利用字串物件的split()方法,把字串中的空格当成分界,将一个字串拆解成多个「子字串」。split()方法也可以让我们指定分隔字元,例如split(',')就是把逗点当成分隔字元。如果没有指定,就是把空格当成分隔字元。以上程式码范例在执行split()方法之后,预期会得到二个子字串,所以第二行程式码的等号左边有二个变数name和score,它们用逗点隔开,这二个变数会接收split()方法传回来的二个字串。Python语言之所以有这项特殊功能(其他程式语言,像是C、C++、Java无法这么做),是因为它可以处理「Tuple资料组」。后续我们会再详细介绍资料组的原理和使用方式。

补充说明:变数其实是一个物件

所谓「物件」就是包含资料和函式的一个个体。变数其实就是一个物件,所以变数本身就提供函式让我们使用,而且我们把物件里头的函式叫做「方法」(method)。例如字串物件的split()方法可以让我们把字串拆解成多个字串(称为「子字串」)。

以上输入姓名和成绩的范例,可以进一步简化如下:

name, score = input('请输入姓名和成绩,资料之间加入空格:').split()

score = int(score) # 把score从字串型态转换成整数型态

我们把原来第一行和第二行的程式码结合起来,成为一行程式码。它会先执行input()函式,input()函式会传回一个字串物件,我们再执行这个字串物件的split()方法,最后把split()方法得到的结果,储存到name和score物件里头。

利用以上讨论的功能,我们可以很容易地把二个变数的内容对调: