数据类型:
计算可以处理各种不同文件,图形,音频,视频,网页等各种各样的数据,不同的数据,需要定义不同的数据类型。在Python中,能够直接处理的数据类型有以下几种:
一:nubmer(数字)
1.1数据类型的创建:
1 a=90 2 b=a 3 b=9000 4 print(a) 5 print(b)
1.2number 数据类型的转换:
1 var1=3.14 2 var2=5 3 var3=int(var1) 4 var4=float(var2) 5 print(var3,var4)
Python内置函数:
1 x=10 2 abs(x) #x的绝对值, 例如-10,结果就是10 3 ceil(x) #返回数字的上入整数,如math.ceil(4.1) 返回 5 4 cmp(x, y) #如果 x < y 返回 -1, 如果 x == y 返回 0, 如果 x > y 返回 1 5 exp(x) # 返回e的x次幂(ex),如math.exp(1) 返回2.718281828459045 6 fabs(x) # 返回数字的绝对值,如math.fabs(-10) 返回10.0 7 floor(x) # 返回数字的下舍整数,如math.floor(4.9)返回 4 8 log(x) # 如math.log(math.e)返回1.0,math.log(100,10)返回2.0 9 log10(x) # 返回以10为基数的x的对数,如math.log10(100)返回.0 10 max(x1, x2,...) #返回给定参数的最大值,参数可以为序列。 11 min(x1, x2,...) #返回给定参数的最小值,参数可以为序列。 12 modf(x) #返回x的整数部分与小数部分,两部分的数值符号与x相同,整数部分以浮点型表示。 13 pow(x, y) # x**y 运算后的值。 14 round(x [n]) #返回浮点数x的四舍五入值,如给出n值,则代表舍入到小数点后的位数。 15 sqrt(x) # 返回数字x的平方根,数字可以为数,返回类型为实数,如math.sqrt(4)返回 2+0j
二:字符串类型:string
字符串的格式:是以英文状态下的:"abcd",或者'123 '以单引号,或者以双引号格式书写的;
2.1创建字符串:
1 print("helloworld") 2 print('nihao')
2.2对应的操作:
2 # 1 * 重复输出字符串 3 print('hello123'*2) 5 # 2 [] ,[:] 通过索引获取字符串中字符,这里和列表的切片操作是相同的,具体内容见列表 6 print('helloworld123456'[2:])
8 # 3 in 成员运算符 - 如果字符串中包含给定的字符返回 True 9 print('el' in 'helloworld123')
11 # 4 % 格式字符串 12 print('%s is a good teacher'%'wing') 15 # 5 + 字符串拼接 16 a='123' 17 b='abc' 18 c='789' 19 d1=a+b+c 20 print(d1) 21 # +效率低,该用join 22 d2=''.join([a,b,c]) 23 print(d2)
2.3string的内置函数:
1 # string.capitalize() 把字符串的第一个字符大写 2 # string.center(width) 返回一个原字符串居中,并使用空格填充至长度 width 的新字符串 3 # string.count(str, beg=0, end=len(string)) 返回 str 在 string 里面出现的次数,如果 beg 或者 end 指定则返回指定范围内 str 出现的次数 4 # string.decode(encoding='UTF-8', errors='strict') 以 encoding 指定的编码格式解码 string,如果出错默认报一个 ValueError 的 异 常 , 除 非 errors 指 定 5 # string.encode(encoding='UTF-8', errors='strict') 以 encoding 指定的编码格式编码 string,如果出错默认报一个ValueError 的异常,除非 errors 指定的是'ignor 6 # string.endswith(obj, beg=0, end=len(string)) 检查字符串是否以 obj 结束,如果beg 或者 end 指定则检查指定的范围内是否以 obj 结束,如果是,返回 True,否则返回 Fals 7 # string.expandtabs(tabsize=8) 把字符串 string 中的 tab 符号转为空格,tab 符号默认的空格数是 8。 8 # string.find(str, beg=0, end=len(string)) 检测 str 是否包含在 string 中,如果 beg 和 end 指定范围,则检查是否包含在指定范围内,如果是返回开始的索引值,否则返回-1 9 # string.index(str, beg=0, end=len(string)) 跟find()方法一样,只不过如果str不在 string中会报一个异常. 10 # string.isalnum() 如果 string 至少有一个字符并且所有字符都是字母或数字则返回 True,否则返回 False 11 # string.isalpha() 如果 string 至少有一个字符并且所有字符都是字母则返回 True,否则返回 False
三:字节类型:
四:布尔值:
4.1:True和False,在Python中,布尔值,要区分大小写:
1 2 print(True) 3 print(4>2) 4 print(True+1) 5 print(bool([3,4]))
4.2或与非的操作:
1 bool(1 and 0) 2 bool(1 and 1) 3 bool(1 or 0) 4 bool(not 0)
4.3布尔值的常用场景:
1 # 2 # age=18 3 # if age>18: 4 # print('成功') 5 # else: 6 # print('haha')
五:list列表
list是Python中数据最长用的数据类型,列表是可变的:
5.1查:[]
1 names_class2=['小米','华为','联想','三星'] 2 3 print(names_class2[2]) 4 print(names_class2[0:3]) 5 print(names_class2[0:7]) 6 print(names_class2[-1]) 7 print(names_class2[2:3]) 8 print(names_class2[0:3:1]) 9 print(names_class2[3:0:-1])
5.2增
append可以在列表的最后追加内容,insert是在列表里面插入内容;
1 names_class2.append('月月') 2 names_class2.insert(2,'mimi') 3 print(names_class2)
5.3改(重新赋值)
1 names_class2[3]=('haha') 2 names_class2[0:2] =('hhh','www') 3 print(names_class2)
5.4删除:del remove pop
1 2 names_class2.remove('haha') 3 del names_class2[0] 4 names_class2.pop() 5 del names_class2 6
5.5 count
count()用于统计某个字母在列表里面出现的次数;
x=['to','me','to','me','to','haha','hello'] x.count('to') y=[1,2,[1,2],[1,2],[4,5]] y.count([1,2]) y.count(1)
5.6extend,可以在另一个序列的后边追加一个序列;
x=[1,2,3] y=[4,5,6] x.extend(y) print(x)
extend 的是改变了原来的列表,而原来的 +这是返回一个全新的列表
x=[1,2] y=[3,4] print(x+y) print(x)
5.8 index ,找出序列的第一个匹配的索引的位置;
1 print(names_class2.index('www'))
5.9reverse(),方法是将列表中的元素反向存放;
1 names_class2.reverse( 2 print(names_class2)
6.0 sort 是在原来的基础上,让原来的列表排序
1 x=[4,5,1,2] 2 x.sort() 3 print(x)
6.1深浅拷贝
对于一个列表,我们可以对其进行,复制,而不是通过重新赋值的方式;重新赋值的内存空间是两个独立的内存空间;
1 names1=['张三','李四','王五','赵六'] 2 names1.copy=['张三','李四','王五','赵六']
通过如上的方式,可以实现两个值得一样,但是并不是使用于所有的场合,如果说所有的数据都通过这种方式赋值的方式复制,因为其数据量比较大不适合,所有这里面我们可以使用copy()
1 2 n=['张三','李四','王五','赵六',[1,7,8]] 3 ncopy=n.copy() 4 5 n[0]='zhangsan' 6 print(n) 7 print(ncopy)
1 #这里查看如下代码,发现两者并不是一直独立的; 2 n[4][0]=0 3 print(n) 4 print(ncopy)
这里简单的介绍一下什么是深浅拷贝:
1、首先给大家介绍一下,哪些基本的数据类型是可变的,哪些是不可变的:
可变数据类型:字典,列表,这些是可变的
不可变的数据类型:元组,数字,字符串
通过id()函数我们可以获取一个对象的内存地址;如果两个对象的内存地址是一样的,那么这两个对象肯定是一个对象。和is是等价的。Python源代码为证:
1 static PyObject * 2 cmp_outcome(int op, register PyObject *v, register PyObject *w) 3 { 4 int res = 0; 5 switch (op) { 6 case PyCmp_IS: 7 res = (v == w); 8 break; 9 case PyCmp_IS_NOT: 10 res = (v != w); 11 break;
2、当我们对列表进行修改的时候,注意不变的是列表的内存地址,不是里面的元素;
1 2 u=[1,2,3,4] 3 print(id(u)) #执行结果3247840 4 u[0]='a' 5 print(id(u)) #执行结果3247840
2.1像:数字,元组,字符串这些不可变的数据类型,要想改变,必须重新赋值,指针指向新的内存地址;
1 r='wing' 2 print(id(r))#内存地址4551520 3 # r[0]='a' #报错 4 r='mimi' 5 print(id(r)) #内存地址:6750304
2.3有关拷贝知识:这里我们只需要掌握浅拷贝的知识,就可以了;
1 2 a=[[1,2],3,4] 3 b=a[:]#b=a.copy() 4 5 print(a,b) 6 print(id(a),id(b)) 7 print('a[0]:',id(a[0]),'b[0]:',id(b[0])) 8 print('a[0][0]:',id(a[0][0]),'b[0][0]:',id(b[0][0])) 9 print('a[0][1]:',id(a[0][1]),'b[0][1]:',id(b[0][1])) 10 print('a[1]:',id(a[1]),'b[1]:',id(b[1])) 11 print('a[2]:',id(a[2]),'b[2]:',id(b[2])) 12 13 print("-------------------------------------------") 14 15 b[0][0]=0 16 print(a,b) 17 print(id(a),id(b)) 18 print('*************************************') 19 print('a[0]:',id(a[0]),'b[0]:',id(b[0])) 20 print('a[0][0]:',id(a[0][0]),'b[0][0]:',id(b[0][0])) 21 print('a[0][1]:',id(a[0][1]),'b[0][1]:',id(b[0][1])) 22 print('a[1]:',id(a[1]),'b[1]:',id(b[1])) 23 print('a[2]:',id(a[2]),'b[2]:',id(b[2]))
如图参考:
六:元组,tuple:
元组是不可变的,即数据不能修改,只能被查询,元组在小括号里面(),元组用逗号隔开,元组可以被查询,所以可以像列表一样使用切片查询;
1 a=() 2 b=(2,)
元组可以是空的,元组是一个元素的时候要使用逗号;
元组的作用:
1 对于一些数据我们不想被修改,可以使用元组;
2 另外,元组的意义还在于,元组可以在映射(和集合的成员)中当作键使用——而列表则不行;元组作为很多内建函数和方法的返回值存在。
七:字典:
1、字典是python中唯一的映射类型,采用键值对(key-value)的形式存储数据。
2、python对key进行哈希函数运算,根据计算的结果决定value的存储地址,所以字典是无序存储的,且key必须是可哈希的。
3、可哈希表示key必须是不可变类型,如:数字、字符串、元组。
4、字典(dictionary)是除列表意外python之中最灵活的内置数据结构类型。
5、列表是有序的对象结合,字典是无序的对象集合。
6、两者之间的区别在于:字典当中的元素是通过键来存取的,而不是通过偏移存取。
7.1创建字典:
1 2 dic={'name':'wing','age':34,'sex':'nv'} 3 dic2=dict((('name','wing'),)) 4 print(dic) 5 print(dic2)
执行结果:
1 {'name': 'wing', 'age': 34, 'sex': 'nv'} 2 {'name': 'wing'}
7.2字典常用的操作方法:
1 dic={} 2 dic['name']='wing' 3 dic['age']=12 4 print(dic)
执行结果:
1 {'name': 'wing', 'age': 12}
7.2查:
1 dic={} 2 dic['name']='wing' 3 dic['age']=12 4 print(dic) 5 6 print(dic['name']) 7 8 print(dic.items()) 9 10 print(dic.keys()) 11 12 print(dic.values()) 13 14 print('name' in dic) 15 16 print(list(dic.values()))
执行结果:
1 {'name': 'wing', 'age': 12} 2 wing 3 dict_items([('name', 'wing'), ('age', 12)]) 4 dict_keys(['name', 'age']) 5 dict_values(['wing', 12]) 6 True 7 ['wing', 12]
7.3删除:
1 dic={} 2 dic['name']=' 3 dic['age']=12 4 print(dic) 5 6 7 dic['name']=' 8 del dic['name 9 print(dic) 10 11 a=dic.popitem 12 print(a,dic)
执行结果:
1 {'name': 'wing', 'age': 12} 2 {'age': 12} 3 ('age', 12) {}
7.4 改:
1 2 dic={'name 3 dic['name' 4 dic2={'sex 5 dic.update 6 print(dic)
7.5 字典的嵌套:
1 dic={ 'zhangsan':{'age':23,'sex':'male'}, 2 '李二敏':{'age':33,'sex':'male'}, 3 'wing':{'age':27,'sex':'women'} }
八:集合:(set)
8.1:集合是无序的,不重复的,它的作用:
1、去重,把列表变成集合,就会自动的去重了;
2、交叉,并集,交集,差集等关系;
在Python中,集合是不能重复的;
li=[1,2,3,4] s=set(li) print(s) li2=[1,2,3,4,1,1] s2=set(li2) print(s2)
执行结果:
{1, 2, 3, 4}
{1, 2, 3, 4}
集合的对象无序排列的可哈希的值:集合成员可以做字典的键;
集合分类:可变集合,不可变集合;
可变集合(set):可添加和删除元素,非可哈希的,不能用作字典的键,也不能做其他集合的元素
不可变集合(frozenset):与上面恰恰相反
1 li=[1,2,3] 2 s =set(li) 3 dic={s:'123'} #TypeError: unhashable type: 'set'
8.2集合的相关操作:
集合通过:set()和frozenset()创建;
1 s1=set('aaaal') 2 s2=frozenset('abcd') 3 print(type(s1)) #<class 'set'> 4 print(type(s2)) #<class 'frozenset'>
集合本身是无序的,所有不能通过切片来访问集合,只能通过in,not in来访问和判断集合元素;
s1=set('abcd') print('a' in s1) print('e' not in s1)
执行结果:
True
True
b
d
a
c
8.3更新集合:
通过如下的方法更新集合:
add()
remove()
update()
8.3.1如上的方法只有在可变集合中才能更新使用;
1 s1=set('abcd') 2 s2=frozenset('efch') 3 s2.add(0) #'frozenset' object has no attribute 'add'
1 s1=set('abcd') 2 s2=frozenset('efch') 3 s1.add('wing') #{'wing', 'c', 'b', 'a', 'd'} 4 print(s1) #{'c', 'b', 'wing', 'a', 'd'} 5 s1.update('hello') 6 print(s1) #{'wing', 'l', 'c', 'o', 'b', 'e', 'a', 'h', 'd'} 7 s1.remove('a') 8 print(s1) #{'wing', 'l', 'c', 'o', 'b', 'e', 'h', 'd'}
del 是删除集合本身;
8.4集合的操作类型:
in,not in,
等价==
不等价:!=
子集,超集
1 s=set('wanghelloworld') 2 s1=set('wang') 3 print('w' in s) #True 4 print(s1 <s) #True
8.4联合:|
联合(union)操作与集合的or操作其实等价的,联合符号有个等价的方法,union();
1 s=set('wanghelloworld') 2 s1=set('wang') 3 s2=s|s1 4 print(s2) # {'a', 'o', 'g', 'w', 'd', 'l', 'n', 'r', 'h', 'e'} 5 print(s.union(s1)) #{'a', 'o', 'g', 'w', 'd', 'l', 'n', 'r', 'h', 'e'}
8.5交集:
和and等级,在集合里面的等价方法是:intersection()
1 s1=set('abc') 2 s2=set('ahc') 3 s3=s1&s2 4 print(s3) #{'c', 'a'} 5 print(s1.intersection(s2)) #{'c', 'a'}
8.6 差集 -
1 s1=set('abc') 2 s2=set('ahc') 3 s3=s1-s2 4 print(s3) #{'b'} 5 print(s1.difference(s2)) #{'b'}
8.7 对称差集:
其等价方法是:symmetric_difference(),就是集合里面的异或,属于s1,和s2,但是不同时属于s1,s2,就是说,s1和s2的所有的元素,去除公共部分;
1 2 s1=set('abc') 3 s2=set('ahc') 4 s3=s1^s2 5 print(s3) # {'b', 'h'} 6 print(s1.symmetric_difference(s2)) #{'b', 'h'}
如下最简单的驱虫方式:
1 """最简单的去重方式""" 2 lis=[1,2,3,4,56,1,2,2] 3 print(list(set(lis))) #[1, 2, 3, 4, 56]
九:文件操作
文件操作的流程:
1.打开文件,获取文件的句柄,并且赋值给变量;
2.通过句柄对文件进行操作;
3.关闭文件;
1 锄禾日当午 2 汗滴和下土 3 谁知盘种餐 4 丽丽皆辛苦 5 美丽的生活 6 开心的生活 7 我想好好活
现有如上述的文件;名字为:‘小文件’
f=open('小文件',encoding='utf8')#打开文件 data=f.read()#获取文件的内容 f.close()
备注:如果首次打开使用如下代码会报错;
1 f=open('小文件')#打开文件 2 data=f.read()#获取文件的内容 3 f.close() 4
执行结果:
Traceback (most recent call last):
File "D:/pytest/Demo/Basictest.py", line 274, in <module>
data=f.read()#获取文件的内容
UnicodeDecodeError: 'gbk' codec can't decode byte 0xa6 in position 4: illegal multibyte sequence
所以:文件是utf8保存的,打开文件时open函数是通过操作系统打开的文件,而win操作系统
默认的是gbk编码,所以直接打开会乱码,需要f=open('小文件',encoding='utf8'),如果小文件如果是gbk保存的,则直接打开即可。所以说:第一段代码加入:encoding='utf8',才不会报错;
9.2文件打开的模式:
1 'r' open for reading (default) 2 'w' open for writing, truncating the file first 3 'x' create a new file and open it for writing 4 'a' open for writing, appending to the end of the file if it exists 5 'b' binary mode 6 't' text mode (default) 7 '+' open a disk file for updating (reading and writing) 8 'U' universal newline mode (deprecated)
1 2 f=open('小文件',encoding='utf8')#打开文件 3 data1=f.read()#获取文件内容 4 print(data1)
接下来我们扩展文件格式:
1 f = open('小文件','w') #打开文件 2 f = open('小文件2','a') #打开文件 3 f.write('云云UN11111\n') 4 f.write('白了少年头2\n') 5 f.write('空悲切!3') 6 f.close()
1 #r+,w+模式 2 f = open('小文件2','r+') #以读写模式打开文件 3 print(f.read(5))#可读 4 f.write('hello') 5 print('-------------------') 6 print(f.read())
1 f = open('小文件2','w+') #以写读模式打开文件 2 print(f.read(5))#什么都没有,因为先格式化了文本 3 f.write('hello alex') 4 print(f.read())#还是read不到 5 f.seek(0) 6 print(f.read())
1 #w+与a+的区别在于是否在开始覆盖整个文件 2 # ok,重点来了,我要给文本第三行后面加一行内容:'hello !!!!!!!!!' 3 # 有同学说,前面不是做过修改了吗? 大哥,刚才是修改内容后print,现在是对文件进行修改!!! 4 # f = open('小文件2','r+') #以写读模式打开文件 5 # f.readline() 6 # print(f.tell()) 7 # f.write('hello !!!!!!!!!!!') 8 # f.close() 9 # 和想的不一样,不管事!那涉及到文件修改怎么办呢? 10 11 # f_read = open('小文件','r') #以读模式打开文件 12 # f_write = open('小文件_back','w') #以写读模式打开文件
注意1: 无论是py2还是py3,在r+模式下都可以等量字节替换,但没有任何意义的!
注意2:有同学在这里会用readlines得到内容列表,再通过索引对相应内容进行修改,最后将列表重新写会该文件。
这种思路有一个很大的问题,数据若很大,你的内存会受不了的,而我们的方式则可以通过迭代器来优化这个过程
9.4 为了避免打开文件后忘记关闭,可以使用with语句:
1 with open('小文件','r') as f: 2 pass
这种方法的方便之处在于:当with执行完毕了,解释器会自动关闭,并释放文件的资源;
在Python3中支持对多个文件打开,在Python2.6之前的版本都是不可以的;
1 2 with open('文件1') as obj1, open('文件2') as obj2: 3 pass