Python数据类型与数据结构简单整理
Python内部存在着两种数据形式,以一定的数据储存方式为基础的 数据类型和堆结构的组合方式即 数据结构。以下做简单整理。
数据类型
数值型
int
float
字符型
单字符
字符串
实质就是字符的列表,许多列表操作也是字符串操作。
字符串前缀
r前缀:拒绝转义字符串,正则表达式 re 常用
b前缀:bytes 类型字符串
u前缀:str 类型字符串,默认类型,默认隐藏
f前缀:格式化输出,同.format()
格式化输出
方式一
格式:"格式符"%(格式化对象)
需要学习具体的格式符:
格式符 | 模式意义 |
---|---|
%r | 格式化字符串 repr() |
%s | 格式化字符串 str() |
%c | 格式化字符及其ASCII码 |
%b | 二进制整数(binary) |
%d | 十进制整数(dec) |
%u | 格式化无符号整型 |
%o | 格式化无符号八进制数(oct) |
%x | 格式化无符号十六进制数(hex) |
%X | 格式化无符号十六进制数(大写) |
%f | 格式化浮点数字,可指定小数点后的精度 |
%e | 用科学计数法格式化浮点数 |
%E | 作用同%e,用科学计数法格式化浮点数 |
%g | 如果指数大于-4或者小于精度值则和e相同,其他情况和f相同 |
%G | 如果指数大于-4或者小于精度值则和E相同,其他情况和f相同 |
%p | 用十六进制数格式化变量的地址 |
%% | 字符"%" |
代码示例(Python2):
>>> print '%r'%'\x27' # 带括号的单引号
"'"
>>> print '%s'%'\x27' # 纯单引号
'
>>> class Example(object):
... __repr__ = lambda cls: '<Demo>(repr)'
... __str__ = lambda cls: '<Demo>(str)'
...
>>> example = Example()
>>> print '%s'%example
<Demo>(str)
>>> print '%r'%example
<Demo>(repr)
方式二
格式:f'content{obj:type}'
import time
t0 = time.time()
time.sleep(1)
name = 'processing'
print(f'{name} done in {time.time() - t0:.2f} s') # 以f开头表示在字符串内支持大括号内的python 表达式
输出:
processing done in 1.00 s
方式三
同方式二实质相同
格式:'content{obj:type}'.format()
'''类似f开头,大括号变量,:定义格式'''
coord = (3, 5)
'X: {0[0]}; Y: {0[1]}'.format(coord)
'{0}, {1}, {0}'.format(*'abc') # unpacking argument sequence
'a, b, a'
'Coordinates: {latitude}, {longitude}'.format(latitude='37.24N', longitude='-115.81W')
'Coordinates: 37.24N, -115.81W'
'{:,}'.format(1234567890)
'1,234,567,890'
'Correct answers: {:.2%}'.format(points/total)
'Correct answers: 86.36%'
print()函数
格式
print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
参数介绍
objects
– 复数,表示可以一次输出多个对象。输出多个对象时用“,”分隔。
sep
– 间隔多个对象,默认值是单空格。
end
– 设定结尾。默认值是换行符 \n。
file
– 要写入的文件对象,默认系统输出流。
flush
– 如果 flush 关键字参数为 True,输出流会被强制刷新,无论是否需要缓存。
参数实例
单print输出多对象之间由空格隔开sep=' '
,而多print输出则自动换行end='\n'
,可以通过改变sep和end参数的值改变
>>> print(1,2,3, sep=''); print(4,5,6)
123
4 5 6
>>> print(1,2,3, end=''); print(4,5,6)
1 2 34 5 6
>>> print(1,2,3, end=' '); print(4,5,6)
1 2 3 4 5 6
输出至文件
with open("demo.txt","w") as f:
print('Hello,Jack!',file=f)
print('Hello,Rose!',file=f)
f.close()
利用flush参数实现Loading效果(此处参考菜鸟教程)
print("Loading",end = "")
for i in range(20):
print(".",end = '',flush = True) # 结果是20个点依次出现,如果关闭flush参数则全部加载完成后才会一次性输出
time.sleep(0.5)
作用
输出:
- 字符串:显示字符串内容,表现为去掉引号、完成转义与格式化
- 数字、逻辑值、列表、元组与字典:原样输出
- 表达式:输出结果(结果又分为以上两种形式)
逻辑型
True与False
空值
数据类型转换
数据结构
Python数据结构总体包括数组(列表)、字典、元组等等,其常用操作涉及取用元素(含切片)、遍历元素、查找、增加和删除。不同的数据结构,操作有相通之处,因此以列表为重点讲解,可以举一反三其它数据结构的同类操作。
另:数据结构是对整合小数据形成的集成数据,而其组成元素的各数据拥有各自的基本数据类型(数据结构一定程度上也可以看作数据类型,只是存储量和连续性不同),若数据结构的元素中含有其它数据结构就称为嵌套(也就是套娃)。以下是一个例子。
vtbfirstempiror =
[
'Virtual youtuber',
['花Q','Super Cute AI with highighigh Intelligence'],
{
'name':'Kizuna AI',
'age':4,
'sex':['JK?','woman?','UNKOWN?'],
'SecretInfo':'中の人はないです',
'famousSong':'AIAIAI',
'dream':'Conquor and Connect the World!'
}
]
数组
形式
列表(list)a = [2,3,8,11,7]
二维数组(array)b = [[2,2],[1,1]]
(2*2)
三维数组(矩阵)c = [[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]]
(2*2*3)
操作(限一维列表)
获得列表长度
>>> len(a) # 列表长度,即元素个数(一维数组)
5
合并与重复
>>> a + b
[2, 3, 8, 11, 7, [[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]]
>>> a * 4
[2, 3, 8, 11, 7, 2, 3, 8, 11, 7, 2, 3, 8, 11, 7, 2, 3, 8, 11, 7]
遍历
>>> for i in a: print(i, end=' ')
2 3 8 11 7
截取(含切片)
(1) 截取即通过下标取用元素(注意此下标包括正向逆向两种)(得到的是元素)
格式:列表名[下标]
>>> a[0] # 正向,下标数等于正向位置数减一(因为默认0是数据结构内存的初始地址)
2
>>> a[-3] # 逆向,下标数等于逆向位置数
8
(2) 取用部分连续元素,即切片(得到的是数组)
格式:列表名[切片]
(切片的步进方式可参看文末链接)
>>> a[0:2] # 注意结果是左闭右开,得到的是新的数组,可视为原数组的切片
[2, 3]
>>> a[-2:0] # 反向得到空数组
[]
>>> a[:3] # 切片操作中某侧的空值表示该侧的完全取用
[2, 3, 8]
>>> a[:] # 双侧空值就是整个数组
[2, 3, 8, 11, 7]
(3) 下标也可以用表达式代替(不如说下标就是表达式)
>>> a[3-2] # 数值运算式
3
>>> a[2:-1-1] # 切片也可以应用运算式,有特殊优先级(也不能这么说,:并不是运算)
[8]
需要注意[]内的数据类型只能为整数或切片,若是字符串或是整数组成的数据结构会报错TypeError: list indices must be integers or slices
,数字超出列表下标范围也会报错IndexError: list index out of range
有关切片知识的进一步的了解以及高级操作可以学习文末的相关参考文章。
查找
判断元素是否存在
>>> 3 in a
True
count
方法统计某个元素在列表中出现的次数
格式:列表名.count(元素值)
>>> a = [33,2,33,66,99,22]
>>> a.count(33)
2
index
方法直接查找列表中是否有符合的元素,若有返回值为下标索引,若没有则报错ValueError: 1 is not in list
格式:列表名.index(元素值)
>>> a.index(3)
1
添加元素
append
方法末尾添加元素
格式:列表名.append(元素)
>>> a.append(8) # 添加数字元素(字符也可以)
>>> a.append([3,2]) # 元素可以是列表
>>> a
[2, 3, 8, 11, 7, 8, 8, [3, 2]]
insert
方法可调整插入位置
格式:列表名.insert(下标,插入元素)
>>> a = [2,3,8,11,7]
>>> a.insert(2,20); a # 下标即插入后新元素所在的索引
[2, 3, 20, 8, 11, 7]
extend
方法添加列表(实际上就是合并列表)
格式:列表名.extend(另列表名)
>>> a.extend(b); a
[2, 3, 20, 8, 11, 7, [[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]]
删除
del
方法可删除列表或指定下标的一个列表元素
格式1:del(列表名)
格式2:del(列表名[下标或切片])
>>> del(a); a # 删除列表,不存在该变量
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined
>>> a = [33,22,2333,666]
>>> del(a[1:2]); a # 现实证明了切片是无法实现删除多个元素的
[33, 2333, 666]
>>> del(a[2]);a
[33, 2333]
remove
方法用于移除列表中某个值的第一个匹配项
格式:列表名.remove(元素值)
>>> a = [33,2,33,66,99,22]
>>> a.remove(33); a
[2, 33, 66, 99, 22]
pop
方法删除索引位置的元素(默认末位)并返回该元素值
格式:列表名.pop(下标)
>>> a.pop(); a
22
[2, 33, 66, 99]
>>> a.pop(2); a
66
[2, 33, 99]
字典
形式
与JSON格式的形式非常相似,都是键值对列表样的形式,所有键的数据形式要求一致,值的数据则无限制。
{ key1 : value1, key2 : value2, }
操作
查找
访问
按键索值
格式:字典名[对应键名]
添加与删除键值对
(未完待续······)
参考与推荐文章(文章标题有改动):
列表的切片、遍历、增加、查找、删除、嵌套常用用法
Python切片slice函数、切片的四种索引方式极简叙述与Python切片详解