Python自学教程8-数据类型有哪些注意事项

不知不觉,python自学教程已经更新到第八篇了,再有几篇,基本的语法就介绍完了。 今天来总结一下数据类型有哪些需要注意的地方。

元组注意事项

元组是另一种经常使用到的数据类型,看上去和列表差不多。它们之间的区别在于列表是一个可变的数据类型,而元组是不可变的。

<br>a&#xA0;=&#xA0;(<span class="hljs-number">1</span>,&#xA0;<span class="hljs-number">2</span>)<br><br>a&#xA0;=&#xA0;[<span class="hljs-number">1</span>,&#xA0;<span class="hljs-number">2</span>]

使用列表会更灵活,而元组支持的操作更少,有的人会认为没有必要用元组,直接用列表就可以了。

但正因为元组不可变,限制了功能,从效率上来讲它会更加快一些,而且,当你不想让用户去修改这个数据的时候,用元组会更合适,数据相对来说更加安全,不容易出bug。

使用元组的时候一定要记得在元素的后面加逗号,当一个元组只有一个元素的时候,后面不打逗号,是不能表示成元组的,而是元素本身的类型。

a&#xA0;=&#xA0;(<span class="hljs-number">1</span>)&#xA0;&#xA0;<br>a&#xA0;=&#xA0;(<span class="hljs-number">1</span>,)&#xA0;

浮点数注意事项

在编程语言当中,浮点数的精度往往不能达到完全的精确,这会给我们编程带来一些问题,甚至呢可能带来很大的bug。比如说我们现在计算一个很简单的小数点的运算,0.1+0.2,大家可以先回答一下这个应该等于多少呢?

print(<span class="hljs-number">0.1</span>&#xA0;+&#xA0;<span class="hljs-number">0.2</span>)

很明显这是一个小学的数学题,但是呢,当我们交给Python去运算的话呢,我们得到结果并不是等于0.3而是等于

0.30000000000000004

这是计算机在表示十进制小数的时候会出现误差。

从直观的感受上看,这种精度好像造成不了太大的影响。但是,在对数据要求非常严格的情况下,这种误差会引发打的问题,尤其是在做测试的时候,如果你你的预期结果和实际结果都不相等,那么你测试用例肯定是不会通过的。

在操作银行、证券这类金融业务时,涉及到支付和钱的时候一定要有非常严格的精度控制。 此时,可以使用 decimal 模块来保持高精度,我们把需要操作的浮点数先转换成字符串,再作为参数传给 Decimal 类。

<span class="hljs-keyword">from</span>&#xA0;decimal&#xA0;<span class="hljs-keyword">import</span>&#xA0;Decimal<br>print(Decimal(<span class="hljs-string">"0.1"</span>)&#xA0;+&#xA0;Decimal(<span class="hljs-string">"0.2"</span>))<br>

除法注意事项

在进行除法运算的时候,一定要牢记:被除数是不能等于0的。

当你把0作为一个被除数的时候,程序是会报错的。

print(<span class="hljs-number">3</span>&#xA0;/&#xA0;<span class="hljs-number">0</span>)

列表注意事项

面试题当中列表问题出现的概率应该有80%以上,因为列表的操作非常频繁,而且比较容易出错,现在我们就来看一个经典问题:删除列表元素。

有一个列表如下,请删除列表当中的每一个元素,但是不能直接用clear方法。

names&#xA0;=&#xA0;[<span class="hljs-string">"&#x4E5D;&#x67C4;"</span>,&#xA0;<span class="hljs-string">"&#x516B;&#x67C4;"</span>,&#xA0;<span class="hljs-string">"&#x4E03;&#x67C4;"</span>,<span class="hljs-string">"&#x516D;&#x67C4;"</span>,<span class="hljs-string">"&#x4E94;&#x67C4;"</span>]

按照条件反射,我们一般会写一个 for 循环,然后依次执行remove方法或者 pop 方法来删除元素。但是这样得到的结果是不对的,总有几个元素删除不掉。

<span class="hljs-keyword">for</span>&#xA0;name&#xA0;<span class="hljs-keyword">in</span>&#xA0;names:<br>&#xA0;&#xA0;&#xA0;&#xA0;names.remove(name)<br>print(names)<br>

为什么会删不干净呢?最核心的原因是:删除掉一个元素之后,这个列表发生了变化。

第1次,我们取到的元素是索引为0的 “九柄”, 它被删掉了之后, 接下来去取索引为 1 的元素,因为”九柄” 已经被删除,所以索引为0的元素已经被替换成 “八柄”, 索引为1 的元素则为”七柄”, 七柄被删,八柄跳过去了,没有被删除。

然后,取索引为 2 的数据,为 “五柄”, “六柄” 又被跳过了,从而造成删除不干净的情况。

从这个例子当中我们得出一个结论,不要在for循环当中去修改列表删除列表或者增加元素,这样非常容易出 bug。那上面的问题如果我们想解决怎么办呢?在我们去操作一个列表的时候,我们最好是做一个备份,不直接去修改原来的列表。

<span class="hljs-keyword">for</span>&#xA0;name&#xA0;<span class="hljs-keyword">in</span>&#xA0;names[:]:<br>&#xA0;&#xA0;&#xA0;&#xA0;names.remove(name)<br>print(names)

可变类型和不可变类型

实际上大多数的可变类型虽然增加了灵活性,有更多的操作,但是更容易出bug。在我个人的编程过程当中,我会尽量使用不可变类型。

为了区分可变类型和不可变也行,我们举几个例子。

a = [1, 2, ("a", "b")]

此时,a 是列表,是可变类型,可以任意添加、修改其中的元素,比如把索引2的元素换成 c

a[<span class="hljs-number">2</span>]&#xA0;=&#xA0;<span class="hljs-string">"c"</span><br>

但是,不能改 ("a", "b") 当中的元素,因为它是个元组。

a[2][0] = "c"  # &#x62A5;&#x9519;

总的来说数据类型是难度比较低的内容,只有很多方法比较难记。在开始学Python的时候,可以从数据类型入手,这样比较容易增加信心,只要稍微努力一点,多记一些相关的方法,可以迅速上手写代码。

Original: https://www.cnblogs.com/heniu/p/16630871.html
Author: 和牛
Title: Python自学教程8-数据类型有哪些注意事项

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/809437/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球