小数据池就是在内存中已经开辟了一些特定的数据,经一些变量名直接指向这个内存,多个变量间公用一个内存的数据.
int: -5 ~ 256 范围之内
str: 满足一定得规则的字符串.
小数据池:
1,节省空间。
2,提高性能
深浅copy
赋值运算
l1 = ['wk', 'xixi', 'lol', 'xyq', [1, 2, 3]] l2 = l1 #l2就是l1 l1是什么,l2就是什么 l1.append('qqfc') l1[-2].append('heihei') print(l1) print(l2) ['wk', 'xixi', 'lol', 'xyq', [1, 2, 3, 'heihei'], 'qqfc'] ['wk', 'xixi', 'lol', 'xyq', [1, 2, 3, 'heihei'], 'qqfc']
浅copy
浅copy 第一层开辟的新的内存地址,但是从第二层乃至更深的层来说,公用的都是一个。 copy()
l1 = ['wk', 'xixi', 'lol', 'xyq', [1, 2, 3]] l2 = l1.copy() #浅拷贝 l1.append('qqfc') #在l1第一层结尾追加qqcc l1[-2].append('heihei') #在l1第二层追加heihei print(l1) print(l2) ['wk', 'xixi', 'lol', 'xyq', [1, 2, 3, 'heihei'], 'qqfc'] ['wk', 'xixi', 'lol', 'xyq', [1, 2, 3, 'heihei']] #结果第一层copy为新开辟的独立的内存空间,l1的追加在l2里没有,在第二层里是公用的,l1的追加l2里也有
深copy
深copy:复制两个完全独立的数据(多少层都是独立的) 使用深copy的引用copy模块.copy.deepcopy()
import copy #引用copy模块 l1 = ['wk', 'xixi', 'lol', 'xyq', [1, 2, 3]] l2 = copy.deepcopy(l1) #深copy l1.append('qqfc') l1[-2].append('heihei') print(l1) print(l2) ['wk', 'xixi', 'lol', 'xyq', [1, 2, 3, 'heihei'], 'qqfc'] ['wk', 'xixi', 'lol', 'xyq', [1, 2, 3]] #不管多少层发生改变,其l2都是独立的内存地址,内容不会发生变化
文件操作
open()内置函数,操作文件
f1文件句柄.f1,fh,file_handle,f....
f1 = open(r'C:Users22490Desktop新建文本文档 (9).txt', encoding='utf-8', mode='r') #打开文件产生句柄,对文件句柄进行相应的操作(读,写,追加,读写....)。
print(f1.read())
f1.close() #关闭文件句柄
导致文件错误的原因:
1.文件路径过长 导致路径有些字符有特殊意义, 解决方法:路径前+r转译
2.UXXXXXXXX escape; decodeincodeerror 错误 为文件编码的不一致 解决: encoding='utf-8'
读 (r r+ rb r+b )
r {read(), read(n), readline(), readlines(), for循环}
f1 = open('文件', encoding='utf-8',) print(f1.read()) #全读出来只针对一些小文件文件太大会撑爆内存 f1.close() 买了佛冷 好嗨呦 佛冷
f1 = open('文件', encoding='utf-8',) print(f1.read(2)) #r模式安字符读取 f1.close() 买了
f1 = open('文件', encoding='utf-8',) print(f1.readline()) #按行度 多个readline读多行,从上往下依次读但是每行结尾都有换行符
print(f1.readline())
f1.close()
买了佛冷
好嗨呦
f1 = open('文件', encoding='utf-8',) print(f1.readline().strip()) #结尾加上.strip()取消换行符 print(f1.readline().strip()) print(f1.readline().strip()) f1.close() 买了佛冷 好嗨呦 佛冷
f1 = open('文件', encoding='utf-8',) print(f1.readlines()) #返回一个列表,刘表中的每个元素为源文件的一行 f1.close()
'买了佛冷 ', '好嗨呦 ', '佛冷']
最常用for循环文件句柄读所有
f1 = open('文件', encoding='utf-8',) for line in f1: print(line.strip()) f1.close() 买了佛冷 好嗨呦 佛冷
readable()判断文件是否可读
f1 = open('文件4', encoding='utf-8', mode='w') print(f1.readable()) #mode为写入文件,因此readable判断为false False
rb
f1 = open('有点大.jpg',mode='rb') print(f1.read()) f1.close() xcbxf0FTx90xac{x90x0fxb6}>xb8xcdsx17Wxa5x86x01\
xb6xedxdf?@xbdOx07x93xcfxf4x15x81x7fxacxa9pxb1Hx08x1cxbxe3xb5
x13x1fxedg x9ccxf5xe9Xxcd~xf2xb3(%x97x04xf4xe0xe7xaexd6x03x9e? x
97.]xefxafnx9bzx1axc6 -5xf3xdbxfaxffx00x87
r+
r+就是先读后写,写入为追加写入,写入的内容必须是字符串
#如果先写后读则会是按字符串覆盖写入
f1 = open('文件4', encoding='utf-8', mode='r+') print(f1.read()) #先读 f1.write(' 1111111') #后写 f1.close()
写 (w wb w+)
w
没有文件创建文件写入
有文件先清空文件,后写入文件
f1 = open('文件2', encoding='utf-8',mode='w') f1.write('eve') f1.close()
writable()判断是否可写
f1 = open('文件4', encoding='utf-8', mode='r') print(f1.writable()) #判断文件是否可写入
False
.wb
用于下载非文字的文件(图片视频等)
f1 = open('有点大.jpg',mode='rb') #先以rb的模式打开读取一个文件 f2 = open('文件3.jpg', mode='wb') #再以wb的模式打开写入一个文件 f2.write(f1.read()) #将读取的f1的内容写入到f2 f1.close() #关闭f1 f2.close() #关闭f2
追加(a + ab a+b)
a
1.没有文件创建文件写入内容
2.有文件直接在后边追加(不换行)
f1 = open('文件4',mode='a') f1.write('hehe') f1.close()
换行追加 在加入内容前加上换行符
文件光标的操作
tell()查看文件光标所在位置(按字节)
f1 = open('文件4', encoding='utf-8', mode='r') print(f1.read(3)) #读取3字节文件 print(f1.tell()) #查看光标所在位置 f1.close() xix 3 #光标在第三字节
seek()调整光标的位置(按字节)
f1 = open('文件4', encoding='utf-8', mode='r') f1.seek(20) #光标调整至第20字节,从第20字节开始读取 print(f1.read())
with open('222', mode='r', encoding='utf-8') as f: print(f.read()) f.seek(0, 0) #等于f.seek(0) 表示光标移动至开头 f.seek(0, 1) #光标当前位置 f.seek(0, 2) #光标移动至末尾
truncate() 清空文件内容
f1 = open('文件4', encoding='utf-8', mode='r') f1.truncate()
with open
打开文件运行完操作后自动关闭文件,不需要再用close()函数
with open('222', mode='r+',encoding='utf-8') as f: print(f.read()) f.write(" xixi")
文件改的操作
word wps 记事本,nodpad++ ....
1,以读的模式打开原文件
2,以写的模式打开一个新文件
3,对原文件的内容进行修改,形成新内容写入新文件
4,删除原文件
5,将新文件重命名为原文件。
将文件里的佛改为神
import os #调用os模块修改系统的文件 with open('文件', encoding='utf-8', mode='r') as f1, #打开读取文件 open('文件2',encoding='utf-8', mode='w') as f2: #打开写入文件2 for i in f1: #for循环每行文件赋值i new = i.replace('佛','神') #通过replace()修改字符串方法将每行的佛改为神 f2.write(new) #将修改后的内容写入到文件2中
os.remove('文件') #删除原文件 os.rename('文件2','文件') #修改文件2名字为文件
函数初识
一个函数封装一个功能
def xixi(): #def 函数名(): print("1433223") #函数图 xixi() #调用函数 1433223
return
1.在函数中,遇到return终止函数.
2.返回值返回给函数的调用者
1.return 返回的是none
2.return 单个值 返回单个值
3.return 多个值 返回多个值组成的元组
s1 = '231231231231' def aaa(s1): c=0 for i in s1: c += 1 return c #将c的只返回给函数aaa print(aaa(s1)) #打印函数aaa则打印c的值 12
函数的传参(实参和形参)
实参角度:
位置参数;从前至后,一一对应
def xixi(x,y,z): #定义3个位置参数 c = x + y +z return c print(xixi(1,2,3)) #传入3个位置参数 6
三元运算(if,else的简单优化)
def aa(a,b): return = a if a > b else b #三元运算 复制de 如果a>b返回a 否者返回b print(aa(3,4))
4
关键字传参:
def aa(fo,ma): print('%s%s' % (ma, fo)) aa(ma='买了',fo='佛冷') #关键字传参 买了佛冷
混合传参(位置参数在前,关键字参数在后)
def aa(a,b,c): print(a,b,c) aa("你是","不是",c="傻呀") #位置参数在前,关键字参数在后 你是 不是 傻呀
形参角度:
位置传参
和实参一致
def aa(a,b,c): print(a,b,c) aa("你是","不是","傻呀") 你是 不是 傻呀
默认参数
def aa(a='你是不是傻呀'): #已经写过的参数,如果不传参默认用 print(a) aa()
aa('不是')
你是不是傻呀
部署
制作班级统计表:
def aaa(a, b, xb='男'): with open('文件6', encoding='utf-8', mode='a') as banji: banji.write('姓名:%s年龄:%s性别:%s '% (a,b,xb)) banji.close()
while True: name = input('请输入名字或退出:') if name == 'q': break nian = input('请输入年龄:') if name.startswith('1'): aaa(name,nian) else: xb = input('请输出性别:') aaa(name,nian,xb)
万能参数
*args和 **kwargs (前边的*和**为聚合和打散的作用)
l1 = ['kjkj','kjkjk','hghg','sadsa','qwew','qe',21,12,121,2,12,1,21] l2 = {'weq':'eqweqw','CCC':'QWWQ'}
def aaa(*args,**kwargs): #将传入的的参数聚合给args和kwargs print(args) print(kwargs)
aaa(*l1,**l2) #将l1和l2打散为多个参数传入到函数内
('kjkj', 'kjkjk', 'hghg', 'sadsa', 'qwew', 'qe', 21, 12, 121, 2, 12, 1, 21) {'weq': 'eqweqw', 'CCC': 'QWWQ'}
函数参数位置顺序
def func(a,b,*args,sec='嘻嘻',**kwargs) 位置参数 *args 默认参数 **kwargs
python的名称空间
全局名称空间:存储的是全局(py文件)的变量与值的对应关系
临时(局部)名称空间:当函数执行时,会在内存中临时开辟一个空间,此空间记录函数中的变量与值的对应关系,随着函数的结束,临时名称空间而关闭。
内置名称空间: len print 等内置函数等等。
作用域:
全局作用域: 内置名称空间 全局名称空间
局部作用域:临时(局部)名称空间
加载顺序: 内置名称空间 ---> 全局名称空间 ---> 函数执行时:临时(局部)名称空间
取值顺序: 函数执行时:临时(局部)名称空间 ---> 全局名称空间 ----> 内置名称空间(取值顺序满足就近原则)
global nonlocal #2.7版本的python没有nonlocal
global
1可以修改全局变量
2在局部空间可以声明一个全局变量
1.局部只能引用全局的变量但是不能修改,修改就会报错
a = 1 def fun(): a += 1 #内部改变外部变量 会报错 print(a) fun()
如果想在函数内修改全局变量,需要global引用变量
a = 1 def fun(): global a #在函数内引用了全局变量 a += 1 print(a) fun()
2.在局部空间声明变量不能在全局调用
def fun():
a = 1 fun()
print(a) #在局部的变量全局引用不出来
如果想要在全局调用,需要用global声明
def fun(): global a a = 1 fun() print(a)
nonlocal
1.不能操作全局变量
2,在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,并且引用的哪层,从那层及以下此变量全部发生改变。
子名称空间不能修改父名称空间的变量
def fun(): a = 1 def innaer(): a += 1 #无法修改 print(a) innaer() fun()
用nonlocal可以修改
def fun(): a = 1 def innaer(): nonlocal a #引用nonlocal可以修改 a += 1 print(a) innaer() fun()
函数名的运用
函数名(函数的内存地址) 变量
函数名可以作为函数的参数
def func1(): print(111) def func2(x): #将func1作为参数传入func2调用func1 print(x) x() func2(func1)
函数名可以作为函数的返回值
def fun(): print(111) def fun2(x): return x fun2(fun)() #将fun作为参数传入fun2,fun2返回值为参数即fun,所以fun2(fun)=fun,fun2(fun)()=fun()
111
函数名可以作为容器类数据类型的参数
def fun(): print(111) def fun2(): print(222) def fun3(): print(333) l1 = [fun, fun2, fun3] #将函数名作为列表的值 for i in l1: i() #列表调用函数 111 222 333
def fun(): print(111) def fun2(): print(222) def fun3(): print(333) dic = { 1:fun, 2:fun2, 3:fun3, } while 1: zhi = int(input('请输入要调用函数的序号:')) #字典根据key取函数名调用函数(key是int类型) dic[zhi]()
内置函数max和min用于取出列表或元组的最大值和最小值
a = (12, 35, 6, 3, 234, 3435, 324) print(max(a)) print(min(a)) 3435 3