【运算赋值 四则运算 浮点型数据 二进制 布尔运算 int函数】
今天,我们继续探究两个变量数据的互换的更多方法。
我们先来看一段代码,猜测一下:程序运行的结果是什么?
i=6j=9i=i+jprint("i=",i,"j=",j)
运行结果是:i=15 j=9
注意:要理解这句代码 i=i+j,代码是从左到右写的,但是理解的顺序却需要从右向左。这句代码的意思是将变量 i和变量j相加的和重新赋值于变量i。
上述代码运行的结果得出 i=15,j=9,那么,i-j=15-9=6 这个数据值6刚好是变量 i 的初始值,如果我们将i-j=6这个值重新赋予变量 j,不就实现了两个变量数据互换的一步吗?
这种想法是否正确?我们来写段代码尝试一下。
i=6j=9i=i+jj=i-j #你能看出程序代码中变量i和变量j的变化与不变化吗?print("i=",i,"j=",j)
运行的结果是:i= 15 j= 6,看到没有:变量j的初始值是9,现在变量 j 的数据值已经变成变量i的初始值了,变量i的数据已经换到变量 j 了。
现在剩下的一步,便是将变量 i 的值换成9。你是否已经有了想法了?
i=6j=9i=i+jj=i-ji=i-jprint("i=",i,"j=",j)
运行结果如何?i=9 j=6 成功实现了两个变量的数据交换。这种数据交换方式只能在变量是数值的情况下实现。如果变量中的数据类型是字符串,这种方法就只能作罢。
我们是不是可以在这个思路上拓展一下呢?比如我们不用两个变量之和,而是借助两个变量之积呢?
大胆尝试:
i=6j=9i=i*jj=i/ji=i/jprint("i=",i,"j=",j)
运行的结果是:i=9.0 j=6.0 为什么数值会有了小数的精确位?原来Python变量的数据类型中的数值包括int(整型)和float(浮点型)等类型。在Python中小数采用浮点数类型。
什么是浮点数float?
说得直白一点浮点数就是有小数点的数,比如:0.21、3.989……
电脑在处理浮点数的时候,却不是百分之百的精确。
我们都知道:0.1+0.2=0.3,但是如果在python程序中编写这段代码:
0.1+0.2==0.3 # 注意:==表示等于,=只表示赋值
运行这段代码,结果显示:False
0.1+0.2难道不等于0.3吗?不等于0.3,等于多少呢?我们用python来计算一下0.1+0.2,代码如下:
print(0.1+0.2)
运行的结果是:0.30000000000000004
为什么0.1+0.2在python程序里不等于0.3,却等于0.30000000000000004呢?后面的0.00000000000000004是怎么回事呢?
原来这是因为电脑程序在进行数值运算时,首先会将十进制的数值转换成二进制数值,再进行计算,而小数转换成二进制时会出现误差!
那就让我们来看看二进制吧:
二进制是满二进一位的一种计数进制,是和满十进一位的十进制不同的计数进制。
十进制和二进制的数是如何转换的呢?我们今天探究一下十进制数转换成二进制数。
先探究十进制整数转换成二进制。整数转换二进制数就是不断除以2。
再探究十进制小数转换成二进制。小数转换二进制就是不断乘以2。
十进制的0.1转换成二进制,成了二进制的无限循环小数了。电脑不能存储无限循环小数,只能存储一个近似的值,这就是小数在程序的运算中不能精确的原因。
好吧,有兴趣可以算一下十进制0.2、0.3转换成二进制数是怎样的。
难道十进制的小数转换成二进制数,都变成了无限循环小数吗?不,不是的,也有例外的,也有一些十进制的小数会转换成二进制的有限小数。十进制的0.5转换成二进制数就是0.1,十进制的0.25转换成二进制就是0.01,十进制的0.75转换成二进制数就是0.11
下列程序代码运行的结果,你是否猜到?
0.5+0.25==0.75
运行结果:True
True和False是程序运算的两个布尔值。关于布尔值运算后续再探讨。
转了一大圈,还是回到原题吧。如果我们需要最终结果还是整型数据输出,我们可以使用
int函数
,对变量的数据类型进行转换。
i=6j=9i=i*jj=i/ji=i/jprint("i=",int(i),"j=",int(j))
int(i) 将变量 i 的数据转换成整型数据;int(j) 将变量 j 的数据转换成整型数据。运行结果相当完美!i=9 j=6 两个变量数据成功互换。
两个变量数据互换,还可以用Python的位运算来实现。
什么是位运算?如何来实现呢?且听下回分解。