【测试开发学习历程】Python其他数据类型 + 数据类型总结

目录

1 range序列

2 布尔型bool

3 特殊类型-NoneType

4 数据类型总结

4.1 容器数据类型

4.2 可变和不可变类型

4.3 可迭代和不可迭代的类型

4.4 有序的和无序的类型(针对容器类型来讲的)

4.5 值类型和引用类型

4.5.1 值类型

4.5.2 引用类型


1 range序列

range是不可变的序列,元素为int类型,通常和for循环结合起来使用

格式 :range(起始值=0,终止值,步长=1),表示以指定的步长从起始值取到终止值-1,取值为左闭右开规则

  • 如果只传一个值,则表示终止值:range(3)

  • 如果传两个值,则表示,起始和终止值:range(1,3)

  • 如果传三个值,则表示起始,终止值和步长:range(1,10,2)

举例:

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#770088">for</span> <span style="color:#000000">i</span> <span style="color:#770088">in</span> <span style="color:#3300aa">range</span>(<span style="color:#116644">5</span>):
    <span style="color:#3300aa">print</span>(<span style="color:#000000">i</span>)   <span style="color:#aa5500"># i从0取到4</span>
    
<span style="color:#770088">for</span> <span style="color:#000000">i</span> <span style="color:#770088">in</span> <span style="color:#3300aa">range</span>(<span style="color:#116644">1</span>,<span style="color:#116644">5</span>):
    <span style="color:#3300aa">print</span>(<span style="color:#000000">i</span>)    <span style="color:#aa5500"># i从1取到4</span>
    
<span style="color:#770088">for</span> <span style="color:#000000">i</span> <span style="color:#770088">in</span> <span style="color:#3300aa">range</span>(<span style="color:#116644">1</span>,<span style="color:#116644">5</span>,<span style="color:#116644">2</span>):
    <span style="color:#3300aa">print</span>(<span style="color:#000000">i</span>)    <span style="color:#aa5500"># i取1,3</span></span></span>

可以使用list()传入一个range序列,来生成一个整数列表。

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#aa5500"># 生成一个列表,列表中的元素是0到10的整数</span>
<span style="color:#000000">list1</span>=<span style="color:#3300aa">list</span>(<span style="color:#3300aa">range</span>(<span style="color:#116644">11</span>))
<span style="color:#3300aa">print</span>(<span style="color:#000000">list1</span>)</span></span>

