1. 小知识点的补充
==数值比较
is比较两边的内存地址
id获取内存地址
小数据池str int,公用一个内存,目的节省内存空间。
要求:A. int范围是-5到256,指向一个地址空间
B. str: 1.不能含有特殊字符
2.单个元素乘以数字不能超过21
2. 编码
字符:看到内容的最小单位。比如:
abc:a一个字符
中国:中
Ascii码:1个字节,字母,数字,特殊字符
Unicode:也称万国码,最开始2个字节表示一个字符,后升级到4个字节表示一个字节
Utf-8:最后用8位表示一个字符。英文字母:8位;欧洲:16位;亚洲中国:3个字节
Gbk:国际标准,英文和中文都占用2个字节
² 不同编码之间的二进制是不能识别的
² 对文件的存储及传输不能用unicode
编码之间的转换:python3
Str:内存中编码用unicode
表现形式s1=’alex’ s2='中国
Bytes:拥有str所有的操作方法,但内部编码(不是unicode,可以是utf-8,gbk…..)
如果使用utf-8编码,表现形式s1= b'alex' s2= b'xe4xb8xadxe5x9bxbd
Stràbytes
中文
s1='中国'
b1=s1.encode('utf-8')
print(b1): b'xe4xb8xadxe5x9bxbd'
英文:
s1='english'
b1=s1.encode('utf-8')
print(b1) b'english'
bytes---> str decode 解码
s2 = b1.decode('utf-8')
print(s2)--- English
在utf-8和gbk中,英文都是引用的ASCII的格式,所以可以识别
Unicode utf-8 gbk三者之间的转换关系
Utf-8转化为gbk
s4='中国'-------unicode格式
b4=s4.encode('utf-8')
g4=b4.decode('utf-8').encode('gbk')
3.集合
主要用于关系测试和列表去重复
3.1列表去重复:
list1 = [1,2,2,3,3,4,4,5]
print(set(list1))-------------{1, 2, 3, 4, 5}
list1=set(list1)
list1=list(list1)
print(list(list1)) -------------[1, 2, 3, 4, 5]
3.2集合的增删改查
3.2.1#增
set1={'wusir','oldboy','ritian'}
set1.add('taibai')------ {'ritian', 'oldboy', 'taibai', 'wusir'}(也可以看出来是无序的)
set1.update('abc')----- {'a', 'oldboy', 'b', 'c', 'ritian', 'wusir'} 相当于无序
3.2.2#删
set1.pop()---------随机删除某一元素
set1.remove('ritian')---------按照元素删除
set1.clear()---------清空列表,返回值为空集合set()
del set1-------删除集合
3.2.3#改,集合是无序的,所以无法更改
3.2.4#查,只能用for循环
for i in set1:
print(i)
打印结果:
ritian
wusir
oldboy
3.3集合的关系测试
set1 = {1,2,3,4,5}
set2 = {4,5,6,7,8}
3.3.1交集:
print(set1&set2)# {4, 5}
print(set1.intersection(set2))# {4, 5}
3.3.2 并集
print(set1|set2) # {1, 2, 3, 4, 5, 6, 7, 8}
print(set1.union(set2)) # {1, 2, 3, 4, 5, 6, 7, 8}
3.3.3 差集 set1独有的
print(set1-set2) #{1, 2, 3}
print(set1.difference(set2)) #{1, 2, 3}
3.3.4 反交集
print(set1^set2) #{1, 2, 3, 6, 7, 8}
print(set1.symmetric_difference(set2)) #{1, 2, 3, 6, 7, 8}
3.3.5 父子集 返回bool值
set1={1,2,3}
set2={1,2,3,4,5}
print(set1<set2) #True
print(set1.issubset(set2)) #True
3.3.6超集 返回bool值
set1={1,2,3}
set2={1,2,3,4,5}
print(set2>set1) #True
print(set2.issuperset(set1)) #True
4.深浅copy
4.1赋值运算:公用一个内存地址
s1=[1,2,3]
s2=s1
s1.append(666)
print(s1,s2)# [1, 2, 3, 666] [1, 2, 3, 666]
4.2浅copy:第一层独立,第二层至第n层共用内存
s1=[1,2,3]
s2=s1.copy()
s1.append(666)
print(s1,s2)# [1, 2, 3, 666] [1, 2, 3]
s1=[1,2,3,[11,22]]
s2=s1.copy()
s1[-1].append(666)
print(s1,s2)# [1, 2, 3, [11, 22, 666]] [1, 2, 3, [11, 22, 666]]
4.3深copy,无论多少层都各自独立
需引入copy模块
import copy
s1=[1,2,3,[11,22]]
s2=copy.deepcopy(s1)
s1[-1].append(666)
print(s1,s2)# [1, 2, 3, [11, 22, 666]] [1, 2, 3, [11, 22]]
4.4 切片为浅copy
s1=[1,2,3,[11,22]]
s2=s1[:]
s1[-1].append(666)
s1.append(10)
print(s1,s2)# [1, 2, 3, [11, 22, 666], 10] [1, 2, 3, [11, 22, 666]]
5 文件操作
5.1 文件的打开
5.1.1 参数
文件路径:path
编码方式encoding:gbk,utf-8
操作方式mode:读,写,读写,写读,追加,改。。。。。
Open()调用操作系统(windows,linux,苹果)内部的open
f1=open(r'E:/老男孩/day-3/test.txt',encoding='utf-8',mode='r')
#前面加r进行特殊字符转换,一般建议加上
print(f1.read())
f1.close()
5.1.2文件句柄
可用如下句柄:f,file,file_hander,f_h....
一切都文件的打开都是基于文件句柄
5.1.3执行流程
1,打开文件,产生文件句柄。
2,对文件句柄进行操作。
3,关闭文件句柄。
5.2 模式
5.2.1读写追加模式
读:r rb r+(读写) r+b
# Open()的默认模式,不指定mode的时候,则为r
写:w wb w+(写读)
追加:a ab a+ a+b
带b为操作为非文字文件比如视频,图片,不需指定编码,以bytes类型读取。
f1 = open('1.jpg', mode='rb')
5.3读的操作方法
5.3.1 read()全部读出来
5.3.2 read(n)
如果为文本文件,一次读n个字符
如果为非文本文件,一次读n个字节。也就是rb模式的时候。
5.3.3 readline() 读一行按行读取
5.3.4 readlines() 全部读出来,生成列表,每一行是一个元素
5.3.5 for循环
for line in f1:
print(line)
总结:方法read(),read(n),readline(),readlines(),都占用内存,如果文件比较大的时候,容易引起内存崩溃。建议用for循环。
5.4写的操作方法
只有write()一种操作方法,见写(w)就先清空文件
w模式,没有文件,新建文件然后写入;有原文件,则先清空再写入。
5.4.1文本文件的写
f1=open('log1.txt',encoding='utf-8',mode='w')
f1.write('oldboy Sunday')
f1.close()
5.4.2图片的读写 wb
f1=open('1.jpg',mode='rb')
content=f1.read()
f2=open('2.jpg',mode='wb')
f2.write(content)
f1.close()
f2.close()
5.5追加 a
有文件,追加内容;无文件,创建文件
f1=open('log1.txt',encoding='utf-8',mode='a')
f1.write(' taibai')
f1.close()
5.6读写模式r+,读模式+写的功能
f1=open('log1.txt',encoding='utf-8',mode='r+')
f1.read()#读到最后,所以光标移动到最后,所以alex在最后添加
f1.write('alex')
f1.close()
5.7模式w+,写读模式,意义不大
5.8模式a+,先追加再写
5.9其它操作方法
flush写一部分就保存一部分
readable()判断文件是否可读,返回True或者False
writeable()是否可写
tell()获取光标在哪:f1.tell()
seek()获取光标的位置:f1.seek(0,2)光标调整到末尾
f1.seek(0)调整到开头
f1.seek(n)光标调整到n
truncate()数据截取:安装字节对原文件进行截取,必须为a或者a+模式
f1=open('log1.txt',encoding='utf-8',mode='a+')
f1.truncate(5)
f1.close()
最后文件log1.txt只留下了前5个字节的内容
5.10 with open的使用
5.10.1
1.在一定时间内自动关闭句柄
2.可同时打开多个句柄
3. 有的时候对多个句柄同时进行操作的时候,容易出问题,建议人工关闭句柄
with open('log1.txt',encoding='utf-8',mode='r') as f1,
open('log2.txt',encoding='utf-8',mode='w') as f2:
print(f1.read())
f2.write('6666')
5.11文件的改的流程
1,以读模式打开原文件。
2,以写的模式打开一个新文件。
3,将原文件读出按照要求修改将修改后的内容写入新文件。
4,删除原文件。
5,将新文件重命名原文件
import os
with open('file', encoding='utf-8') as f1,
open('file.bak', encoding='utf-8', mode='w') as f2:
old_content = f1.read()
new_content = old_content.replace('alex', 'beijing')
f2.write(new_content)
os.remove('file')
os.rename('file.bak', 'file')
5.12模式w,为关闭句柄,不会清空内容,会一直写入
with open('log3.txt',encoding='utf-8',mode='w') as f1:
f1.write('1111')
f1.write('2222')
f1.write('ssss')
log3.txt内容为11112222ssss
6.函数
6.1函数初识
6.1.1函数格式
def 关键字 函数名():
函数体
6.1.2函数执行:函数名()
函数:以功能为导向
6.1.3 return语句
1. 终止函数
2. 给函数的执行者返回值
return 返回none
return 单个值
return 多个值,返回为元组,例如(‘alex’,666,[1,3])
6.2函数参数
形参 def my_len()
实参 my_len()
6.2.1实参
1. 位置参数:形参必须与之一一对应
def func1(a,b,c):
print(a,b,c)
func1(1,2,'alex')
2.关键字参数:func1(a=3,b=2)可以不按顺序,必须一一对应
def func1(a,b,c):
print(a,b,c)
func1(a=1,b=2,c='alex')
3.混合参数:(位置参数,关键字参数)
关键字参数必须放在位置参数后面
6.2.2形参
1.位置参数:按顺序与实参一一对应
def func1(a,b,c):
print(a,b,c)
func1(1,2,'alex')
2.默认参数:默认参数放在位置参数后面
def func2(a,b,c='3'):
print(a,b,c)
func2(1,2,5)或func2(1,2)
3.动态参数:也叫万能参数,约定俗称用这两个*args,**kwargs
*args:所有位置参数,放在元组中
**kwargs:所有关键字参数,放在字典中
*代表聚合
def func3(*args,**kwargs):
print(args)
print(kwargs)
func3(1,2,3,a=1,b=2)
输出结果
(1, 2, 3)
{'a': 1, 'b': 2}
*在函数执行的时候代表打散
func3(*[1,2,3],**{'name':'alex'},**{'age':25})
输出结果:
(1, 2, 3)
{'name': 'alex', 'age': 25}
6.3 形参的执行顺序
位置参数 *args,默认参数,**kwargs
def func4(a,b,*args,sex=’男’,**kwargs)
6.4补充 三元运算
def max(a, b):
if a > b:
return a
else:
return b
比较麻烦,可以进化为一句话
def max(a,b):return a if a>b else b