08.“5.4-2为什么不等于3.4?”-数据类型(一)

青少年、零基础、初学者Python编程从入门到精通,“老马带小马 一块学Python”编程系列。

变量
想象一个场景,进超市购物前,若要寄存个人物品的话,一般分三步:

  1. 给工作人员您的物品;
  2. 工作人员把物品放入到存放到寄存柜子的一个格子中;
  3. 给你一个代表这个格子的寄存牌。
x = 8

如上所示,很简单的一个赋值语句,用于给x这个变量赋值为8,等号左边是被赋值的变量,右边是即将存储在这个变量里的数值。通过与超市寄存物品相类比,在这里我们对上面这句代码做一个详细的分析说明:

  • 一个新的变量,必须在使用前被赋值,只有赋值了,该变量才会在内存中被创建,CPU才能对这个变量进行读取或者更改,要不然,程序就会报错,例如,“NameError: name ‘a’ is not defined”,这句话的英文直译是:“a这个名字没有被定义”,用更通俗的话来讲,就是:“a是个啥啊,您得先对它赋值吧!”。就如同超市寄存物品一样,没有寄存物品前,工作人员不会无缘无故给您分配一个存储格,更不会给你一个寄存牌,要是您拿来一个冒牌寄存牌,同样工作人员就会说:“我们这没有这种叫a的寄存牌啊,您弄错了吧!”
  • 一个变量可以根据需要被赋值成不同的数据类型,这也是Python语言的灵活性体现之一,如下所示:
x = 8
x = 8.8
x = "8.8"

第一句我们给x赋值成了整数、第二句给它赋值成了小数、第三句我们给它赋值成了字符串,对于各种不同数据类型,我们会陆续给大家一一讲解。总之,就如同超市的寄存柜一样,存储格里根据需要,啥东西都能放,很灵活、很方便。

  • 个人物品从寄存柜中取走并不再使用时,寄存牌就要被收走了。同样,要是某个变量我们不想用了,我们也可以注销或者说删除掉,如下所示:
x = 9
del x

需要注意的是,删除后的变量就不能被使用了,要不然,就会报上述提到的同样的错误,若要想x继续被使用,必须对x重新赋值。在日常实际Python编程过程中,其实我们很少操心对变量的删除清理,除非对于耗内存比较大的变量,一方面,咱们现在电脑的内存都比较大,小的变量对内存的临时占用都不是事,而且在程序退出时,就自动全部释放了,另外更为关键的是,Python在背后为我们做了很多默默无闻的工作,它会自动识别不再被使用的变量,并定时进行清理,大大减轻了我们对这些细节处理的负担。

  • 批量赋值、批量删除的技巧,如下所示:
x,y=1,2
del x,y

第1句,在一行代码里可以对多个变量分别赋值,需要注意的是左右两边变量与值的对应顺序,中间用英文逗号(注意不要写成中文逗号了)隔开。
第2句,在一行代码里一次性删除多个变量,同样,变量间要用英文逗号隔开。

数字类型
先谈谈最重要的两个数字类型:整型及浮点型。

  • 整型(int),即整数,比如0、9、-100等都属于整型。
  • 浮点型(float),即小数,比如0.0、-99.9、3.14以及科学计数法1.5e2(即1.5乘以10的2次方)都属于浮点型。
x = -10
y = -3.14
z = "10"

如上所示,x被赋值为整型,y被赋值成了浮点型,x和y都统属于数字类型,而z则不属数字类型,属于字符串类型,后面章节我们会进一步讲解,字符串类型需要采用单引号或者双引号引起来,而数字类型则不需要。对于一个变量,我们如何辨别当前其被赋值的数据类型呢?Python提供了一个内置函数type,可以很方便的供我们调用识别。

x=88
print(type(x))
print(type(x)==int)
y=8.8
print(type(y))
print(type(y)==float)

上述代码的输出结果如下所示:

<class 'int'>
True
<class 'float'>
True

简单解释一下,前面第2行及第5行代码,分别调用type函数(传入要识别的变量),然后把函数返回的结果采用print打印输出;上述第3行及第6行代码,则把type函数返回的结果分别与int、float进行比较(“==”,即双等于,在上一节提到过,表示比较,若左右两侧的值相等则表达式返回True,否则返回False),然后把比较的结果采用print打印输出。

数值运算
如下所示,第1、2行为加法运算,第3、4行为减法运算,第5、6行为乘法运算,第7、8行为除法运算。需要说明的是:

  • 对于加法、减法、乘法运算,或者只存在这三种运算的混合运算,若参与运算的数字全部为整型,则结果一定为整型,表达式中只要有一个浮点型数值存在,结果则必然为浮点型。
  • 对于除法运算,无论参与的数字是否为整型、无论是否能够除尽,最终的结果一定为浮点型。
a1=1+2
a2=1+2.0
b1=5-2
b2=5.4-2
c1=2*4
c2=2*4.1
d1=8/4
d2=8.4/4
print(a1,a2,b1,b2,c1,c2,d1,d2)

输出的结果如下所示:

3 3.0 3 3.4000000000000004 8 8.2 2.0 2.1