2 布尔型bool

  • 布尔型bool:布尔型只有两个结果即True和False,分别表示真和假,一般用在条件判断中。

  • 在Python中,布尔型跟数值型参与运算时,True相当于1,False相当于0。

  • 可以用实例化bool类的对象把一个对象转成布尔值,在Python中,空字符串、空列表、空元组、空字典、空集合都被当做是False;非空即True。

    <span style="background-color:#f8f8f8"><span style="color:#000000">a</span>=<span style="color:#770088">True</span>
    <span style="color:#3300aa">print</span>(<span style="color:#3300aa">type</span>(<span style="color:#000000">a</span>))
    <span style="color:#3300aa">print</span>(<span style="color:#000000">a</span><span style="color:#981a1a">+</span><span style="color:#116644">5</span>)
    <span style="color:#3300aa">print</span>(<span style="color:#770088">False</span><span style="color:#981a1a">*</span><span style="color:#116644">100</span>)
    <span style="color:#3300aa">print</span>(<span style="color:#3300aa">bool</span>(<span style="color:#116644">111</span>))                <span style="color:#aa5500">#True</span>
    <span style="color:#3300aa">print</span>(<span style="color:#3300aa">bool</span>(<span style="color:#aa1111">"fff"</span>))              <span style="color:#aa5500">#True</span>
    <span style="color:#3300aa">print</span>(<span style="color:#3300aa">bool</span>([<span style="color:#116644">1</span>,<span style="color:#116644">2</span>,<span style="color:#116644">4</span>]))            <span style="color:#aa5500">#True</span>
    <span style="color:#3300aa">print</span>(<span style="color:#3300aa">bool</span>(<span style="color:#116644">3</span>,))                 <span style="color:#aa5500">#True</span>
    <span style="color:#3300aa">print</span>(<span style="color:#3300aa">bool</span>({<span style="color:#aa1111">"A"</span>:<span style="color:#116644">1</span>}))            <span style="color:#aa5500">#True</span>
    <span style="color:#3300aa">print</span>(<span style="color:#3300aa">bool</span>({<span style="color:#116644">3</span>,<span style="color:#aa1111">'a'</span>}))            <span style="color:#aa5500">#True</span>
    <span style="color:#3300aa">print</span>(<span style="color:#3300aa">bool</span>(<span style="color:#aa1111">""</span>))                 <span style="color:#aa5500">#False</span>
    <span style="color:#3300aa">print</span>(<span style="color:#3300aa">bool</span>([]))                 <span style="color:#aa5500">#False</span>
    <span style="color:#3300aa">print</span>(<span style="color:#3300aa">bool</span>(()))                 <span style="color:#aa5500">#False</span>
    <span style="color:#3300aa">print</span>(<span style="color:#3300aa">bool</span>({}))                 <span style="color:#aa5500">#False</span>
    <span style="color:#3300aa">print</span>(<span style="color:#3300aa">bool</span>(<span style="color:#3300aa">set</span>()))              <span style="color:#aa5500">#False</span>
    <span style="color:#3300aa">print</span>(<span style="color:#3300aa">type</span>({}))
    <span style="color:#3300aa">print</span>(<span style="color:#3300aa">type</span>(<span style="color:#3300aa">set</span>()))</span>

3 特殊类型-NoneType

None是python中的一个特殊的常量,表示一个空的对象,在函数没有返回值的时候,输出函数的执行结果得到的就是None。None对应的数据类型是 NoneType。

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#3300aa">print</span>(<span style="color:#3300aa">type</span>(<span style="color:#770088">None</span>))
<span style="color:#000000">list1</span>=[<span style="color:#aa1111">"nihao"</span>,<span style="color:#116644">2</span>,<span style="color:#116644">3</span>]
<span style="color:#3300aa">print</span>(<span style="color:#000000">list1</span>.<span style="color:#000000">remove</span>(<span style="color:#116644">2</span>)) <span style="color:#aa5500">#删除函数,这个只是删除数据没有返回数据,所以打印的是None</span></span></span>

关于None的几点说明:

  1. 数据为空不代表空对象,例如空字符串、空列表等都不是None;

  2. None不支持任何运算也没有任何内建方法;

  3. None与其他任何数据类型比较都返回False;

  4. None有自己的数据类型NoneType,不能创建其他NoneType对象(它只有一个值None);

  5. null为java里的空,和Python中的None类似;

  6. 在后面使用 的JSON数据中,使用 null表示值为空,转成Python对象 ,对应的就是None;

  7. 可以将None赋值给任何变量,也可以给None值变量赋值。

举例:

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#aa5500"># None没有长度,所以报TypeError: object of type 'NoneType' has no len()</span>
<span style="color:#3300aa">print</span>(<span style="color:#3300aa">len</span>(<span style="color:#770088">None</span>))
<span style="color:#aa5500"># 空字符串的长度为0</span>
<span style="color:#3300aa">print</span>(<span style="color:#3300aa">len</span>(<span style="color:#aa1111">""</span>))
​
<span style="color:#770088">if</span> <span style="color:#116644">0</span> <span style="color:#770088">and</span> <span style="color:#770088">None</span>:
    <span style="color:#3300aa">print</span>(<span style="color:#116644">1</span>)
<span style="color:#770088">else</span>:
    <span style="color:#3300aa">print</span>(<span style="color:#116644">2</span>)
<span style="color:#3300aa">print</span>(<span style="color:#aa1111">""</span> == <span style="color:#770088">None</span>)</span></span>

