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