3.3 数值运算
1.常量和变量
常量是不会变化的量。Python 3并没有命名常量,也就是说不能像C语言那样给常量起名字,只能以具体数值来代表常量。例如,整数常量12,字符串常量’abc’等。
Python 3的常量包括数字、字符串、布尔值(True, False)、空值(None)。
变量是可以通过变量名访问的计算机内存中的一块区域,它可以存储规定范围内的值,而且值可以改变。基于变量的数据类型,Python 3解释器会分配指定内存,并决定不同的数据在内存中的存储形式。
变量的命名前面已经介绍过。
del语句可以删除不再使用的变量,并释放变量所占的内存资源。
见示例3-19。
var1=10 #创建变量var1 var2='hello' #创建变量var2 print('var1=', var1) print('var2=', var2) del var1, var2 #删除掉var1和var2变量,以后再引用就会出错 print('var1=', var1)
程序运行结果:
var1= 10 var2= hello print('var1=', var1) NameError: name 'var1' is not defined
2.变量赋值
Python中的每个变量必须赋值才会被创建,赋值不需要先做类型声明,变量的类型就是赋值的数据类型或表达式运算结果的数据类型。
等号“=”用来给变量赋值,其左边是一个变量名,右边是存储在变量中的值。
见示例3-20。
n=20 #n是整型变量,值为20 miles = 1000.0 #miles是浮点型变量,值为1000.0 name = "John" #name是字符串变量,值为John print(n, miles, name) n=35.5 #n的值由20变为35.5,变为浮点类型 miles = miles*2 #miles是浮点型变量,值变为2000.0 name = "Tom" #name是字符串变量,值变为Tom print(n, miles, name)
程序运行结果:
201000.0 John 35.52000.0 Tom
3.数值类型转换
当Python表达式中包含不同数据类型时,如同时包含浮点数和整数,为了提高精度或者取整数,就需要使用类型转换函数。
int(x)是将x转换为纯整数。
float(x)是将x转换为浮点数。
round(x[, n])是改变浮点数小数点后的位数,带四舍五入进位,如round(10.456,2)返回10.46。
complex(x)是将x转换成实数部分为x和虚数部分为零的复数。
complex(x, y)是将x和y转换成一个实数部分是x和虚数部分是y的复数。
见示例3-21。
x=12.88 a=int(x) b=float(a) c=complex(x) print('x=', x, type(x)) print('a=', a, type(a)) print('b=', b, type(b)) print('c=', c, type(c))
程序运行结果:
x= 12.88 <class 'float'> a= 12 <class 'int'> b= 12.0 <class 'float'> c=(12.88+0j)<class 'complex'>
4.数学函数
Python的标准数学函数分为内置函数和math数学库。
(1)表3-10中的是内置函数,其不需要引入库。
表3-10 内置函数
示例3-22:对于炒股的小王来说,假如每周能赚5%,1万元本金到年底会有多少资金,获利率达到多少?(除去节假日,1年按35周计算。)
通过分析,我们确定可以利用次幂函数进行计算。下面直接给出Python程序:
wealth=10000*pow((1+0.05),35) print(’小王到年底有’, round(wealth,2), ’元资金。') proportion=(wealth-10000)/10000*100 print(’获利率为:', round(proportion,2), '%')
程序运行结果:
小王到年底有 55160.15 元资金。 获利率为: 451.6 %
示例3-23:小红有10万元,三年内暂不使用。假定银行1年定期利息为10%,买货币基金年化收益也为10%,其按日结息。假设三年内银行定期利息和货币基金年化收益不会改变,问小红买货币基金的收益比存银行多多少元?
解题思路:银行是定期,3年是3年复利,货币基金是日复利。下面给出程序代码。
Y1=100000*(1+0.1)**3 #Y1银行3年定期本金加收益 Y2=100000*(1+0.1/365)**(365*3)#Y2货币基金按日结息本金加收益Y3=Y2-Y1 Y3=Y2-Y1 #差额 print(’小红买货币基金比存银行的收益多’, round(Y3,2))
程序运行结果:
小红买货币基金比存银行的收益多 1880.33
(2)Python有math数学库,在引入数学库后就可以使用更多的数学函数了。
引入数学模块的语句:
import math
查看math库帮助:
help('math')
数学库的常量见表3-11。
表3-11 math数学库的常量
数学库的函数见表3-12。
表3-12 数学库的函数
示例3-24:有一个三位的数字,其数字从0~9中随机选取,可重复取数,问每组号码的概率是多少?
解题思路:位置A, B, C可选取的数字都是0~9,有10种取法,因此全部组合P为10*10*10=1000。这实际上就是福利3D彩票每注奖号的中奖概率。
#三位数字ABC,每个位置有10种选号方法。 A=10 B=10 C=10 D=A*B*C #D是全部组合数 P=1/D #P是每组号码的概率 print(’三位数字ABC每组号码的概率:', round(P,3))
程序运行结果:
三位数字ABC每组号码的概率:0.001
示例3-25:有一个五位的数字,数字从0~9中随机选取,不可重复取数,问五位数字的组合有多少种?
解题思路:从题意中可以看出,这是一个排列问题,我们可以直接使用排列公式进行计算。
排列P,从n个元素中取r个进行排列,排列有顺序。排列P的组合数为n! /(n-r)!,其中感叹号“!”表示阶乘。我们可以用math.factorial(x)函数来计算阶乘。程序代码如下:
import math P5=math.factorial(10)/math.factorial(10-5) #P5五位数字组合数 print(’五位数字的组合有’, int(P5), ’种。')
程序运行结果:
五位数字的组合有 30240 种。
示例3-26:福利双色球彩票有红球33个,蓝球16个,每注彩票号码由6个红球和1个蓝球构成,号码没有顺序,问所有双色球组合数是多少?
解题思路:这是一个组合问题,我们可以直接代入组合公式。组合C,从n个元素中取r个元素,不进行排列,组合数为C=n! /(r! *(n-r)!),程序如下:
import math R6=math.factorial(33)/(math.factorial(6)*math.factorial(33-6)) #红球组合数 B1=16 #蓝球取法16选1 C=R6*B1 print(’所有双色球组合数是’, int(C), ’种。')
程序运行结果:
所有双色球组合数是 17721088 种。
5.随机函数
随机函数包括基本随机数函数和扩展随机数函数,需要使用Python标准库——random。
引入随机数库语句:
import random
查看随机数库帮助信息:
help(' random ')
random库中的函数见表3-13。
表3-13 random库中的函数
随机函数的用处很多,特别是在电子游戏和仿真领域。如果我们想实现一些功能,利用其他语言需要自己写程序,而利用Python语言就可以直接使用现成的函数。
示例3-27:用Python实现机选5注福利彩票双色球的号码。要想实现这一功能,其他编程语言需要写很多行代码,而Python只需要下面几行代码。
""" 模拟双色球开奖程序 """ import random print() rb=[x for x in range(1,34)] #建立一个1~33的数字列表rb lb=[x for x in range(1,17)] #建立一个1~16的数字列表lb random.seed() #初始化随机种子 print(’机选五注双色球彩票号码:') for i in range(5): #我们用Pyhton选5注号 random.shuffle(rb) #用函数random.shuffle打乱列表顺序 random.shuffle(lb) #用函数random.shuffle打乱列表顺序 hh=[rb[0], rb[1], rb[2], rb[3], rb[4], rb[5]] hh.sort() #对选中红号排序 print(hh[0], hh[1], hh[2], hh[3], hh[4], hh[5], ' + ', lb[0])
程序运行结果:
机选五注双色球彩票号码: 6 9 18 20 25 27 + 14 3 7 16 19 24 31 + 9 1 7 8 25 28 31 + 15 2 3 6 23 28 32 + 2 3 11 14 20 22 26 + 1
上面例子使用了列表数据类型。