更新时间:2022-05-24 01:52:09
本节书摘来自华章计算机《Python程序设计》一书中的第2章,第2.1节,作者:[美]戴维 I.施奈德(David I. Schneider)著,更多章节内容可以访问云栖社区“华章计算机”公众号查看
计算机所处理的大量数据中均含有数值。在编程术语中,数值称为数字字面量(number literal)。本节将介绍对数值的各种操作以及数值显示的方式。
2.1.1 两种数值类型:整型和浮点型
一个没有小数点的数字称为整型(int,integer的简写),一个带有小数点的数字称为浮点型(float,floating-point的简写)。
2.1.2 算术运算符
五种基本的算术运算符是加、减、乘、除和幂运算。Python中加、减、除的运算符分别使用标准的符号+、–、/来表示。但是,用于表示乘法和幂运算的运算符,与通常的数学表示略有不同。
除法运算的结果通常是浮点型,即使结果商是一个整数。在其他运算中,如果参与运算的两个数有一个是浮点型,结果即为浮点型,否则结果为整型。
2.1.3 print函数
print函数用于在显示器上显示相应的数值。如果n是一个数字,那么下列语句
将显示数字n。由数字、算术运算符和括号可以组成用于计算的数值表达式。作用在表达式上的print函数将显示表达式计算后的结果。单个print函数还可以显示多个数值。如果m、 n、r、…是数值(或者数值表达式),那么语句
将依次显示数字(或者数值表达式的值),并用空格分隔。
print函数会触发一个换行操作(newline operation),意味着下一个print函数的输出将从新的一行开始。
例1 算术运算符
下面的程序分别使用了五种标准的算术运算符。[Run]表示执行程序(通过按键〈F5〉或者单击“Run”菜单下的“Run Module”命令)。紧随[Run]之后就是程序的输出结果。当计算2 * (3 + 4)时,括号中的部分将首先进行计算(括号中的表达式总是优先进行计算)。
提示:所有例子中出现的程序代码都可以从本书的合作站点上下载。具体可参见前言中的介绍。
2.1.4 变量
在求解数学问题时,量值通常使用一个名字来代表。例如,求解如下算术问题:“如果一辆汽车以50英里/小时的速度行驶,那么14小时后它能够行驶多远?”要解决这个问题,可以采用下面熟悉的公式
距离=速度×行驶时间
例2展示了如何使用Python程序来解决这个问题。
例2 行驶距离
下面的程序使用了速度和行驶时间来计算行驶距离。其中,被赋于数值的那些名称就称为变量。程序第一行的意思是创建(或声明)了变量speed并赋值为50。同样,第二行和第三行分别创建了其他的变量并进行了相应的赋值。
数值表达式中也可以使用变量。表达式的计算需要依次将每个变量替换为其值后再进行算术运算。一些使用变量的表达式如:(2 * distance) + 7、n + 1和(a + b) / 3。
一般而言,变量是一个名称,对应着储存在内存的一个数据。本节中的所有数据都是数值。下列的语句形式:
variableName = numericExpression
称为赋值语句。该语句首先计算等号右侧表达式的值,然后将其结果赋于左边的变量。当变量第一次出现在赋值语句的左边时,该变量即被创建。以后对该变量的赋值语句只是为这个变量赋予不同的值。事实上,每个变量均指向了一个存储其数值的内存地址。在表达式使用变量之前,该变量必须先使用赋值语句进行创建。
Python语言规定,变量名必须以字母或下划线开头,并且只能由字母、数字和下划线组成(最短的变量名可以只有一个字母)。有意义的变量名能够帮助其他人(或者稍后的你自己)轻易地回想起变量当初所代表的含义。一些有意义的变量名如:totalSales、rateOfChange和taxRate。作为约定,我们将变量名中除了首个单词外,每个单词的首字母大写,其他都使用小写字母。由于大写字母就像变量名中的驼峰一样,因此这种命名约定称为骆驼命名法(camel casing)。
Python是大小写敏感的,也意味着Python是区分大小写字母的。因此,变量名amount和Amount代表两个不同的变量。
Python中有33个具有特殊含义的单词,称为保留字(或者关键字)。保留字不可以作为变量名而使用。一些保留字如:return、for、while和def。附录B列出了所有的33个保留字。(提示:IDLE编辑器自动地使用橙色高亮显示保留字。)
2.1.5 abs、int与round函数
除了标准的算术运算之外,还有一些常用的运算用于处理数值类型的数据。例如,需要对数字进行四舍五入或者取其绝对值。这些操作可以通过内建函数来完成。与函数相关的有一个或多个数值称为输入,一个数值称为输出。函数可看做返回输出结果。下文中提到的三个函数均是数值输入和输出。
绝对值函数abs(x)就是|x|。该函数将负数中的负号去掉并保持其他部分不变。int函数将保持整数不变,并将浮点数通过丢弃小数部分转换为整数。round(n, r) 函数的结果是四舍五入保留数值n的小数点后r位,参数r可以省略。在这种情况下,n将四舍五入为整数。部分例子如下:
括号中的部分可以是数字(如上所示)、数值变量,或者数值表达式。对于表达式的情况,需要首先计算表达式的值来作为函数的输入。
例3 函数
下面的程序在表达式中分别使用了刚刚讲过的三个函数。
提示:与变量名类似,函数名是大小写敏感的。比如,round函数是不可以写成Round的。
2.1.6 增量赋值
由于赋值语句中赋值操作开始之前右边的表达式将首先进行计算,下列语句
是有意义的。它首先计算右侧表达式的值(也就是,在变量var的值上加1),然后再将求和结果赋给变量var。效果等价于对变量var进行了加1。从内存地址的角度上看,该语句从var的内存地址中取出其值,并计算var + 1,最后将求和结果存在一个内存地址。由于这种计算非常普遍,因此Python专门提供了一种特殊的运算符来执行这种运算。语句
可以用下列语句来替换
一般而言,如果n是一个数值,那么语句
将var的值加上n的值。运算符+=可看做执行了一个增量赋值。其他的增量赋值运算符有–=、=、/=和*=。
例4 增量赋值语句
下面的程序展示了不同的增量赋值运算符。
2.1.7 其他两种整型运算符
除了在本节开始为大家介绍的五种标准算术运算符之外,Python中还可以使用整除运算符(//)和求余运算符(%)。假设m和n是两个正整数,当m除以n时,将得到一个整数的商和一个整数的余数,整数的商记为m//n,整数的余数记为m%n。例如,
本质上讲,m // n 是两数相除,并去掉结果中的小数部分。m % n是m除以n时的余数。一些例子如下:
例5 转换长度
下面的程序将41英寸转换为3英尺5英寸。
2.1.8 括号与优先级
括号可以用来更加清晰地说明表达式的含义。当表达式中有括号时,算术运算符的执行顺序按照以下的优先级进行:
好的编程习惯应该尽可能多地使用括号,这样就不需要刻意记忆优先级的规则。例如,将2 3 + 4写为(2 3) + 4,将4 + 2 3写为4 + (2 3)。
2.1.9 三种类型的错误
文法和标点符号错误称为语法错误。一些使用不当的语句及其错误如表2-1:
当代码由解释器分析(在程序开始运行之前)时,语法错误会高亮显示,Python会弹出类似于图2-1的消息框。在单击“OK”按钮后,Python会用一个闪烁的光标定位程序中出现错误的可能位置。
在程序正在运行时出现的错误称为运行时错误或异常。一些使用不当的语句及其错误如表2-2所示。
表2-2中,前两个错误是NameError,第三个是ZeroDivisionError。当Python遇到异常时,Python将终止当前程序的执行并显示如图2-2所示的消息。这个出错消息的最后两行定位到引发错误的语句并给出错误的类型。
第三种错误称为逻辑错误。这样的错误出现意味着程序没有按照预想的方式执行。例如,语句
语法上没有问题,却得不到正确的结果。计算平均值的正确方法是:
所以,逻辑错误是最难发现与定位的错误。
2.1.10 内存中的数值对象
思考下面的两行代码:
图2-3展示了这两行代码执行时内存的变化情况。当第一行代码执行时,Python分配了一块内存保存数字5。变量n可看做是引用(或指向)数值5的内存地址。当第二行代码执行时,Python又分配了一个新的内存地址保存数值7,并将变量n重新指向新的内存地址。内存中的数字5可看做被丢弃了。最终,Python通过垃圾回收进程将孤立的数值从内存中移除。
注释
根据要执行的代码填写表格中变量对应的值。
习题2.1
在习题1~12中,在不使用计算机的情况下,计算数值表达式的值,之后再使用Python验证你的答案。
在习题13~18中,确定哪个名称是合法的变量名。
在习题19~24中,当a = 2、b = 3、c = 4时,计算数值表达式的值。
在习题25~30中,写出计算并显示相应值的代码。
在习题31和32中,根据要执行的代码填写表格中变量对应的值。
在习题33~38中,根据给出的代码写出输出结果。
在习题39~42中,找出其中的错误。
在习题43~48中,给出函数的返回结果。
在习题49~54中,当a = 5、b = 3时,给出函数的返回结果。
在习题55~60中,用增强赋值运算符改写语句。
在习题61~68中,编写程序使得每行代码实现每一个步骤。
(b) 创建变量costs,并赋值为45 000。
(c) 创建变量profit,并赋值为变量revenue和costs的差值。
(d) 输出变量profit的值。
(b) 创建变量numberOfShares,并赋值为400。
(c) 创建变量amount,并赋值为costPerShare和numberOfShares的乘积。
(d) 输出变量amount的值。
(b) 创建变量discountPercent ,并赋值为30。
(c) 创建变量markdown,并赋值为price和倍数值(discountPercent除以100)的乘积。
(d) 从price中减去markdown。
(e) 输出变量price的值(保留小数点后两位)。
(b) 创建变量pricePerUnit,并赋值为8。
(c) 创建变量costPerUnit,并赋值为6。
(d) 创建变量breakEvenPoint,并赋值为fixedCosts除以(pricePerUnit和costPerUnit的差值)的商。
(e) 输出变量breakEvenPoint 的值。
(b) 以5%增加变量balance的值。
(c) 以5%增加变量balance的值。
(d) 以5%增加变量balance的值。
(e) 输出balance的值(保留小数点后两位)。
(b) 以5%增加变量balance的值,并再加上100。
(c) 以5%增加变量balance的值,并再加上100。
(d) 以5%增加变量balance的值。
(e) 输出balance的值(保留小数点后两位)。
(b) 变量balance乘以1.05的10次幂。
(c) 输出balance的值(保留小数点后两位)。
(b) 创建变量sellingPrice,并赋值为15。
(c) 创建变量percentProfit,并赋值为sellingPrice和purchasePrice差值乘以100再除以purchasePrice。
(d) 输出percentProfit的值。
在习题69~78中,编写相应的程序完成问题的求解。程序中应当为每个量值使用变量。
实践问题2.1的解答
每执行一个赋值语句,只有一个变量(等号左边的变量)的值会发生变化。