4 数据类型总结

4.1 容器数据类型

Python中,可包含其他对象的对象,称之为“容器”。前面讲的数据类型中,如下对象属于容器类型:

  • 字符串str

  • 列表list

  • 元组tuple

  • 集合set

  • 字典dict

int,float,bool为非容器类型。

4.2 可变和不可变类型

所谓可变对象,是指对象的内容是可变的,比如修改对象的内存时对象的内存地址不改变,例如 list。而不可变的对象则相反,当改变它的内容时对象的内存地址也会改变。一句话总结:可变就是值变地址不变。

  • 可变数据类型:List(列表)、Dictionary(字典)、Set(集合)

  • 不可变数据类型:Number(数字)、String(字符串)、Tuple(元组)

举例:

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#000000">num1</span>=<span style="color:#116644">100</span>
<span style="color:#3300aa">print</span>(<span style="color:#3300aa">id</span>(<span style="color:#000000">num1</span>))
<span style="color:#000000">num1</span>=<span style="color:#116644">101</span>
<span style="color:#3300aa">print</span>(<span style="color:#3300aa">id</span>(<span style="color:#000000">num1</span>))
<span style="color:#000000">list1</span>=[<span style="color:#116644">1</span>,<span style="color:#116644">2</span>]
<span style="color:#3300aa">print</span>(<span style="color:#3300aa">id</span>(<span style="color:#000000">list1</span>))
<span style="color:#000000">list1</span>.<span style="color:#000000">append</span>(<span style="color:#116644">3</span>)
<span style="color:#3300aa">print</span>(<span style="color:#000000">list1</span>)
<span style="color:#3300aa">print</span>(<span style="color:#3300aa">id</span>(<span style="color:#000000">list1</span>))</span></span>

4.3 可迭代和不可迭代的类型

  • 可迭代即可以重复的取出数据,存在__iter__()方法的,就是可迭代的对象

    • 可迭代:List(列表)、Dictionary(字典)、Set(集合)、String(字符串)、Tuple(元组)

    • 不可迭代:Number(数字)、bool(布尔类型)

  • 举例:

    <span style="background-color:#f8f8f8"><span style="color:#aa5500">#数据类型,后面能有__iter__()方法,就是可迭代的</span>
    [].<span style="color:#000000">__iter__</span>()
    <span style="color:#aa1111">""</span>.<span style="color:#000000">__iter__</span>()
    {<span style="color:#116644">2</span>,<span style="color:#116644">1</span>}.<span style="color:#000000">__iter__</span>()
    {<span style="color:#aa1111">"name"</span>:<span style="color:#aa1111">"小明"</span>,<span style="color:#aa1111">"age"</span>:<span style="color:#116644">18</span>}.<span style="color:#000000">__iter__</span>()</span>

4.4 有序的和无序的类型(针对容器类型来讲的)

有序:List(列表)、String(字符串)、Tuple(元组)、Dict(字典)

无序:Set(集合)

字典在3.6之前的版本是无序的,从3.6版本开始,字典是有序的,字典的顺序就是元素存入的顺序。

4.5 值类型和引用类型

Python数据类型分为值类型和引用类型, 下面我们看下它们的区别:

  • 值类型:int、float、str、tuple,本身不允许被修改

  • 引用类型:list、set、dict,本身允许被修改

4.5.1 值类型

值类型本身不允许被修改,也就是不可变,数值的修改实际上是让变量指向了一个新的对象,所以不会产生共享内存的问题。

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#000000">number1</span> = <span style="color:#116644">11</span>
<span style="color:#3300aa">print</span>(<span style="color:#3300aa">id</span>(<span style="color:#000000">number1</span>))
<span style="color:#000000">number1</span>=<span style="color:#116644">12</span>
<span style="color:#3300aa">print</span>(<span style="color:#3300aa">id</span>(<span style="color:#000000">number1</span>))
​
<span style="color:#aa5500"># 输出结果</span>
<span style="color:#116644">140709030057064</span> <span style="color:#116644">140709030057096</span></span></span>

