Python - Data Type

Table of Contents

Python中的大部分对象,如列表、字典、 Numpy 数组都是可变对象,大多数用户定义的类型(类)也是可变的。可变对象中包含的对象和值是可以被修改的。但是有一些对象是不可变的,如字符串、元组。

标量

Python的标准库中有一个小的内建类型集合,用来处理数值、字符串、布尔值以及日期和时间。这类“单值”类型被称为标量。主要的标量类型有

  • int1
    • 前缀 0x 表示16进制整数。
    • 整数除法会把结果自动转型为浮点数。
    • 如果需要C风格的整数除法(去掉小数部分),可以使用整除操作符 //
  • float2
  • str
    • 可以使用单引号 ' 或双引号 " 写一个字符串字面值。
    • 字符串是Unicode字符的序列,是不可改变的。很多Python对象可以通过函数 str 转成字符串。
    • 对于单个字符,函数 ord 把字符转换为其对应的整数表示;函数 chr 把编码转换为对应的字符。
    • 对于含有换行的多行字符串,可以使用三个单引号( ''' )或三个双引号( """ )。
    • 反斜杠 \ 是转移符号,它用来指明特殊符号。可以在字符串前面加上前缀符号 r (raw的简写)避免对字符串转义。
    • 字符串对象有一个 format 方法,可以用来代替字符串中的格式化参数,并产生一个新的字符串。
    • 带有前缀符号 f (format的简写)的字符串被称之为 f-string 。如果其包含 {xxx} ,就会以对应的变量替换。
  • bool
    • 布尔值有两个: TrueFalse
    • 布尔运算符包括: andornot
  • None3
  • bytes
    • 字符串在内存中以Unicode表示,每个字符对应若干个字节。
    • 字符串在硬盘上存储或在网络上传输的时候,需要转换为以字节为单位的 bytes 类型。
    • 在Python中, bytes 类型的数据为以前缀 b 开头的单引号(如 b'xyz'b"xyz" )或双引号表示。
    • str 的方法 encode 可以将其编码为制定的 bytes
    • bytes 的方法 decode 可以将其转换为字符串( str )。
    • 当Python源代码中包含中文时,必须指定UTF-8编码保存。为了让Python解释器按照UTF-8编码读取Python程序代码,通常在源代码文件指定UTF-8编码。例如,文件开头为

      #!/usr/bin/env python
      # -*- coding: utf-8 -*-
      
  • 常量
    • 常量就是不能变的变量。在Python中,通常用全部大写的变量名来表示常量。

日期和时间

Python内建的 datetime 模块提供了 datetimedatetime 类型。

  • 对于 datetime 实例,可以分别使用 datetime 方法获取它的 datetime 对象。
  • strftime 方法可以将 datetime 转换为字符串。格式化说明见下表。
  • strptime 函数可以将字符串转换为 datetime 对象。
  • datetime.datetime 是不可变类型。
  • 两个不同的 datetime 对象可以产生一个 datetime.timedelta 对象。
类型 描述
%Y 四位数年份
%y 两位数年份
%m 两位数月份[01, 12]
%d 两位数的天数[01, 31]
%H 小时(24小时制)[00, 23]
%I 小时(12小时制)[01, 12]
%M 两位数分钟[00, 59]
%S
%w 星期[0, 6]
%U 一年中的第几个星期值(星期天是每周第一天)[00, 53]
%W 一年中的第几个星期值(星期一是每周第一天)[00, 53]
%z UTC时区偏移值
%F %Y-%m-%d的简写
%D %m/%d/%y的简写

元组

  • 元组是一种固定长度、不可变的Python对象序列。创建元组最简单的方法就是用逗号分隔序列值。
  • 元组可嵌套,通常需要用括号将值包起来。
  • 可以使用函数 tuple 将任意序列或迭代器转换为元组。
  • 元组可以通过中括号 [] 来索引(获取)元组的元素4
  • 可以使用 + 连接元组生成更长的元组。
  • 如果需要将元组表达式赋值给变量,Python会对等号右边的值进行拆包。即使是嵌套元组,也可以拆包。拆包的一个常用场景就是遍历元组或列表的序列。拆包过程中,带有 * 前缀的变量名可以匹配任意长度的位置参数列表。为了方便,可以使用下划线 _ 表示不想要的变量。
  • 方法 count 用于计算某个值在元组中出现的次数。

列表

  • 可以使用中括号 [] 或者 函数 list 来定义列表。后者常用于将迭代器或者生成器转化为列表。
  • 方法 append 用于将元素添加到列表的尾部。
  • 方法 insert 用于将元素插入到列表的指定位置。其计算量高于 append
  • 方法 pop 会将指定位置的元素移除并返回。
  • 方法 remove 移除第一个符合值要求的元素。
  • 方法 extend 向列表中添加多个元素。
  • 方法 sort 对列表进行内部排序。
  • 关键字 in 可以检查一个元素是否在列表中。其前可加关键字 not ,用于检查一个元素是否不在列表中。
  • 可以使用 + 连接列表生成更长的列表。该过程需要创建新的列表,并且还要复制对象。
  • 切片符号可以对大多数序列类型选取其子集,其基本形式为 [start: stop: step]
    • 所选取子集包含起始位置 start ,不包含结束位置 stop ,所以选取子集的数量为 stop - start
    • 索引可以为负值,意味着从序列的尾部进行索引。
    • startstopstep 均可省略,默认值分别为0,列表长度,1。

内建序列函数

  • 函数 enumerate 返回形如 (索引值, 元素值) 的元组的序列。
  • 函数 sorted 对序列排序并返回新的有序序列。
  • 函数 zip 将列表、元组或其他序列的元素配对,生成一个元组的列表并返回之。 zip 可以处理任意长度的序列,其生成的列表长度由最短的序列决定。
  • 函数 reversed 将序列的元素逆序排列。

字典

  • 字典即哈希表或关联数组,是键值对(二元组)的集合。其中,键值都是Python对象,而且键必须是不可变的对象。
  • 可以使用大括号 {} 创建字典,字典元素用逗号分隔,元素的键和值用冒号 : 分隔。
  • 就像列表和元组一样,可以访问、插入、或设置字典中的元素。
  • 关键字 in 可以用于检查字典中是否含有某个键。
  • 可以使用关键字 del 或 方法 pop 根据键删除字典元素。其中,后者返回对应的值。
  • 方法 keys 返回字典键的迭代器。
  • 方法 values 返回字典值的迭代器。
  • 方法 update 用于合并或更新字典。
  • 方法 hash 可以检查一个对象是否可以哈希化,也即是否可以用作字典的键。
  • 方法 get 可以返回一个默认值。也即
VALUE = SOME_DICT.get(KEY, DEFAULT_VALUE)

等价于

if KEY in SOME_DICT:
    VALUE = SOME_DICT[KEY]
else:
    VALUE = DEFAULT_VALUE

集合

  • 集合是一种无序且元素唯一的容器。其元素必须是不可变的。
  • 可以使用大括号 {} 或者方法 set 创建集合。
  • 方法 union 或二元操作符 | 可以获得集合的并集。
  • 方法 intersection 或二元操作符 & 可以获得集合的交集。

推导式

  • 列表的推导式

    LIST = [EXPRESSION for VALUE in COLLECTION if CONDITION]
    

    其等价于

    LIST = []
    for VALUE in COLLECTION:
        if CONDITION:
            LIST.append(EXPRESSION)
    

    其中, CONDITION 可以省略。

  • 字典的推导式

    DICTIONARY = {KEY: VALUE for VALUE in COLLECTION if CONDITION}
    
  • 集合的推导式

    SET = {EXPRESSION for VALUE in COLLECTION if CONDITION}
    

对象

Python中的类由关键字 class 定义,对象是类的实例化。

迭代器(iterator)

  • 对于Python中的对象,只要定义了成员函数 __iter____getitem__ ,那么该对象就是可迭代的(iterable)。可迭代的对象能够通过迭代器遍历。
  • 迭代器指定义了成员函数 __next__ 的Python对象。

生成器(generator)

  • 生成器是一种特殊的迭代器,只能迭代一次。
  • 生成器不会把可迭代的对象全部放在内存中5,而是边迭代边生成。
  • 创建生成器
    • 推导式,如 g = f(x) for x in range(10)
    • 在自定义函数中添加 yield 关键字。

Footnotes:

1

可以存储任意大小数字。

2

双精度64位数值。

3

Python的 null 值,只存在一个实例。 如果一个函数没有显式的返回值,则它会隐式地返回 None 。它不仅是一个关键字,还是 NoneType 类型的唯一实例。

4

索引从0开始。

5

可以节约内存占用。