第2章 认识变量与基本数学运算
本章摘要
2-1 用Python做计算
2-2 认识变量
2-3 认识程序的意义
2-4 认识注释的意义
2-5 Python变量与其他程序语言的差异
2-6 变量的命名原则
2-7 基本数学运算
2-8 指派运算符
2-9 Python等号的多重指定使用
2-10 删除变量
2-11 Python的断行
2-12 专题——复利计算/计算圆面积与圆周长
本章将从基本数学运算开始,一步一步讲解变量的使用与命名,接着介绍Python的算术运算。
2-1 用Python做计算
假设读者到麦当劳打工,一小时可以获得120元,如果想计算一天工作8小时,可以获得多少工资,可以用计算器执行120×8,然后得到执行结果。在Python Shell中,可以使用下列方式计算。
如果一年实际工作天数是300天,可以用下列方式计算一年所得。
如果读者一个月的花费是9000元,可以用下列方式计算一年可以存储多少钱。
上述先计算一年的花费,再用一年的收入减去一年的花费,可以得到所存储的金额。本章将一步一步推导应如何以程序思想,处理一般的运算问题。
2-2 认识变量
2-2-1 基本概念
变量是一个暂时存储数据的地方,对于2-1节的内容而言,如果时薪从120元调整到125元,想要重新计算一年可以存储多少钱,将发现所有的计算需要重新开始。为了解决这个问题,可以考虑将时薪设为一个变量,未来如果调整薪资,直接更改变量内容即可。
在Python中可以用“=”设置变量的内容,在这个实例中,建立了一个变量x,然后用下列方式设置时薪。
如果想要用Python列出时薪,可以使用print( )函数。
如果时薪从120元调整到125元,那么可以用下列方式表达。
注 在Python Shell环境,也可以直接输入变量名称,即可获得执行结果。
一个程序中是可以使用多个变量的,如果想计算一天工作8小时,一年工作300天,可以赚多少钱,假设用变量y表示一年工作所赚的钱,可以用下列方式计算。
如果每个月花费是9000元,使用变量z表示每个月的花费,可以用下列方式计算每年的花费,使用a表示每年的花费。
如果想计算每年可以存储多少钱,使用b表示每年所存储的钱,可以使用下列方式计算。
上述语句顺利地使用Python Shell计算了每年可以存储多少钱,可是上述使用Python Shell做运算潜藏的最大问题是,只要过了一段时间,我们可能忘记当初所有设置的变量是代表什么意义。因此在设计程序时,如果可以为变量取个有意义的名称,未来看到程序时,可以比较容易记得。下列是笔者重新设计的变量名称。
时薪:hourly_salary,用此变量代替x,即每小时的薪资。
年薪:annual_salary,用此变量代替y,即一年工作所赚的钱。
月支出:monthly_fee,用此变量代替z,即每个月的花费。
年支出:annual_fee,用此变量代替a,即每年的花费。
年存储:annual_savings,用此变量代替b,即每年所存储的钱。
如果现在使用上述变量重新设计程序,可以得到下列结果。
相信经过上述说明,读者应该了解变量的基本意义了。
2-2-2 认识变量的地址
Python是一种动态语言,它处理变量的过程与一般静态语言不同。对于静态语言而言,例如C、C++,当声明变量时内存就会预留空间存储此变量的内容,例如,若声明与定义x=10, y=10时,内存内容如下方左图所示。
对于Python而言,变量所使用的是参照(reference)地址的观念,设置一个变量x等于10时,Python会在内存某个地址存储10,此时我们建立的变量x好像是一个标志(tags),标志内容是存储10的内存地址。如果有另一个变量y也是10,则变量y的标志内容也是存储10的内存地址,如上方右图所示。
使用Python可以使用id( )函数获得变量的地址,可参考下列语法。
实例:列出变量的地址,相同内容的变量会有相同的地址。
2-3 认识程序的意义
延续上一节的实例,如果时薪改变、工作天数改变或每个月的花费改变,所有输入与运算都要重新开始,而且每次都要重新输入程序代码,这是一件很费劲的事,同时很可能会输入错误,为了解决这个问题,可以使用Python Shell打开一个文件,将上述运算存储在文件内,这个文件就是所谓的程序。未来有需要时,再打开重新运算即可。
程序实例ch2_1.py:使用程序计算每年可以存储多少钱,下面是整个程序设计。
执行结果
未来时薪改变、工作天数改变或每个月的花费改变时,只要适度修改变量内容,就可以获得正确的执行结果。
2-4 认识注释的意义
程序ch2_1.py中尽管已经为变量设置了有意义的名称,但时间一久,常常还是会忘记各个指令的内涵。所以笔者建议,设计程序时,应适度地为程序代码加上注释。在1-10节已经讲解了注释的方法,下面将直接以实例说明。
程序实例ch2_2.py:重新设计程序ch2_1.py,为程序代码加上注释。
执行结果 与ch2_1.py相同。
相信经过上述注释后,即使再过10年,只要一看到程序也可轻松了解整个程序的意义。
2-5 Python变量与其他程序语言的差异
许多程序语言变量在使用前需要先声明,Python对于变量的使用则是可以在需要时,再直接设置使用。有些程序语言在声明变量时,需要设置变量的数据类型,Python则不需要设置,它会针对变量值的内容自行设置数据类型。
2-6 变量的命名原则
Python对于变量的命名,在使用时有一些规则要遵守,否则会造成程序错误。
(1)必须由英文字母、_(下画线)或中文开头,建议使用英文字母。
(2)变量名称只能由英文字母、数字、_(下画线)或中文组成。
(3)英文字母大小写是敏感的,例如,Name与name被视为不同变量名称。
(4)Python系统保留字(或称关键词)不可当作变量名称,会让程序产生错误,Python内建函数名称不建议当作变量名称。
注:虽然变量名称可以用中文,不过笔者不建议使用中文,将来可能会有兼容性的问题。
下列是不可当作变量名称的Python系统保留字。
下列是不建议当作变量名称的Python系统内建函数,若是不小心将系统内建函数名称当作变量,程序本身不会错误,但是原函数功能会丧失。
实例1:下列是一些不合法的变量名称。
实例2:下列是一些合法的变量名称。
SUM _fg x5 总和
实例3:下列3个代表不同的变量。
SUM Sum sum
2-7 基本数学运算
2-7-1 四则运算
Python的四则运算是指加( + ) 、减( - ) 、乘( * )和除( / )。
实例1:下列是加法与减法运算实例。
实例2:乘法与除法运算实例。
2-7-2 余数和整除
余数(mod)所使用的符号是“%”,可计算出除法运算中的余数。整除所使用的符号是“//”,是指除法运算中只保留整数部分。
实例:余数和整除运算实例。
其实在程序设计中求余数是非常有用的,例如,如果要判断数字是奇数或偶数可以用%,例如"num % 2",如果num是奇数,所得结果是1;如果num是偶数,所得结果是0。当读者学会更多指令后,笔者会做更多的应用说明。
2-7-3 次方
次方的符号是“**”。
实例:平方、次方的运算实例。
2-7-4 Python语言控制运算的优先级
Python语言碰上计算式同时出现在一个指令内时,除了括号“( )”内部运算最优先外,其余计算优先次序如下。
(1)次方;
(2)乘法、除法、求余数(%)、求整数(//),彼此依照出现顺序运算;
(3)加法、减法,彼此依照出现顺序运算。
实例:Python语言控制运算的优先级的应用。
2-8 指派运算符
常见的指派运算符如下。
实例:指派运算符的实例说明。
2-9 Python等号的多重指定使用
使用Python时,可以一次设置多个变量等于某一数值。
实例1:设置多个变量等于某一数值的应用。
Python也允许多个变量同时指定不同的数值。
实例2:设置多个变量,每个变量有不同值。
当执行上述多重设置变量值后,甚至可以执行更改变量内容。
实例3:将两个变量内容交换。
上述原先x, y分别设为10, 20,但是经过多重设置后变为20, 10。其实可以使用多重指定更灵活地应用Python,在2-7-2节有求商和余数的实例,可以使用divmod( )函数一次获得商和余数,可参考下列实例。
上述使用了divmod(9,5)方法一次获得了元组值(1,4),第8章会介绍元组,然后使用多重指定将此元组(1,4)分别设置给x和y变量。
2-10 删除变量
程序设计时,如果某个变量不再需要,可以使用del指令将此变量删除,相当于可以收回原变量所占的内存空间,以节省内存空间。删除变量的格式如下:
del 变量名称
实例:验证变量名称回收后,将无法再使用。此例中尝试输出已删除的变量,然后程序出现错误消息。
2-11 Python的断行
2-11-1 一行有多个语句
在Python中允许一行有多个,彼此用“;”隔开即可,尽管Python有提供此功能,不过笔者不鼓励如此撰写程序代码。
程序实例ch2_3.py:一行有多个语句的实例。
执行结果
2-11-2 将一个语句分成多行
在设计大型程序时,常会碰上一个语句很长,需要分成两行或更多行撰写,此时可以在语句后面加上“\”符号,Python解释器会将下一行的语句视为这一行的语句。特别注意,在“\”符号右边不可以加上任何符号或文字,即使是注释符号也是不允许的。
另外,也可以在语句内使用小括号,如果使用小括号,就可以在语句右边加上注释符号。
程序实例ch2_4.py:将一个语句分成多行的应用。
执行结果
2-12 专题——复利计算/计算圆面积与圆周长
2-12-1 银行存款复利的计算
程序实例ch2_5.py:银行存款复利的计算。假设目前银行年利率是1.5%,复利公式如下:
本金和 = 本金×(1 + 年利率)n # n是年
现有一笔5万元存款,请计算5年后的本金和。
执行结果
2-12-2 计算圆面积与周长
程序实例ch2_6.py:假设圆半径是5cm,圆面积与圆周长计算公式分别如下:
执行结果
在程序语言的设计中,有一个概念是常量(named constant),这种常量是不可更改内容的。上述计算圆面积或圆周长所使用的PI是圆周率,这是一个固定的值,由于Python语言没有提供此常量(names constant)的语法,上述程序笔者用大写PI当作常量的变量,这是一种习惯,未来读者可以用这种方式处理固定内容的变量。
习题
1. 请重新设计c h2_1.py,将打工时薪改为150元。(2-1~2-3节)
2. 重新设计ch2_5.py,假设是单利率,5年期间可以领多少利息?(2-5~2-7节)
3. 重新设计ch2_5.py,假设期初本金是100 000元,年利率是2%,这是复利计算,请问10年后本金总和是多少?(2-5~2-12节)
4. 一个幼儿园买了100个苹果给学生当营养午餐,学生人数是23人,每个人午餐可以吃一个,请问这些苹果可以吃几天?第几天苹果会不够供应?同时列出缺少了几个。(2-5~2-12节)
5. 地球和月球的距离是384 400千米,假设火箭飞行速度是每分钟400千米,请问从地球飞到月球需要多少分钟?(2-5~2-12节)
6. 假设圆柱半径是20厘米,高度是30厘米,请计算此圆柱的体积。圆柱体积计算公式是:圆面积×圆柱高度。(2-5~2-12节)
7. 圆周率PI是一个数学常数,常常使用希腊字母表示,它的物理意义是圆的周长和直径的比率。历史上第一个无穷级数公式称为莱布尼茨公式,它的计算公式如下:(2-5~2-12节)
请分别计算下列级数的执行结果。
(1)
(2)
(3)
注 上述级数如果要收敛到我们熟知的3.14159需要相当长的级数计算。
莱布尼茨(Leibniz,1646—1716)是德国人,在世界数学舞台上占有一席之地,他本人另一个职业是律师,许多数学公式都是他在各大城市通勤期间完成的。数学历史上有一个两派说法的无解公案,有人认为他是微积分的发明人,也有人认为发明人是牛顿(Newton)。
8. 尼拉卡莎级数也是应用于计算圆周率PI的级数,此级数收敛的速度比莱布尼茨级数更好,更适合于用来计算PI,它的计算公式如下:
请分别计算下列级数的执行结果。
(a)
(b)