一、列表、元祖操作
列表是我们最常用的数据类型之一,通过列表可以对数据实现最方便的存储、修改等操作
定义一个列表
name = ['alex','tenglan','egg','eva_j']
通过下标访问列表中的元素,下标从0开始计数
print(name[0]) #结果输出alex print(name[2]) #结果输出egg print(name[-1]) #结果输出eva_j print(name[-2]) #结果输出egg
通过切片取多个元素:
names = ["Alex","Tenglan","Eric","Rain","Tom","Amy"] print(names[1:4]) #取下标1至下标4之间的数字,包括1,不包括4 #执行结果['Tenglan', 'Eric', 'Rain'] print(names[1:-1]) #取下标1至-1的值,不包括-1 #执行结果['Tenglan', 'Eric', 'Rain', 'Tom'] print(names[0:3]) #执行结果['Alex', 'Tenglan', 'Eric'] print(names[:3]) #如果是从头开始取,0可以忽略,跟上句效果一样 #执行结果['Alex', 'Tenglan', 'Eric'] print(names[3:]) #如果想取最后一个,必须不能写-1,只能这么写 #执行结果['Rain', 'Tom', 'Amy'] print(names[0::2]) #后面的2是代表,每隔一个元素,就取一个 #执行结果['Alex', 'Eric', 'Tom'] print(names[::2]) #和上句效果一样 #执行结果['Alex', 'Eric', 'Tom']
追加:
names = ["Alex","Tenglan","Eric","Rain","Tom","Amy"] names.append("我是新来的") print(names) #执行结果['Alex', 'Tenglan', 'Eric', 'Rain', 'Tom', 'Amy', '我是新来的']
插入
names = ["Alex","Tenglan","Eric","Rain","Tom","Amy"] names.insert(2,"我是插队的") print(names) #执行结果['Alex', 'Tenglan', '我是插队的', 'Eric', 'Rain', 'Tom', 'Amy']
修改
names = ["Alex","Tenglan","Eric","Rain","Tom","Amy"] names[2]="换人了" print(names) #执行结果['Alex', 'Tenglan', '换人了', 'Rain', 'Tom', 'Amy']
删除
names = ["Alex","Tenglan","Eric","Rain","Tom","Amy"] del names[4] #通过下标删除元素 print(names) #执行结果['Alex', 'Tenglan', 'Eric', 'Rain', 'Amy'] names.remove('Eric') #删除指定元素 print(names) #执行结果['Alex', 'Tenglan', 'Rain', 'Amy'] names.pop() #删除列表最后一个值 print(names) #执行结果['Alex', 'Tenglan', 'Rain']
扩展
names = ["Alex","Tenglan","Eric","Rain","Tom","Amy"] b = [1,2,3] names.extend(b) print(names) #执行结果:['Alex', 'Tenglan', 'Eric', 'Rain', 'Tom', 'Amy', 1, 2,
拷贝
names = ["Alex","Tenglan","Eric","Rain","Tom","Amy"] name_copy = names.copy() print(name_copy) #执行结果['Alex', 'Tenglan', 'Eric', 'Rain', 'Tom', 'Amy']
统计
names = ["Alex","Tenglan","Eric","Rain","Tom","Amy"] print(names.count('Alex')) #统计列表中有多少个Alex #执行结果1
排序&翻转
names = ["Alex","Tenglan","Eric","Rain","Tom","Amy"] names.sort() print(names) #执行结果['Alex', 'Amy', 'Eric', 'Rain', 'Tenglan', 'Tom'] names.reverse() print(names) #执行结果['Tom', 'Tenglan', 'Rain', 'Eric', 'Amy', 'Alex']
获取下标
names = ["Alex","Tenglan","Eric","Rain","Tom","Amy"] print(names.index('Tom')) #执行结果4
元组
元组其实跟列表差不多,也是存一组数,只不是它一旦创建,便不能再修改,所以又叫只读列表
他只有两个方法,一个是count统计个数,一个是index获取下标
二、字符串操作
特性:不可修改
#字符串的索引与切片 s = 'sadfwedfasdf' #索引 print(s[0]) #通过索引取第一位字符 #字符串切片 print(s[0:4]) #通过切片取前四位 (顾头不顾尾) print(s[-1]) #通过-1来取字符串的最后一位 print(s[0:]) #取所有的字符 print(s[:]) #两边什么都不写,也可以取全部 print(s[0:5:2]) #取前五个字符,每两个取一个,2位步长[首:尾:步长] print(s[4:0:-1]) #通过步长设置-1,吧首尾换一下,来实现字符串倒着写 #字符串的操作 s = 'alExwusir' s1 = s.capitalize() #让字符串首字母大写,其它全部小写 print(s1) s2 = s.upper() #让字符串全部变成大写 s21 = s.lower() #让字符串全部小写 print(s2) s3 = s.swapcase() #让大小写翻转 print(s3) t = 'alex egon wusir' t1 = t.title() #让每个特殊字符隔开的单子首字母大写 print(t1) s4 = s.center(20,'#') #让字符串在20个字符的位置居中显示,空白填充物为# print(s4) s5 = s.expandtabs() #如果字符串中有 选项,输出结果自动加上tab的空格 print(s5) s6 = len(s) #获取字符串长度,元祖,字典,列表同样适用 print(s6) #通过前端传来一个字符串,通过判断前边三个字母的不同来进行不同的操作 s7 = s.startswith('al') #判断字符串是否已al开头 s71 = s.startswith('e',2,5) #判断字符串的第三位到第五位是否是以e开头 print(s71) s8 = s.find('l') #查找字符串中l的索引,找不到则返回-1,可切片在找 print(s8) s9 = s.index('l') #查找字符串中l的索引,找不到则回报错 print(s9) s = '*alExwusir% ' s10 = s.strip() #去掉字符串中前后所有的空格 s101 = s.strip('#') #去掉字符串中前后的#号 s102 = s.strip('* %') #中间得符号 可以不同,结果也会吧前后的删掉 s103 = s.rsplit('%') #删除字符串右边的*号 s104 = s.lstrip('*') #删除字符串左边的*号 print(s103) s11 = s.count('al') #统计字符串中有多少个al(可切片在找) print(s11) s = ':alex:egon:wusir' s12 = s.split() #默认以空格为分割符来分割字符串 s121 =s.split(':') #已冒号为分隔符来分割字符串 print(s121) #format的三种玩法,格式化输出 s = '我叫{},今年{},爱好{},再说一下我叫{}'.format('name',25,'test','name') print(s) s1 = '我叫{0},今年{1},爱好{2},再说一下我叫{0}'.format('name',25,'test') print(s1) s2 = '我叫{name},今年{age},爱好{hobby},再说一下我叫{name}'.format(name='name',age=25,hobby='test') print(s2) #替换 s = '你说什么就是什么好的哈东西南北东' s1 = s.replace('就是','好的哈',1) #替换字符串中的第一个就是为好的哈 print(s1) #is系列 name = 'jjjjoa234' print(name.isalnum()) #判断字符串是否有字母或数字组成 print(name.isalpha()) #判断字符串是否有字母组成 print(name.isdigit()) #判断字符串是否有数字组成 #for循环 s = 'fhdsklfds' for i in s: print(i)
三、字典操作
字典一种key - value 的数据类型,使用就像我们上学用的字典,通过笔划、字母来查对应页的详细内容。
语法:
info = { 'stu1101': "TengLan Wu", 'stu1102': "LongZe Luola", 'stu1103': "XiaoZe Maliya", }
字典的特性:
dict是无序的
key必须是唯一的,天生去重
#dict: ''' #数据类型划分:可变数据类型,不可变数据类型 不可变数据类型:元祖、bool、数字、str 可哈希 可变数据类型:列表、字典 、集合 不可哈希 字典的key必须是不可变数据类型,可哈希 字典的值value可以是任意数据类型 字典的优势: 1、二分查找去查询 2、存储大量的关系型数据 特点:无序的 ''' dic = { 'name':'张三', 'age':25, 'sex':'女' } #字典增加 dic['high'] = 185 #若原字典有high这个key,则会修改原有的值 dic['age'] = 20 dic.setdefault('weight',140) #添加元素,默认值是none print(dic) #字典删除 dic.pop('weight') #删除key为weight的键值对,是有返回值的,返回值为键值对的值,如果需删除的key在字典中没有,则会报错 dic.pop('二哥','没有此键') #如果添加一个值则就算字典中没有二哥这个key也不会报错 print(dic) dic.popitem() #随机删除一个键值,3.6版本之后从后往前删除 print(dic) del dic['name'] #删除键值对 print(dic) #dic.clear() #清空字典 #字典修改 dic['age'] = 18 #对值的修改 print(dic) dic = { 'name':'张三', 'age':25, 'sex':'女' } dic2 = { 'name':'张三', 'age':25, 'sex':'女', 'weight':140, 'hight':180 } dic2.update(dic) #把dic更新到dic2,相同的键值对覆盖,没有的添加 print(dic2) #字典查找 print(dic.keys()) #打印字典中的键为一个列表 print(dic.values()) #打印字典中的值为一个列表 print(dic.items()) #打印字典中的键值为一个元祖,所有元祖组成一个列表 for i in dic2: #什么都不写,默认打印键的值 print(i) for i in dic.items(): #打印键值对 print(i) print(dic['name']) #打印键对应的值 #字典嵌套 dic = { 'name':['alex','wusir'], 'py9':{ 'time':'1213', 'xuefei':19800, 'addr':'CBD' }, 'age':21, } dic['age'] = 56 dic['name'].append('ritian') dic['name'][1] = dic['name'][1].upper() dic['py9'].setdefault('女生',6) print(dic)
四、集合操作
集合是一个无序的,不重复的数据组合,它的主要作用如下:
去重,把一个列表变成集合,就自动去重了
关系测试,测试两组数据之间的交集、差集、并集等关系
s = set([3,5,9,10]) #创建一个数值集合 t = set("Hello") #创建一个唯一字符的集合 a = t | s # t 和 s的并集 b = t & s # t 和 s的交集 c = t – s # 求差集(项在t中,但不在s中) d = t ^ s # 对称差集(项在t或s中,但不会同时出现在二者中) 基本操作: t.add('x') # 添加一项 s.update([10,37,42]) # 在s中添加多项 使用remove()可以删除一项: t.remove('H') len(s) set 的长度 x in s 测试 x 是否是 s 的成员 x not in s 测试 x 是否不是 s 的成员 s.issubset(t) s <= t 测试是否 s 中的每一个元素都在 t 中 s.issuperset(t) s >= t 测试是否 t 中的每一个元素都在 s 中 s.union(t) s | t 返回一个新的 set 包含 s 和 t 中的每一个元素 s.intersection(t) s & t 返回一个新的 set 包含 s 和 t 中的公共元素 s.difference(t) s - t 返回一个新的 set 包含 s 中有但是 t 中没有的元素 s.symmetric_difference(t) s ^ t 返回一个新的 set 包含 s 和 t 中不重复的元素 s.copy() 返回 set “s”的一个浅复制
五、文件操作
文件只读 mode = 'r' f = open('模特主妇护士班主任.txt',mode='r',encoding='utf-8') #打开文件 cont = f.read() #读取文件 print(cont) f.close() #关闭文件 打开非文字的文件或上传下载可用rb模式,已bytes类型模式打开文件 f = open('模特主妇护士班主任.txt',mode='rb',) cont = f.read() print(cont) f.close() 文件只写:对于写,没有此文件,则创建文件,如有文件则清空里边的内容后再添加需要写入的内容 mode = 'w' f = open('log',mode='w',encoding='utf-8') f.write('要的,好的哈 ,没问题') f.close() f = open('log',mode='wb') f.write('要的,好的哈 ,没问题'.encode('utf-8')) #使用wb时,在写的时候需要制定文件编码格式 f.close() 文件追加 f = open('log',mode='a',encoding='utf-8') #默认光标在文件最后 # f.write('fujinkandao de ') # f.close() # # f = open('log',mode='ab',) # f.write('ceshi'.encode('utf-8')) # f.close() 文件读写也有bytes类型mode='r+b' ,只会读写,后边不会做操作 f = open('log',mode='a+',encoding='utf-8') cont = f.read() f.write("119.84.155.118,123.151.77.12,101.226.226.247,101.226.226.167,61.151.173.71,61.151.186.145,113.96.230.31,123.151.76.43,113.96.230.24,101.226.226.213,119.84.155.78,113.96.230.37,119.84.155.92,113.96.230.63,61.151.186.211,123.151.144.20,61.151.173.78,61.151.186.199,61.151.186.198") f.write("119.84.155.118 123.151.77.12 101.226.226.247 101.226.226.167 61.151.173.71 61.151.186.145 113.96.230.31 123.151.76.43 113.96.230.24 101.226.226.213 119.84.155.78 113.96.230.37 119.84.155.92 113.96.230.63 61.151.186.211 123.151.144.20 61.151.173.78 61.151.186.199 61.151.186.198") f.write("101.226.212.107 180.97.117.100 61.151.168.227 180.97.117.108 14.215.140.25 14.215.140.24 14.215.140.21 183.61.38.193 101.226.76.160 61.151.168.141 180.97.117.101 113.96.232.48 101.91.63.156 183.61.38.202 180.97.9.122 101.91.63.158 180.97.8.103 61.151.183.44 101.91.63.157 101.226.90.145 113.96.232.100 183.3.233.232 183.61.38.245 113.96.232.105 180.97.117.116 180.97.9.11 180.97.117.50 183.36.108.166 61.151.206.58 14.215.140.53 180.97.9.100 14.17.41.196 180.97.9.125 180.97.9.124 180.97.9.123 183.36.108.188 113.96.208.21 113.96.208.23 113.96.208.22") f.write("61.151.182.237 61.151.182.238 61.151.173.26 61.151.173.25 61.151.182.236 59.36.120.65 61.151.182.235 61.151.182.233 61.151.182.234 61.151.173.108 61.151.172.55 61.151.173.11 183.3.255.181 61.151.173.110 61.151.172.165 61.151.172.164 183.3.255.179 61.151.173.109 61.151.172.163 183.3.255.180") f.write("119.84.152.100 101.226.99.191 183.61.37.191 183.61.37.193 14.215.152.171 14.215.152.170 123.151.65.110 123.151.65.111 123.151.65.112 119.84.152.36 123.151.93.77 180.163.8.14 123.151.179.102 180.163.30.155 180.163.30.156") f.close() 文件写读(先清除再写,读的时候也只会从光标的位置读) f = open('log',mode='w+',encoding='utf-8') f.write('ceshiceshi') f.seek(0) #调整光标到最前面 cont = f.read() print(cont) 文件追加(写读) f = open('log',mode='a+',encoding='utf-8') f.write('jiaqi') f.seek(0) print(f.read()) f.close() 功能详解 f = open('log',mode='r+',encoding='utf-8') cont = f.read(3) #打印前三个字符,读出来的都是字符 f.seek(6) #seek是按照字节定光标的位置,中文一个字为三个字节 print(f.tell()) #查看现在光标所在的位置 cont = f.readable() #判断文件是不是可读的返回true或false cont = f.readline() #一行一行的读,想读第二行 cont = f.readlines() #多行读,把所有行读成列表,每行一个元素 f.truncate(5) #对源文件截取前五位 for line in f: print(line) f.close() with open( 'log',mode='r+',encoding='utf-8') as f,open('模特主妇护士班主任.txt') as h: #用这种方法可以不用在文件操作后边写关闭文件,且可以同时打开多个 print(f.read()) print(h.read())read import os os.remove('log') # 删除文件 os.rename('模特主妇护士班主任.txt','log1') #修改文件名
with语句
为了避免打开文件后忘记关闭,可以通过管理上下文,即:
with open('log',mode='r',encoding='utf-8') as f: #通过对文件句柄f的操作来操作文件