python 3 中有6种数据类型,分别是:数值、字符串、列表(list)、元组(tuple)、字典(dictionary)、集合(set),数值、字符串、元组为不可变的数据类型。
一 数值
int 在python 3 中,无论整数大小,统称为int型号。另外可以用十六进制(0x)和八进制(0o)表示。
float 浮点数。
bool 布尔数,取值为True或False。其运算有not,and,or。
complex 复数,可以用a+bj 或complex(a,b)来表示。
数值的操作运算 +、-、*、/、//(整除)、%(求模)、**(乘方)。
不可变的数据类型若改变数据类型的值,也会重新分配内存空间。
二 字符串
python不支持单字符类型。
字符串运算符
- + 字符串连接。
- * 重复输出字符串。
- [ ] 通过索引获取字符串中的字符。
- [ : ] 获取字符串中的一部分,遵循左开右闭的原则。如[ 1:4:1 ]=[ 1:4 ],而[ 4:1:-1 ]反向输出。
- in和not in 成员运算符,返回布尔数。
- r或R 原始输出,包括令转义字符原样输出。
字符串内建函数
- len(str)返回字符串长度。
- str.count(str1,beg=0,end=len(str)) 返回str1在str里面的出现次数,可以用beg和end限定搜索范围。
- str.find(str1,beg=0,end=len(str)) 检测str1是否出现在字符串中。若存在则返回开始的索引值,否则返回-1。
- str.rfind(str1,beg=0,end=len(str)) 从右边开始find。
- str.index(str1,beg=0,end=len(str)) 与find()一样,不过,不过如果str1不在会报一个异常。
- str.rindex(str1,beg=0,end=len(str)) 同理。
- str.isdigit() 字符串只包含数字返回True,否则False。
- str.replace(str1,str2, num=str.count(str1)) 把str中的str1替换为str2,如果指定num,那么不超过num次数。
- str.split(str1=" ",num=str.count(str1)) 以str为分隔符截取字符串,截取num+1个字串。
- str.strip([chars]) 截掉字符串左边的空格或指定的字符,并且删除字符串末尾的空格。
三 列表
创建列表的时候,列表内的数据类型可以不同。常常在列表中嵌套列表。
列表也可以有+,*的操作,也有迭代操作:
l = [1, 2, 3, 4]
for x in l:
print(x, end='')
列表的截取与字符串的截取类似。
列表更新
- list.append(a) 增加元素a。
- list.remove(a) 删除元素a。
相关函数
- len() 返回元素个数。
- max()、min() 返回列表中元素的最值。
- list(seq) 将可迭代对象seq转化为列表。
range()和enumerate()函数
range()函数返回一个可迭代的对象,而不是列表类型。结构为:
range(start,stop[,step]).start默认为零,step为1.默认下可以直接range(stop)
遵循左闭右开原则
enumerate()函数用于将一个可遍历的数据对象组合为一个索引序列,通识给出数据和数据的下标。语法格式如下:
enumerate(sequence,[start=0])
其中sequence为一个序列,start表示下标的起始位置。
lis = [1, 2, 3, 'lbwnb']
for index, item in enumerate(lis, 0):
print(index, item)
列表推导式
这是一种生成特定列表的简单形式,例如:
a = [2, 4, 6]
b = [3*x for x in a] # 用for来遍历a
c = [3*x for x in a if x > 3] # 用if语句进行过滤
d = [[x, x**2] for x in a]
e = [x*y for x in a for y in b]
print(a, b, e) # 会发现其实生成了一个二阶张量
print([a[i]*b[i] for i in range(len(a))]) #这样就可以防止生成张量
列表的映射
map(function,iterable,...)可以根据提供的函数来对一个或多个列表进行映射,其返回值是一个迭代器,可以通过list()转换为列表。
例如:
def square(x):
return x**2
a = [1, 2, 3, 4, 5]
b = list(map(square, a))
print(b)
c = map(lambda x: x**2, a) # 使用lambda匿名函数
d = map(lambda x, y: x+y, a, c)
print(list(d))
列表的方法
- list.clear() 清空列表。
- list.append(obj) 在尾部添加新元素。
- list.count(obj) 统计某元素在列表中出现的次数。
- list.index(obj) 找出元素第一次出现的索引。
- list.insert(index,obj) 将元素插入列表。
- list.pop([index=-1]) 默认移除最后一个元素,同时返回该元素的值。
- list.remove(obj) 移除列表中某个值的第一个匹配项。
- list.reverse() 反向列表中的元素。
- list.sort() 对列表中的元素进行排序。
- list.copy() 复制列表。
列表排序的方法
使用函数sorted(list)会返回一个对象,可以用作表达式,不改变原有的列表。
list.sort(func=None,key=None,reverse=False),其中key指出用来比较的元素,只有一个参数;reverse 指出排序规则,为True为降序。 key接受的是一个只有一个形参的函数,例如:
def f(a):
return len(a)
key接受的函数返回值,表示此元素的权值,sort将按照权值大小进行排序。
可以同时对多个关键字排序。
元组类型与列表类型类似,就是不能二次修改。
四 字典
字典中每个元素都是键值,即:key:value,元素之间用逗号隔开。包裹在花括号中。
其中键是唯一的,但是值可以是任意数据类型。键必须为不可改变的数据类型,如字符串、数值、元组。
city = {1: "beijng", 2: "tianjin", 3: "shanghai"}
print("%s" % city[2])
给已存在的键赋值会修改对应的元素,给不存在的键赋值会添加新元素。可以使用del()函数来删除指定键的和对应的元素。使用len()获取字典内键的个数,str()输出字典,以可打印的字符串来表示。
字典方法
- dict.clear()
- dict.get(key,default=None) 返回指定键的值,若不存在则返回default的值。
- key in dict 如果键在字典中返回True。
- dict.items() 以列表返回可遍历的(键,值)元组数组。一般用这个方法解读字典。
- dict.keys() 返回一个迭代器,可以使用list() 转化为列表。
- dict.values() 返回一个迭代器,可以使用list() 转化为列表。
- dict.setdefault(key,default=None) 和get() 类似,但是如果键不存在于字典中,将会添加键并把值设置为default。
- pop(key[,default]) 删除key对应的元素,返回值为被删除的元素的值。
- popitem() 随机返回并删除字典中最后一项的键和值。
五 集合
集合是一个无序的不含重复元素的序列。
两个集合a,b之间可以进行-,|,&,^运算:
- - 返回在a中不在b中的元素。
- | 返回集合的并。
- & 返回集合的交。
- ^ 返回集合的异或。
创建集合要用到{value1,value2,...}或set(value)。注意不能用{}创建空集合,因为这样会生成一个空字典。
a = {'a', 'b', 'c', 'd', 'a'}
b = set('abbcd')
print(a, b) #输出{'c', 'a', 'b', 'd'} {'c', 'a', 'b', 'd'}
同样可以用in来判断元素是不是在集合内部。
集合内置方法
- set.add() 为集合添加新元素。
- set.clear()
- set.difference() 返回集合的异或。
- set.intersection() 返回集合的交。
- set.isdisjoint() 判断集合是否分离。
- set.issubset(set1) 判断set是否为set1的子集。
- set.remove() 移除指定元素。
- set.union() 返回集合的并。
- set.update() 给集合添加元素。
六 列表的复制
1.非复制方法——直接赋值法。
如果直接用b=a来对b进行赋值,那么修改其中任意一个列表中的元素都会影响另一个列表中的元素。这么来看此时a,b有C中指针内味了。
2.列表的深复制
列表深复制是通过copy模块的deepcopy()实现的,如b=deepcopy(a).
3.列表的浅复制
使用copy()方法实现对列表的浅层复制。这种方法只能对列表的第一层实现深复制,嵌套结构仍然是浅复制。这很好理解,因为内层的列表结构储存的实际上是地址(指针?),复制第一层的时候直接把第一层全部搬了过去,也就是说其实内层地址还是那个地址,改变新列表里内层的值实际上是索引到这个地址本身。
这种复制方法和一层for循环来一一赋值是一样的。