以上的例子说明,当number1的值为11时,指向的是内存地址140709030057064,当修改了number1的值后,指向的是另外一个内存地址140709030057096。修改值类型的值,只是让它指向一个新的内存地址,并不会改变变量的值。

对驻留机制的理解?

来看下面一个例子:

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#aa5500"># int类型的驻留</span>
<span style="color:#000000">number1</span> = <span style="color:#116644">11</span>
<span style="color:#000000">number2</span> = <span style="color:#000000">number1</span>
<span style="color:#3300aa">print</span>(<span style="color:#3300aa">id</span>(<span style="color:#000000">number1</span>), <span style="color:#3300aa">id</span>(<span style="color:#000000">number2</span>))
​
<span style="color:#aa5500"># str类型的驻留</span>
<span style="color:#000000">str1</span> = <span style="color:#aa1111">"helloworld"</span>
<span style="color:#000000">str2</span> = <span style="color:#aa1111">"helloworld"</span>
<span style="color:#3300aa">print</span>(<span style="color:#3300aa">id</span>(<span style="color:#000000">str1</span>), <span style="color:#3300aa">id</span>(<span style="color:#000000">str2</span>))
​
<span style="color:#aa5500"># 输出结果</span>
<span style="color:#116644">140724772394088</span>     <span style="color:#116644">140724772394088</span>
<span style="color:#116644">1303019672240</span>       <span style="color:#116644">1303019672240</span></span></span>

Python的暂存区:

  1. Python在底层做了一定的优化,对于使用过小整数以及短字符串都会被缓存起来

  2. 之所以采用这种优化的方式,是因为python中数字和字符串一经创建都是不可修改的。所以不会出现,因使用了缓存的对象值造成“脏读”的问题。

上述中多个具有相同值的变量共享了内存地址,这是Cpython里面一个优化策略,叫驻留(interning)。CPython 还会在小的整数上使用这个优化措施,防止重复的创建”热门“数字,比如0,-1,42等等,但是CPython不会驻留所有的字符串和整数。

事实上Python 为了优化速度,使用了小整数对象池,避免为整数频繁申请和销毁内存空间。而Python 对小整数的定义是 [-5, 257),只有数字在-5到256之间它们的id才会相等,超过了这个范围就不行了。同样的道理,字符串对象也有一个类似的缓冲池,超过区间范围内自然不会相等了。

总的来说,只有数值型和字符串型,并且在通用对象池中的情况下,a is b才为True,否则当a和b是int,str,tuple,list,dict或set型时,a is b均为False。

4.5.2 引用类型

引用类型本身是运行被修改的,也就是可变的,允许同一对象的值发生变化,但地址不变。但是需要注意一点,对可变数据类型的操作不能是直接进行新的赋值操作,比如说a = [1, 2, 3, 4, 5, 6, 7],这样的操作就不是改变值了,而是新建了一个新的对象,这里的可变只是对于类似于append、+=等这种操作。

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#000000">list1</span> = [<span style="color:#116644">1</span>]
<span style="color:#000000">list2</span> = <span style="color:#000000">list1</span>
<span style="color:#3300aa">print</span>(<span style="color:#3300aa">id</span>(<span style="color:#000000">list1</span>), <span style="color:#3300aa">id</span>(<span style="color:#000000">list2</span>))
<span style="color:#000000">list1</span>.<span style="color:#000000">append</span>(<span style="color:#116644">2</span>)
<span style="color:#3300aa">print</span>(<span style="color:#000000">list1</span>, <span style="color:#000000">list2</span>)
<span style="color:#3300aa">print</span>(<span style="color:#3300aa">id</span>(<span style="color:#000000">list1</span>), <span style="color:#3300aa">id</span>(<span style="color:#000000">list2</span>))
​
<span style="color:#aa5500"># 输出结果</span>
<span style="color:#116644">2815182132416</span> <span style="color:#116644">2815182132416</span>
[<span style="color:#116644">1</span>, <span style="color:#116644">2</span>] [<span style="color:#116644">1</span>, <span style="color:#116644">2</span>]
<span style="color:#116644">2815182132416</span> <span style="color:#116644">2815182132416</span></span></span>

