python基础数据类型2
part6
代码块:
-
代码块:我们所有的代码都需要依赖代码块来执行
-
一个文件就是一个代码块
-
交互式命令下一行就是一个代码块
-
两个机制:
-
同一个代码块下有一个机制,不同代码块下有例外一个机制
-
前提条件:同一个代码块下
-
Python在执行同一个代码块的初始化对象的命令时,会检查是否其值是否已经存在,如果存在,会将其重用。(目的:节省内存,提升性能)
-
适用的对象:int(float),str,bool.(包括元组tuple)
-
具体细则:所有的数字,bool,几乎所有的字符串
不同代码块下的缓存机制:小数据池
-
前提条件:不同代码块
-
就是将~5-256的整数,和一定规则的字符串,放在一个‘池’(容器,或者字典)中
-
适用对象:int(float),str,bool(不包括元组)
-
具体细则:-5~256数字,bool,满足规则的字符串
-
优点:提升性能,节省内存
集合(set),枚举:
-
容器型数据类型,他要求它里面的元素是不可变的数据,但是它本身是可变的数据类型。集合是无序的。{}
-
集合的作用:
-
列表的去重(因为他的底层是用c写的)
-
关系测试:交集,并集,差集,。。
3.集合的创建:
1.方式1:set1=set({1,3,'Barry',False})
2.方式2直接创建:set1={1,3,4,'Barry',False,'哈哈'}
4.集合的增:1.add()2.update()迭代着增加
5.删:1.remove()按照元素删除2.pop()随机删除
- 集合的其他操作:
#1.交集
#print(set1.intersection(set2))
#2.并集
#print(set1.union(set2))
#3.差集
#print(set1.difference(set2))
#4.反交集
#print(set1.symmetric_difference(set2))
#5.子集
#set1={1,2,3}
#set2={1,2,3,4,5,6}
#print(set1<set2)
#6.超集
#print(set2>set1)
- 补充:枚举类型:对于一个可迭代的(iterable)/可遍历的对象(如列表、字符串),enumerate将其组成一个索引序列,利用它可以同时获得索引和值。
li = ['alex','银角','女神','egon','太白']
for i in enumerate(li):
print(i) #(0, 'alex') (1, '银角') (2, '女神') (3, 'egon') (4, '太白')
for index,name in enumerate(li,1): #元组拆包
print(index,name)
for index, name in enumerate(li, 100): # 起始位置默认是0,可更改
print(index, name)
深浅copy:
-
浅copy:list/dict:嵌套的可变数据类型是同一个
-
深copy:list/dict:嵌套的可变数据类型不是同一个
-
浅copy:对于浅copy来说,只是在内存中重新创建了开辟了一个空间存放一个新列表(存放元素的地址),但是新列表中的元素与原列表中的元素是公用的。
-
深copy:对于深copy来说,列表是在内存中重新创建的,列表中可变的数据类型是重新创建的,列表中的不可变的数据类型是公用的。
part7:
基础数据类型补充:
str:
s1='taiBAi'
1.capitalize()首字母大写,其余变小写
2.swapcase()大小写翻转
3.title()每个首字母大写(只要是以非字母元素隔开)
4.center()居中:例如print(s1.center(20,'*'))
5.find()根据元素找到索引,找到就返回,找不到就返回-1
index()根据元素找到索引,找到就返回,找不到就报错
tuple:
1.元组中如果只有一个元素,并且没有逗号,那么他不是元组,他与该元素的数据类型一致***
2.count()计数
- list:
1.count()pass
2.index()pass
3.sort()对原列表进行排序默认从小到大当l1.sort(reverse=True)时,从大到小**
4.reverse()反转**
5.+列表相加返回一个新的列表
6.*列表相乘返回一个新的列表
7.在循环一个列表时的过程中,如果你要改变列表的大小(增加值,或者删除值),那么结果很可能会出错或者报错。
- dict:
1.update()***有则覆盖,无则更新
dic={'name':'张三','age':18}
1.dic.update(hobby='运动',high='175')
2.dic.update([(1,'a'),(2,'b'),(3,'c'),(4,'d')])#面试会考
dic2={"name":"alex","weight":75}
3.dic.update(dic2)
2.fromkeys()来自键
- 在循环一个字典的过程中,不要改变字典的大小(增,删字典的元素),这样会直接报错。
编码的进阶
- A:英文:
str:'hello'
内存中表现方式:Unicode
表现形式:'hello'
bytes:
内存中表现方式:非Unicode
表现形式:b'hello'
- B:中文:
str:'中国'
内存中表现方式:Unicode
表现形式:'中国'
bytes:
内存中表现方式:非Unicode(utf-8)
表现形式:b'xe4xb8xadxe5x9bxbd'
str-->bytes
s1='中国'
b1=s1.encode('utf-8')#encode()编码
print(b1,type(b1))
bytes-->str
b1=b'xe4xb8xadxe5x9bxbd'
s2=b1.decode('utf-8')#decode()解码
print(s2)
gbk-->utf-8(需要借助Unicode进行转换)
b1=b'xd6xd0xb9xfa'
s=b1.decode('gbk')
print(s)
b2=s.encode('utf-8')
print(b2)
part8:
文件操作:
- 文件操作三部曲:
1.打开文件
2.对文件句柄进行相应的操作
3.关闭文件
f1=open('d:python文件操作初始.txt',mode='r',encoding='utf-8')
content=f1.read()
print(content)
f1.close()
1.文件操作的读:r,rb,r+,r+b四种模式(前两种常用)
A:mode='r'(r模式可以省略)
1.read()全读出来**
2.read(n)按照字符读取
3.readline(n)按照行读取
4.readlines()返回一个列表,列表中的每个元素是原文件的每一行
5.for循环读取***(f1在内存中只占一行,当访问下一行时,上一行消失)
f1=open('文件的读',mode='r',encoding='utf-8')
for line in f1:
print(line)
f1.close()
B:mode='rb':操作的是非文本的文件,图片,视频,音频 rb模式打开不用encoding
f=open('汽车.jpg',mode='rb')
content=f.read()
print(content)
f.close()
文件操作的写/追加/其他方式
- 文件的写:w,wb,w+,w+b四种模式(前两种重要)
- 没有文件,创建文件写入内容
f=open('文件的写',mode='w',encoding='utf-8')
f.write('随便写一点')
f.close()
-
如果文件存在,先清空原文件内容,再写入新的内容
-
wb模式
文件操作的追加:mode=a,ab,a+,a+b
-
没有文件,创建文件,追加文件
-
有文件,追加
-
读写mode='r+':先读后写(本质:读并追加)/顺序不能错
f=open('文件的读写',mode='r+',encoding='utf-8')
content=f.read()
print(content)
f.write('人的一切痛苦,本质都是对自己无能的愤怒')
f.close()
文件操作的其他功能/打开文件的例一种操作
1.tell()获取光标的位置单位:字节
f=open('文件的读写',encoding='utf-8')
print(f.tell())
content=f.read()
print(f.tell())
f.close()
2.seek(n)seek(0)开头,seek(0,2)最后
调整光标位置单位:字节
应用:网络并发时的断点续传
3.flush()强制刷新(相当于ctrl+s保存文件)
打开文件的例一种操作
-
优点1:不用手动关闭文件句柄
-
优点2:一个位置操作多个open(换行)
withopen('文件的读',encoding='utf-8')asf1,
open('文件的写',encoding='utf-8',mode='w')asf2:
print(f1.read())
f2.write('2455hashduay')
文件的改操作:
- 步骤:
1.以读的模式打开原文件
2.以写的模式创建一个新的文件
3.将原文件的内容读出来修改成新内容,写入新的文件
4.将原文件删除
5.将新文件重命名成原文件
- low版本
import os
withopen('alex自述',encoding='utf-8')asf1,
open('alex自述.bak',mode='w',encoding='utf-8')asf2:
old_content=f1.read()
new_content=old_content.replace('alex','SB')
f2.write(new_content)
os.remove('alex自述')
os.rename('alex自述.bak','alex自述')
- 进阶版:
import os
withopen('alex自述',encoding='utf-8')asf1,
open('alex自述.bak',mode='w',encoding='utf-8')asf2:
for line in f1:
new_line=line.replace('SB','alex')
f2.write(new_line)
os.remove('alex自述')
os.rename('alex自述.bak','alex自述')