Python数据类型
Python语言的一个特色是在变量赋值时,不需要声明变量的类型,原因是Python可以根据每个变量的初始赋值分析其类型,并在内部对其进行跟踪。
Python常见的数据类型简介如下:
- Booleans(布尔型):其值为True或False。
- Numbers(数值型),分为以下几种:
- Integer(整数)
- Float(浮点数)
- Fractions(分数)
- 复数
- Strings(字符串型):是 Unicode 字符序列
- List(列表):是值的有序序列
- Tuples(元组):是有序且不可变的值序列
- Dictionarys(字典):无序的键值对 // 但有方法可以使之变为有序的,而且据说Python3.7中的字典是有序的.
- Sets(集合): 无序的
- Bytes(字节)和Byte Arrays:例如: 一份 JPEG 图像文件。
NOTE:下面将依次详细介绍各种数据类型,及常用的方法。
下面直接上干货,争取用最简练的语言详解每个数据类型,及对应的常用方法。
Python数据类型详解
在说Python的数据类型前,先说说类和对象。
Python.org是这样解释两者关系的:对象是对客观事物的抽象,而类是对对象的抽象。
set foldmethod=syntax
> type() #查看某个对象所属的类
>>> dir(str) #查看某个类都提供了什么方法。P.S.这里代码折叠功能怎么弄的?汗~
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
help(类名)是对这些类所含方法的详细描述。Python还可以help(类名.方法名),单独查看该方法的描述,如help(list.sort)
另外在pycharm中也可以通过Ctrl+类查看Python内部定义描述。
下面开始介绍Python的各种数据类型及常用方法。
列表、
列表是常用类之一,列表中的元素是有序的,通过列表可以对数据实现最方便的存储、修改等操作。
定义及读取列表
names=['bolen','jack','nick']
或names=list(['bolen','jack','nick'])
>>> names[0]
'bolen'
>>> names[-1]
'nick'
>>> names[-2]
'jack'
可以正向、反向读取列表中的元素
可以看到下面列表支持的所有方法中,有的带双下划线开头并结尾的,有的不带,这是因为前者是Python内置的私有方法,后面的博客中会详细介绍这种方法,本篇之介绍不带下划线的一些常用方法。
“`
dir(list)
[‘add‘, ‘class‘, ‘contains‘, ‘delattr‘, ‘delitem‘, ‘dir‘, ‘doc‘, ‘eq‘, ‘format‘, ‘ge‘, ‘getattribute‘, ‘getitem‘, ‘gt‘, ‘hash‘, ‘iadd‘, ‘imul‘, ‘init‘, ‘iter‘, ‘le‘, ‘len‘, ‘lt‘, ‘mul‘, ‘ne‘, ‘new‘, ‘reduce‘, ‘reduce_ex‘, ‘repr‘, ‘reversed‘, ‘rmul‘, ‘setattr‘, ‘setitem‘, ‘sizeof‘, ‘str‘, ‘subclasshook‘, ‘append’, ‘clear’, ‘copy’, ‘count’, ‘extend’, ‘index’, ‘insert’, ‘pop’, ‘remove’, ‘reverse’, ‘sort’]
列表切片
>>> names
['bolen', 'yy', 'kity', 'jack', 'lily']
>>> names[0] #元素从0开始排序
'bolen'
>>> names[0:2] #包前不包后
['bolen', 'yy']
>>> names[0:-1] #最后一个元素是-1
['bolen', 'yy', 'kity', 'jack']
>>> names[:-1] #等同于0:-1,:前不写的话默认是0,:后面不写默认是到-1
['bolen', 'yy', 'kity', 'jack']
>>> names[2:-1]
['kity', 'jack']
>>> names[:-1]
['bolen', 'yy', 'kity', 'jack']
>>> names[2:] #如果想取到最后一个元素,就不写-1.
['kity', 'jack', 'lily']
>>> names[0:]
['bolen', 'yy', 'kity', 'jack', 'lily']
>>> names[:]
['bolen', 'yy', 'kity', 'jack', 'lily']
>>> names[::2] # :2代表每隔一个元素取一个
['bolen', 'kity', 'lily']
>>>
append
>>> names
['bolen', 'yy', 'kity', 'max', 'hack']
>>> names.append('god')
>>> names
['bolen', 'yy', 'kity', 'max', 'hack', 'god']
insert
>>> names.insert(2,'插入') #从kity前面插进去~
>>> names
['bolen', 'yy', '插入', 'kity', 'max', 'hack', 'god']
修改
>>> names[2] = '换个姿势'
>>> names
['bolen', 'yy', '换个姿势', 'kity', 'max', 'hack', 'god']
删除
此处可用del #{这个貌似不是列表的方法?,dir(list)里也没有}及remove、pop三种删除方法。
>>> del names[2] #只能指定元素序号
>>> names
['bolen', 'yy', 'kity', 'max', 'hack', 'god']
>>> names=['bolen', 'yy', '换个姿势', 'kity', 'max', 'hack', 'god']
>>> names.pop() #默认弹出最后一个元素,pop后既可加具体的元素又可指定元素的序号
god
>>> names.remove('max') #只能指定具体的元素,不能指定序号。
>>> names
['bolen', 'yy', '换个姿势', 'kity', 'hack']
extend
>>> names.insert(2,'插入') #从kity前面插进去~
>>> names
['bolen', 'yy', '插入', 'kity', 'max', 'hack', 'god']
>>> names+nums
['bolen', 'yy', '换个姿势', 'kity', 'max', 'hack', 'god', 6, 7, 8, 9]
>>> names
['bolen', 'yy', '换个姿势', 'kity', 'max', 'hack', 'god']
>>> names.extend(nums)
>>> names
['bolen', 'yy', '换个姿势', 'kity', 'max', 'hack', 'god', 6, 7, 8, 9]
copy
>>> names
['bolen', 'yy', '换个姿势', 'kity', 'max', 'hack', 'god', 6, 7, 8, 9]
>>> name_copy=names.copy()
>>> name_copy
['bolen', 'yy', '换个姿势', 'kity', 'max', 'hack', 'god', 6, 7, 8, 9]
**Notes:**
这里要注意下深浅拷贝的区别,详见我下一篇博文的解析。这里不再赘述。
count
>>> names.insert(0,'bolen')
>>> names.count('bolen')
2
sort&reverse
>>> names.sort()#Python3.0中不能对不同数据类型混合排序了
Traceback (most recent call last):
File "<pyshell#43>", line 1, in <module>
names.sort()
TypeError: unorderable types: int() < str()
>>> nums
[6, 7, 8, 9, 1, 2, 4, 6, 9]
>>> nums.sort()
>>> nums
[1, 2, 4, 6, 6, 7, 8, 9, 9]
>>> names
['bolen', 'bolen', 'god', 'hack', 'kity', 'max', 'yy', '换个姿势']
>>> names.append('allen')
>>> names
['bolen', 'bolen', 'god', 'hack', 'kity', 'max', 'yy', '换个姿势', 'allen']
>>> names.sort()
>>> names
['allen', 'bolen', 'bolen', 'god', 'hack', 'kity', 'max', 'yy', '换个姿势']
---------------------------------------------------------
**reverse
>>> names.reverse()
>>> names
['换个姿势', 'yy', 'max', 'kity', 'hack', 'god', 'bolen', 'bolen', 'allen']
>>> nums.reverse()
>>> nums
[9, 9, 8, 7, 6, 6, 4, 2, 1]
获取下标
>>> names
['换个姿势', 'yy', 'max', 'kity', 'hack', 'god', 'bolen', 'bolen', 'allen']
>>> names.index('bolen')#只返回找到的第一个元素的下标
6
元组
元组其实就是不可变的列表,元组中的元素在创建之后不可被修改。
a_tuple=('bolen','a','jack','nick','name')
>>> a_tuple
('bolen', 'a', 'jack', 'nick', 'name')
>>> a_tuple[0]
'bolen'
>>> a_tuple[-1]
'name'
>>> a_tuple[:-2]
('bolen', 'a', 'jack')
元组只能用于查看和切片,对元组切片会产生新的元组,对列表切片也会产生新的列表。
元组只有两个方法,count和index。
那么元组和列表的区别是什么呢?
元组与列表对比
劣势:
元组中的元组是不可变的,所以也就没有了列表中的pop、remove、insert、appand、extend等方法。
优势
1、元组比列表访问速度快,如果只是想写入元素,不对元素作变更,请用元组;
2、元组对元素写保护,相对列表会使代码更安全;
3、元组可作为字典键使用,列表由于是可变的,不会别用作字典键。
但要注意的是元组中的元素不可变是相对的,例如元组可以接受列表作为元素,且这里的列表还是可变的,列表也可以接受元组作为元素。
>>> b_tuple
('bolen', ['hack', 'list', '12'], 'jack', 'hack')
>>> b_tuple[1][0]
'hack'
>>> b_tuple[1].pop(2)
'12'
>>> b_tuple
('bolen', ['hack', 'list'], 'jack', 'hack')
>>> b_tuple[1].append(22)
>>> b_tuple
('bolen', ['hack', 'list', 22], 'jack', 'hack')
元组的应用
#便捷的为多变量赋值
>>> n=(1,2,3)
>>> x,y,z=n
>>> x
1
>>> y
2
>>> z
3
#但实测列表也是可以这么赋值的
>>> (MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY) = range(7)
>>> MONDAY
0
>>> [MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY] = range(7)
>>> TUESDAY