思考:在这个例子中,如果既要实现list2复制list1的值,又要在list1的值发生改变后不影响list2,怎么实现呢?

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#000000">list1</span> = [<span style="color:#116644">1</span>]
<span style="color:#000000">list2</span> = <span style="color:#000000">list1</span>.<span style="color:#000000">copy</span>()
<span style="color:#3300aa">print</span>(<span style="color:#3300aa">id</span>(<span style="color:#000000">list1</span>), <span style="color:#3300aa">id</span>(<span style="color:#000000">list2</span>))
<span style="color:#000000">list1</span>.<span style="color:#000000">append</span>(<span style="color:#116644">2</span>)
<span style="color:#3300aa">print</span>(<span style="color:#000000">list1</span>, <span style="color:#000000">list2</span>)
<span style="color:#3300aa">print</span>(<span style="color:#3300aa">id</span>(<span style="color:#000000">list1</span>), <span style="color:#3300aa">id</span>(<span style="color:#000000">list2</span>))
​
<span style="color:#aa5500"># 输出结果</span>
<span style="color:#116644">1303022457536</span>   <span style="color:#116644">1303022457408</span>
[<span style="color:#116644">1</span>, <span style="color:#116644">2</span>]          [<span style="color:#116644">1</span>]
<span style="color:#116644">1303022457536</span>   <span style="color:#116644">1303022457408</span></span></span>

赋值(=)和复制的区别:

  1. 赋值(=)相当于把list1的地址赋值给list2,list1和list2指向同一个列表

  2. 复制(copy方法)相当于把list1完全复制一遍放在一个新的内存地址中,你可以对复制后的东西任意操作而不会影响原对象

相关推荐

  1. 测试开发学习历程Python数据类型:list

    2024-04-05 14:26:04       37 阅读
  2. PostgreSQL数据类型总结

    2024-04-05 14:26:04       24 阅读
  3. python——数据类型

    2024-04-05 14:26:04       65 阅读
  4. Python 数据类型 (2)

    2024-04-05 14:26:04       50 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-05 14:26:04       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-05 14:26:04       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-05 14:26:04       87 阅读
  4. Python语言-面向对象

    2024-04-05 14:26:04       96 阅读

热门阅读

  1. 什么是深度学习

    2024-04-05 14:26:04       34 阅读
  2. 实验6-1 近似求PI

    2024-04-05 14:26:04       34 阅读
  3. 【Python第三方库】lxml 解析器和xpath路径语言

    2024-04-05 14:26:04       41 阅读
  4. 多线程(31)StampedLock和ReadWriteLock

    2024-04-05 14:26:04       38 阅读
  5. MySQL【查询】

    2024-04-05 14:26:04       37 阅读
  6. Large Language Model Agent for Hyper-Parameter Optimization

    2024-04-05 14:26:04       35 阅读
  7. unblock with ‘mysqladmin flush-hosts‘ 解决方法

    2024-04-05 14:26:04       28 阅读
  8. 6、Linux分区挂载

    2024-04-05 14:26:04       36 阅读
  9. mysql 从同一个表获取数据update自身报错一例

    2024-04-05 14:26:04       37 阅读
  10. 2024/4/4 HarmonyOS学习笔记-UIAbility应用程序入口

    2024-04-05 14:26:04       35 阅读
  11. 《CSS入门到精通》结语

    2024-04-05 14:26:04       33 阅读
  12. 回文素数----函数

    2024-04-05 14:26:04       31 阅读
  13. Qt模拟面试(超硬核)

    2024-04-05 14:26:04       28 阅读