对于上述结果,大家一定很奇怪b2的输出怎么变成了“3.4000000000000004”呢,是电脑出问题了吗?别紧张,两个因素导致的,大家只要大致了解一下就行,不用深究:

  • 一方面,我们在日常生活中及上述编程过程中,采用的都是十进制数,而计算机采用的是二进制数,在浮点型数字转换过程中,会存在着导致循环小数的出现;
  • 另一方面,浮点数在计算机中存储及计算时,其精度或者说有效位是有限的,超出精度之外的小数会被截断或者说忽略了,必然导致准确度损失。
    基于上述两方面原因,我们在比较两个浮点数时一定要非常谨慎,如下所示:
print(5.4-2 == 3.4)

在我个人计算机上的输出为:
False"
“5.4-2”与“3.4”竟然不相等!

那怎么办呢?我们需要给计算机一定的容忍空间,尤其对浮点数进行比较时,在不影响我们实际应用所要求的精度的基础之上,取有限的有效位进行比较。我们可以调用Python的内部函数round对浮点数进行四舍五入,如下所示:

x=round((5.4-2)-3.4 ,2)
print(x==0)

输出的结果为:
True
简单解释一下,上述第1行中的round函数有两个参数,第一个参数可以是一个表达式或者数字,第二个参数则表示对第一个参数的计算结果进行四舍五入后保留的小数点后的有效位数。通过“5.4-2”与“3.4”两者求差,舍弃因计算机的不精确带来的无效位、保留我们可以容忍的有效位,然后再与0进行比较,就解决了上述问题。

另外,再介绍几个常见的数值运算,如下所示:

x = 9 // 4
y = 9 % 4
z = 2 ** 3
print(x,y,z)

得到的结果为:2 1 8

  • 第1行,“//”叫“地板除”,不管操作数为何种数字类型,结果只取整数部分,舍去小数部分。
  • 第2行,“%”叫“取余”,所得的值为两个整数相除后的余数。
  • 第3行,两个乘号,代表乘方运算,这里计算2的3次方,结果为8。

再看一下混合运算,如下所示:

x = (32-(3+5)*2)/4
print(x)

得到的结果为:4.0
计算方法与数学中的混合运算类似,先算括号里面的、先乘除后加减、相同优先级的按从左到右的顺序计算,不同的是,在计算机编程的算术表达式中只使用小括号,且小括号可以多层嵌套。

一种特殊的数字类型:布尔类型(bool)
前面曾提到过布尔类型,只有两个值:True、False,一定要注意首字母大写,之所以把它们归到数字类型中,因为在Python中,True的值其实是1、False的值为0,他们甚至可以和数字直接进行加减运算。这里主要介绍一下布尔类型的and、or及not运算,如下所示:

x1=True and True
x2=True or False
x3=not False
x4=3>2 and 1<2
x5=3<2 or 1<2
x6=3>2 or 1>2
x7=not 1>2
x8=not True or True and False
x9=True and False
x10=not True
x11=False or False
print(x1,x2,x3,x4,x5,x6,x7)
print(x8,x9,x10,x11)

输出的结果为如下:

True True True True True True True
False False False False

即x1至x7都为True,x8至x11都为False。这里简单说明一下:

  • 对于x1,因为and左右都为True,所以最终表达式结果也为True;对于x2,因为or左右至少有一个为True,所以表达式结果也为True;对于x3,not逻辑运算符相当于求“非”,后面跟着False,相当于“非”False,当然返回True了;对于x9至x11,计算方法类似。
  • 对于x4至x7,需要提示一下的是:对于“<、<=、>、>=、==、!=”这些比较运算符,“and、or及not”这些逻辑运算符的优先级要低,所以先比较后逻辑。
  • 重点说明一下x8,not、and及or的优先级关系是这样的:not > and > or,因此先算or左侧,得到False,然后再算or右侧,得到False,因or左右都为False,最终结果因此为False。
    这里建议大家写复杂的算术表达式或者逻辑表达式的时候,要是拿不准运算符的优先级的话,同时也为了更直观,尽量采用小括号按实际运算需要,一层层的括起来,不容易出错,比如,对于上述x4,可以这样赋值:x4=(3>2) and (1<2)

数字类型转换
编程初学者最易犯的错误、也最令他们迷惑的就是:经常把输入的字符串进行相加,结果不是想要的结果,就困惑了,如下所示:

x = '1'+'2'
print(x,type(x))

结果为:12 <class ‘str’>
因为右侧的字符串与字符串相加,进行的是文字的拼接,而不是数值运算,得到的x的数据类型也是字符串类型(str),在后面字符串类型章节我们会进一步讲解。要想让他们能进行数值运算,该怎么办呢?应该先对他们进行类型转换,如下所示:

x = int('1')+int('2')
print(x,type(x))

结果为:3 <class ‘int’>
在上述代码中,把int直接作为函数调用,把字符串类型转换成了整数类型,同样,把float作为函数调用,可以把其他数据类型转换成浮点数,另外,上面曾提到,True、False可以直接当成数值使用,分别代表着1、0。我们来验证一下:

x = int('5') + int(5.6) + False
y = True + float('2.5')
print(x,y)

输出的结果为:10 3.5


青少年、零基础、初学者Python编程从入门到精通,请扫描关注“老马带小马 一块学Python”编程系列。
老马带小马 一块学Python
原文:08.“5.4-2为什么不等于3.4?”-数据类型(一)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值