Python - Data Type
Python中的大部分对象,如列表、字典、 Numpy 数组都是可变对象,大多数用户定义的类型(类)也是可变的。可变对象中包含的对象和值是可以被修改的。但是有一些对象是不可变的,如字符串、元组。
标量
Python的标准库中有一个小的内建类型集合,用来处理数值、字符串、布尔值以及日期和时间。这类“单值”类型被称为标量。主要的标量类型有
int1- 前缀
0x表示16进制整数。 - 整数除法会把结果自动转型为浮点数。
- 如果需要C风格的整数除法(去掉小数部分),可以使用整除操作符
//。
- 前缀
float2str- 可以使用单引号
'或双引号"写一个字符串字面值。 - 字符串是Unicode字符的序列,是不可改变的。很多Python对象可以通过函数
str转成字符串。 - 对于单个字符,函数
ord把字符转换为其对应的整数表示;函数chr把编码转换为对应的字符。 - 对于含有换行的多行字符串,可以使用三个单引号(
''')或三个双引号(""")。 - 反斜杠
\是转移符号,它用来指明特殊符号。可以在字符串前面加上前缀符号r(raw的简写)避免对字符串转义。 - 字符串对象有一个
format方法,可以用来代替字符串中的格式化参数,并产生一个新的字符串。 - 带有前缀符号
f(format的简写)的字符串被称之为f-string。如果其包含{xxx},就会以对应的变量替换。
- 可以使用单引号
bool- 布尔值有两个:
True和False。 - 布尔运算符包括:
and,or,not。
- 布尔值有两个:
None3bytes- 字符串在内存中以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 模块提供了 datetime , date 和 time 类型。
- 对于
datetime实例,可以分别使用date和time方法获取它的date和time对象。 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。 - 索引可以为负值,意味着从序列的尾部进行索引。
start,stop,step均可省略,默认值分别为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关键字。
- 推导式,如