笔记--Day2--python基础2
一、鸡汤
1.提高自我修养
2.人丑就要多读书
3.多走走,开拓眼界
二、目录:
1.列表、元组操作
2.字符串操作
3.字典操作
- dict是无序的
- key必须是唯一的
4.集合操作
集合是一个无序的,不重复的数据组合,它的主要作用如下:
- 去重,把一个列表变成集合,就自动去重了
- 关系测试,测试两组数据之前的交集、差集、并集、子集、对称差集(反向差集)等关系
5.文件操作
文件操作流程:
- 打开文件,得到文件句柄并赋值给一个变量
- 通过句柄对文件进行操作
- 关闭文件
文件操作模式:
- r,只读模式(默认)。
- w,只写模式。【不可读;不存在则创建;存在则删除内容;】
- a,追加模式。【可读; 不存在则创建;存在则只追加内容;】
"+" 表示可以同时读写某个文件
- r+,可读写文件。【可读;可写;可追加】
- w+,写读
- a+,同a
"U"表示在读取时,可以将 \r \n \r\n自动转换成 \n (与 r 或 r+ 模式同使用)
- rU
- r+U
"b"表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注)
- rb
- wb
- ab
6.字符编码与转码
Python2中的字符串进行字符编码转换过程是:
- 字节串-->decode('原来的字符编码')-->Unicode字符串-->encode('新的字符编码')-->字节串
Python3中定义的字符串默认就是unicode,因此不需要先解码,可以直接编码成新的字符编码:
- 字符串-->encode('新的字符编码')-->字节串
三、练习
1.列表元组操作练习
#pycharm 5.0.3(python3.6) #定义一个空列表 names = [] print('打印空列表names:',names) #定义一个班级人员的列表 names = ['Alex','Felix','Fion','Susan'] #按下标取列表中的数据下标从0开始 print("取'Felix':",names[1]) #截取中间位置的人员 ,切片所取的位置包含其实位置,不包含结束位置(顾头不顾尾) print('切片_方法1_明确位置:',names[1:3]) print('切片_方法2_取末尾:',names[-1]) #从右开始往左数是-1,-2.。。 print('切片_方法3_取最后边:',names[-3:-1]) #如果要取后3个的话,写-1就不行了,只能取2个: print('切片_方法4_取最后边:',names[-3:]) #可以省略不写,这样就可以取多个了 print('切片_方法5_取前3:',names[0:3]) #起始位置可以写0,也可以忽略 print('切片_方法5_取前3:',names[:3]) #同上 print('切片_方法6_按步长:',names[0:-1:2]) print('列表的增删改查:'.center(40,'#')) names.append('Bob') #追加_末位最佳 print('追加_末位追加:',names) names.insert(1,'Jack') #追加_任意位置 print('追加_任意位置:',names) names[2] = 'Wulin' #修改,将列表下边是2的名称修改掉 print('修改:',names) names.remove('Wulin') #删除 print('删除_remove方式',names) del names[1] print('删除_del方式',names) print(names.pop()) #不带下标,删除最后一个并返回删除的值 print('删除_pop方式',names) #删除后的结果 print('查找_找下标:',names.index('Fion'))#查找人员索引位置,没有回报错 print('查找_找下标_借下标打印出名称:',names[names.index('Fion')]) #看似多此一举 names.insert(1,'Fion')#班级姓名重复的情况,可以统计重复的个数 print('统计重复个数:',names.count('Fion')) #清除列表clear name.clear names.reverse()#反转 print('反转:',names) names.insert(3,'4zhang') #插入数字开头的 names.insert(3,'!#woaini') #插入特殊字符开始的 names.sort()#排序 print('排序',names) names2 = [12,34,5] names.extend(names2)#将names2并入到name print('打印合并后的两个列表:',names) print('以下为浅复制相关'.center(50,'-'))#以下浅复制相关,需要记住这个特性,尽管用的较少 #列表中可以包含列表 names.insert(0,['age','grade']) #向列表中插入一个列表 #print('打印包含列表的列表:',names) names3 = names.copy()#后边用到,浅copy,复制一个列表出来 print('打印copy前的列表:',names) print('打印copy后的列表:',names3) names[0][0] ='sex' #修改列表中列表的值 names[5] ='Wo' #修改names列表中Susan的名称为Wo,然后对比复制前复制后列表值的变化 print('打印修改后的列表:',names) print('打印copy后的列表:',names3) #对比以上4个打印结果可以发现,列表中列表的值names和names3都被修改了,但是列表中的值只有names里边被修改了,这个叫浅copy #即只copy了第一层,由于列表中的列表只是个内存地址,所以修改names的列表中的列表的值后names3中的也跟着变了。 print('以下为深copy相关'.center(50,'-'))#一下深复制相关,不随便用,通常不需要随便复制一份(比如数据比较大的情况) import copy #此时需要用到copy模块 print('打印深copy前的列表:',names) names4 = copy.deepcopy(names) #调用copy模块的深copy names[0][0] = 'home' #修改列表中列表的值 print('打印深copy后的列表:',names) print('打印深copy后的列表:',names4) #可以发现列表没有变化 print('以下为列表的循环'.center(50,'-')) # for i in names: print(i) print('以下为浅复制的一个场景'.center(50,'-')) person = ['name',['saving',100]] ''' #3中浅copy方式 p1 = copy.copy(person) # p2 = person[:] #切片 p3 = list(person) #工厂函数 #浅copy什么情况下比较有用 ''' #有以下两个人,都基于person复制过来,两人有一个共同账号,如果一个少了50则另一个发现也少了50 p1 = person[:] p2 = person[:] p1[0]='Felix' p2[0]='Fiona' p1[1][1] =50 #公共账号少了50,那么两个人发现都少了50 print(p1) print(p2)
元组代码
2.字符串操作练习
#pycharm 5.0.3(python3.6) name = 'my \tname is felix {first},my age is {age}' #pycharm有提醒功能,当输入name.的时候就会提醒字符串都有哪些操作,有两个下划线开始结尾的不用管 print('首字母大写:',name.capitalize()) print('统计个数',name.count('i')) print('总共50个字符,不够的用-补齐:',name.center(50,'-')) print('以什么结尾,匹配上则为真:',name.endswith('x')) print('将tab转为多少个空格:',name.expandtabs(tabsize=20)) #在变量值中插入一个tab print('查找,返回值所在的位置',name.find('is')) #字符串的切片 print('字符串的切片:',name[name.find('is'):11]) print('格式化字符串,向{}中传值:',name.format(first='Song',age=23)) print('格式化字符串,传字典形式的值:',name.format_map({'first':'Song','age':12})) print('ab23!'.isalnum()) #'是否是阿拉伯数字,如果里边有特殊字符返回false print('ab'.isalpha())#是否是存英文字符 print('1A'.isdecimal())#是否是十进制 print('10'.isdigit())#是否是整数 print('1A'.isidentifier()) #是否是一个合法的标识符 关注变量的命名规则,不符合的则为False print('A'.islower()) #判断是不是小写 print('22'.isnumeric()) #判断是不是一个数字,只识别整数 print(' '.isspace())#是否是空格 print('my name is '.istitle()) #判断一个字符串是不是title,每个首字母大写 print(''.isprintable())#是否可以打印,字符串不用考虑,比如还是tty文件 print('s'.isupper())#判断是不是大写 print('+'.join(['1','2','3','4']))#将列表中的字符串用某一个字符连接 print(name.ljust(50,'*')) #和center类似,50个字符,不够的用*号补齐 print(name.rjust(50,'*')) print('FELIX'.lower())#把大写变成小写 print('felix'.upper())#把大写变成小写 print('\nFelix'.lstrip())# strip默认会去除两边默认的空格回车 ,lstrip是去除左边的空格回车 print('Felix\n'.rstrip()) print('Felix\n'.strip())# strip默认会去除两边默认的空格回车 print('------') p = str.maketrans('abcdef','123456') # 做映射,可以做随机密码来玩 print('Felix'.translate(p))# str = 'http://www.baidu.com/index' print(str.partition('://'))#从左边找指定的分隔符将字符串进行分割 #返回一个3元的元组,第一个为分隔符左边的子串,第二个为分隔符本身,第三个为分隔符右边的子串。 print('Felix'.replace('i','I')) print('felix songi'.rfind('i')) #从做往右,找到最右边那个值的下标返回 print('123'.rindex('3'))#返回子字符串 str 在字符串中最后出现的位置,如果没有匹配的字符串会报异常 str = 'http://www.baidu.com/index' print(str.rpartition('/'))##从右边找指定的分隔符将字符串进行分割 print('fe li xl'.split(' ')) print('fe li\n xl'.splitlines()) #按换行来分 print('felix'.startswith('f')) #判断是否是什么开头的 print('Felix Song'.swapcase()) #大写边小写,小写边大写 print('Felix Song'.zfill(50)) #50个字符不够数的用0填充
3.字典操作练习
#pycharm 5.0.3(python3.6) #定义一个字段(key-value格式) info = { 'stu1101':'TengLan Wu', 'stu1102':'LonZe Luola', 'stu1103':'XiaoZe Maliya', } print(info) #字典是无序的 #查,方法1,如果key不存在的话会出错 print('取字典中某一个key对应的值:',info['stu1101']) #查,方法2,有就返回,没有就返回none,这是一种安排的方法 print(info.get('stu1104')) #查,方法3,判断key在不在,不在就返回False print('stu1104' in info) #改 info['stu1101'] = '武藤兰' #增,当key值不存在的时候会增加 info['stu1104'] ='Cangjingkong' print(info) #删除 del是python中的一个通用方法 del info['stu1101'] print(info) #删除,pop删除, info.pop('stu1102') print(info) #删除,popitem,随机删除 info.popitem() print(info) #更新update, b = { 'stu1101':'Felix', 1:3, 2:5 } info.update(b) #合并两个字段,有交叉则更新,没有则创建 print(info) #fromkeys与info没什么关系,初始化一个列表,这个地方有个坑 c = info.fromkeys([6,7,8],[1,{'name':'alex'},444]) #相当于创建了一个字典 print(c) c[7][1]['name'] = 'Fiona'#修改的时候会把fromkeys值都修改,类似于一个浅copy print(info.items()) #将字典变成了大的列表
#字典可以多级嵌套字典 China ={ '北京':{ '昌平':{ '沙河':['oldboy','test'], '天通苑':['链家地产','我爱我家'], }, '朝阳':{ '望京':['奔驰','陌陌'], '国贸':['CICC','HP'], '东直门':['Adent','wwo'] }, '广东':{ '东莞':{}, '佛山':{}, '广州':{}, }, } } #修改东直门下的公司名称(key尽量不要写中文) China['北京']['朝阳']['东直门'][1] = 'Kaitong' print(China) #打印所有不包含key的值 print(China.values()) #打印所有key值 print(China.keys()) #setdefault 如果字典不存在可以新增,存在则返回key所对应的值 China.setdefault('陕西',{'宝鸡':{}}) China.setdefault('北京',{}) print(China) print(China.setdefault('北京',{}))
#pycharm 5.0.3(python3.6) info = { 'stu1101':'TengLan Wu', 'stu1102':'LonZe Luola', 'stu1103':'XiaoZe Maliya', } for i in info: print(i) #只是打印了key for i in info: print(i,info[i]) #打印key和value,建议的循环方式 #上边的效果和下边的一致,但是上边的效果高,因为有一个字典转变为列表的过程 for k,v in info.items(): print(k,v)
4.集合操作练习
#pycharm 5.0.3(python3.6) #定义列表,集合;列表转变为集合的方式就是用set()框起来 list_1 = [20,1,4,5,7,3,6,7,9] list_1 = set(list_1) list_2 = set([2,6,0,66,22,8,4]) print(list_1,type(list_1)) print(list_2,type(list_2)) #交集 print('交集:',list_1.intersection(list_2)) print('交集运算符',list_1 & list_2) #并集 print('并集:',list_1.union(list_2)) print('并集运算符:',list_1 | list_2) #差集 print('差集(1有2没有):',list_1.difference(list_2)) print('差集(2有1没有)',list_2.difference(list_1)) print('差集运算符(1有2没有)',list_1 - list_2) print('差集运算符(2有1没有)',list_2 - list_1) list_3 = set([1,3,7]) #子集 (前边的是不是后边的子集或者父集),子集没有专门的运算符 print('子集(1是不是2的子集):',list_1.issubset(list_2)) #父集 print('父集(1是不是2的父集):',list_1.issuperset(list_2)) print('子集(1是不是3的子集):',list_1.issubset(list_3)) print('父集(1是不是3的父集):',list_1.issuperset(list_3)) #对称差集(反向差集):把两个都有的去掉 print('对称差集',list_1.symmetric_difference(list_2)) print('对称差集运算符',list_1 ^ list_2) print('遗漏'.center(50,'#')) #判断两个是否有交集,有返回fase,没有返回true list_4 = set([5,6,8]) print(list_4.isdisjoint(list_3)) print(list_1.isdisjoint(list_2)) #pop 任意删除一个,并返回一个值 print('删除任意一个并返回其值:',list_1.pop()) print('删除任意一个并返回其值:',list_1.pop()) #discard删除一个值,如果值有则删除,如果没有返回空不报错,remove会报错 list_1.discard(7) #discard删除一个值 print('discard删除一个值后list_1结果:',list_1) list_1.discard(1000)#删除一个不存在的值,这里什么也不做也不会报错 print('discard删除一个值list_1结果::',list_1) print('集合的增删改查'.center(30,'-')) #增加 list_1.add(2000) print('增加一个:',list_1) #增加多项 list_1.update([20,40,555]) print('增加多个:',list_1) #删除,值不存在的时候会报错 list_1.remove(2000) print('移除:',list_1) #长度判断 print('长度',len(list_1)) #成员判断:判断20是否在list_1中 print('成员判断:',20 in list_1) print('成员判断:',1000 not in list_1) #copy:浅复制
5.文件操作
#pycharm 5.0.3(python3.6) #文件的打开、读写操作 #读: ''' f = open('yesterday2','r',encoding='utf-8') #打开文件 (此处如果不加编码格式,windows默认编码是gbk,而python默认是utf8 #的)所以需要指定编码用utf-8打开文件 data = f.read() #文件打开了只是一个内存对象,所以需要赋变量的形式进行操作 data2 = f.read() #上边读完了,此时在读的话是从末行开始读,所以这里读的内容是空的。 print(data) print('data2:',data2) #打印内容为空理解(读文件的时候相当于是有个光标的东东,python会记录光标的位置,我们要想从任意位置 #读取的话就可以通过操作光标实现) ''' #写 ''' f = open('yesterday2','w',encoding='utf-8') #写的话需要在open中加上打开文件的模式'w'(默认读模式) f.write('I love you Fiona,\n') #open模式中只写‘w’相当于是创建一个文件*慎用*,会把原文件清空 f.write('very much') #第一行内容不带\n的话会写在同一行 ''' ''' #'a' 追加的话需要在open中加上打开文件的模式(默认读模式),相当于append(在末尾增加) f = open('yesterday2','a',encoding='utf-8') f.write('hahhhhhhh\n') f.write('luhaluhaluha') f.close() #写完文件要把文件关闭 ''' #读2行 ''' #readlin默认读文件中的一行 f = open('yesterday','r',encoding='utf-8') print(f.readline()) print(f.readline()) ''' #读5行,可以用循环 ''' f = open('yesterday','r',encoding='utf-8') for i in range(5): print(f.readline().strip()) #strip可以去除两边的换行和空格 ''' #需求:读多行,readlines读所有的文件,在第10行的位置打印一个分割线 ''' f = open('yesterday','r',encoding='utf-8') #print(f.readlines()) #读所有的行放到一个列表 #print(list(enumerate(f.readlines()))) #解决:通过for循环可以把这个列表的数据取出来,通过enumerate将列表的下标和值存成元组形式,然后在赋两个值 for index,line in enumerate(f.readlines()): if index ==9: print('我是分割线') continue print(line.strip()) ''' #需求,readlines只适合读小文件,读大文件怎么办 :读一行删一行,内存只存一行 #此时文件变成了一个迭代器,无法通过枚举取下标了 ''' f = open('yesterday','r',encoding='utf-8') count = 0 for line in f: if count == 9: print('我是分割线') count += 1 continue print(line) f.close() '''
#pycharm 5.0.3(python3.6) #需求:怎么将光标移动,获取想要打印的内容呢? f = open('yesterday','r',encoding='utf-8') print(f.tell()) #打印光标位置 ,按字符的个数计数 print(f.readline()) print(f.readline()) print(f.readline()) print('总共读了几个字符:',f.tell()) print('光标返回到第几个字符:',f.seek(0)) #一般是0,回到头,像tty等设备是无法移动 print(f.readline()) print('判断光标是否可移动:',f.seekable()) print('打印文件的编码:',f.encoding) print('反应文件句柄在内存的编号:',f.fileno()) #返回文件句柄在内存中的编号 print('打印文件名称:',f.name) print('是不是终端设备:',f.isatty()) print('判断文件是否可读:',f.readable()) print('判断文件是否可写:',f.writable()) print('强制刷新:',f.flush()) #将缓存中的数据立马写入硬盘,系统默认会等到缓存满了才写到硬盘中 print('判断文件是否关闭:',f.closed) print('关闭文件',f.close()) print('判断文件是否关闭:',f.closed) #print('清空',f.truncate()) 打开文件模式‘a’ 从头开始截断,
#进度条实现 import sys,time #导入系统和时间模块 for i in range(20): sys.stdout.write('#') sys.stdout.flush() #刷到内存上 time.sleep(0.1) #隔01秒打印1次
#pycharm 5.0.3(python3.6) #文件的读写 ''' f = open('yesterday','r+',encoding='utf-8') print(f.readline()) print(f.readline()) print(f.readline()) f.write('====================')#只能写到最后 print(f.readline()) ''' #文件的写读 ''' f = open('yesterday3','w+',encoding='utf-8') f.write('=========wo==========\n') f.write('=========wo==========\n') f.write('=========wo==========\n') f.write('=========wo==========\n') print(f.tell()) f.seek(10) print(f.readline()) f.write('ninini') #只能写在末尾,与硬盘存储机制有关 f.close() ''' #追加读 a+ #以二进制方式读[FTP传输、网络传输、视频文件] ''' f = open('yesterday3','rb') print(f.readline()) ''' #以二进制方式写 f = open('yesterday3','wb') f.write('hello world\n'.encode()) f.closed #追加二进制,ab
#pycharm 5.0.3(python3.6) #方式一、vim的方式,将文件全部加载到内存,然后全部保存到内存中 #方式二、修改好以后写到新的文件 # (边读边写),需要打开两个文件 f = open('yesterday','r',encoding='utf-8') f_new = open('yesterday.bak','w',encoding='utf-8') for line in f: if 'me' in line: line = line.replace('me','Felix') f_new.write(line) f.closed() f_new.closed()
四、参考
http://www.cnblogs.com/apff/p/7455410.html
http://www.cnblogs.com/alex3714/articles/5717620.html <博主博客记录>
http://www.runoob.com/
注:本笔记基于“老男孩python14期百度传课视频”,地址:https://chuanke.baidu.com/v3628575-182242-1134376.html