python基础7
基础数据类型方法补充
-
str
- str.capitalize():首字母大写
- str.swapcase():大小写颠倒
- str.title():单词首字母大写
- str.center(length,sub):按照特定长度居中,并且两端用特定字符填充
- str.find(sub):从左到右,找到第一个匹配字符,返回index,找不到就返回-1
- str.index(sub):同find差不多,只是它找不到时,报错
- str.count(sub):计算字符出现的次数
-
tuple
- 当元组内只有一个元素时,改元素后必须跟逗号,否则改数据不是元组
- tuple补充方法
- index同str的index相同
- count
-
list
-
在循环列表时,不建议改变列表的大小,因为改变列表的大小会导致数据的挪动,改变元素的索引,导致操作出错或报错
-
list.index():根据元素返回index,找不到就报错
-
l1 = [1,2,3] l1.index(1) # 0
-
-
list.count()
-
list.sort():给列表排序(一般是给全数字元素的;列表排序),参数reverse:默认从小排到大,为True时,从大到小
-
list.reversed():翻转列表
-
列表能相加,【合并两个列表,生成一个新的列表】
-
l1 = [1,2,] l1 += [3,4] print(l1) # [1,2,3,4]
-
-
列表能乘数字【使列表内的元素,复制n份】
-
l = [1,2,'蔡学明',[1,2,3]]*2 print(l) print(l[3] is l[-1])
-
记得是复制哦
-
-
-
dict
-
字典在循环时,不能改变字典大小
-
解决方法:将要改变的键值对的key保留出来,在循环结束时,再逐一改变
-
dic = {'k1':'太白','k2':'barry','k3': '白白', 'age': 18} # 请将字典中所有键带k元素的键值对删除。 # 方法1 key_list = [] for i in dic: if 'k' in i: key_list.append(i) for i in key_list: dic.pop(i) print(dic) # 方法二 for key in list(dic.keys()): if 'k' in key: dic.pop(key)
-
-
数据类型间的转换问题(想转成什么,就用对应的函数包裹)
-
int <--> str
-
要注意,字符串要想转成int,字符串内的所有元素必须都得是数字字符
i = 100 s = str(i) s1 = '123' i1 = int(s1)
-
-
int <-->bool
-
非零即为True,零为False
i = 0 print(bool(i)) # False
-
-
bool <--> str
-
非空字符串就为True,bool转为str毫无意义,就只是多了两个单词
print(bool(' ')) # True
-
-
str <-->list
-
一般采用join和split方法【join方法要注意可迭代对象内的元素必须全是字符串】
s = '1,2,3,4' l = s.split(',') # l = ['1','2','3'] s1 = '+'.join(l) # s1 = '1+2+3'
-
-
list <--> set
-
一般用于列表去重,不过set是无序的,所有去重后的列表会被打乱
l = [1,2,3,3] l = list(set(l))
-
-
可以转成False的值
-
{},set(),'',0,None,[],(,)
-
基础数据类型总结
- 根据数据类型是否可变
- 可变的:set、list、dict【可变的数据类型的操作方法大多数会直接改变原数据】
- 不可变的:int、bool、str、tuple【不可变的数据类型的操作方法,大多数会生成一个新的值】
- 根据数据类型是否有序【就容器数据类型】
- 有序的:list、str、tuple
- 无序的:dict【其实dict是有序的,在3.6以上的版本,就是有序的】、set
- 根据占内存空间的大小【从大到小】
- dict > list ~= set > tuple>str>int
编码进阶
-
在内存中,所有的数据都是以Unicode的编码形式存在,但是网络传输和储存时,都不能使用Unicode编码
-
在应用层时,所有的加载的数据都会解码成Unicode,但存储时,会被编码成各种编码的文件
-
-
不同编码之间是不能直接识别和转换的,即以Utf-8编码的文件要以Utf-8解码,否则就会乱码,而且utf-8是无法直接转成gbk编码的
-
在python中有一类特殊的数据类型【byter】:该种数据类型在python程序运行在内存中时,是非Unicode编码的形式存在的。
-
byter是类似的字符串的数据类型,拥有字符串的大部分操作方法
-
用byter和Unicode作为编码之间互相转换的交换区【主要原因是byter可以从任何形式的编码文件变成Unicode,再从Unicode变成任何编码的byter】
- 1:将特定编码的文件,用decode方法解码成Unicode
- 2:将Unicode编码特定的编码文件
-
主要使用两个方法
-
方法一:str.encode('编码方式')
-
方法二:byter.decode(‘解码方式'')
-
b = b'\xe4\xb8\xad\xe5\x9b\xbd' #一utf-8编码的bytey s = b.decode('utf-8') # s = '中国' b1 = s.encode('gbk') #b'\xd6\xd0\xb9\xfa'
-
-
注意:解码时,要注意编码是用什么编码的,即编码是什么格式,解码就得是什么格式,否则会出错
-
文件的操作
-
文件操作初始
- 文件操作三个条件
- 文件路径
- 文件编码方式
- 文件打开模式
- 文件操作三个条件
-
文件操作三部曲
-
打开文件
f = open(路径,encoding=编码方式,mode=打开模式)
-
操作文件
f.操作方法
-
关闭文件
f.close()
-
-
操作详解
- open是python的内置函数,底层原理是调用操作系统的文件操作接口
- 路径可以是相对路径,也可以是绝对路径
- 文件被打开就会一直被加载在内存中,在操作完文件后,必须关闭文件
- f是文件句柄,是一个变量
-
文件的打开模式
-
读模式: r(文本读) 、rb(字节读)
-
f1 = open('路径',encoding='编码方式',mode='r')
-
默认mode是r,所以如果是mode是r时,可以不写
-
如果mode是rb时,不用写encoding方法
-
在该模式下,文件有多种操作方法
-
f1.read(n)【n为读取的字符长度,当模式是rb时就是字节长度,如果不写,就是全读】
f1.read(n)
-
f1.readline()【按行读取文本】
f1.readline()
-
f1.readlinese()【按行读取文本,将每一行读取到一个列表内】
l = f1.readlinese()
-
for i in f1【以for循环的方式,读取每一行文本,推荐使用,不同一次加载过多文件数据在内存】
for line in f1: print(line)
-
-
-
写模式:w(文本写),wb(字节写)
-
当mode是wb,不用写编码方式
-
如果没有该文件就会创建一个新的文件
-
要注意以w模式下,在打开文件时,第一步就会清空文件内的数据
-
在w打开的模式下,无论多少次写的操作都不会触发清空,直到以w模式再次打开文件才会
-
在该模式下只有一种操作方法,往文件内写入数据
-
f1.write()
-
f1.writeline() # 其实两者差不多是一种方法,一行写入,和一次性写入,很少使用writeline
-
-
-
追加模式:a(文本追加),ab(字节追加)
- 当mode为ab时,也不用写编码方式
- 与w模式相同,它也会在文件没有时,创建文件
- 它也只有写的操作方法,但是它打开文件时,不会清空文件数据
- 该模式的追加是在文件的尾部追加
-
其他模式
-
r+:读写模式,不会创建文件,不会清空文件
-
要注意读写的顺序,必须是先读后写
with open('文件的其他操作模式',encoding='utf-8',mode='r+') as f1: for line in f1: print(line.strip()) f1.write('\n大傻逼蔡观河') f1.writelines('大傻逼')
-
-
w+:写读模式,会创建文件,也会清空文件,所以读写的顺序是,先写将游标跳到最前端后读
-
with open('文件操作的w+操作',encoding='utf-8',mode='w+') as f2: f2.write('ashdjasj1') f2.seek(0) for i in f2: print(i) f2.write('你什么')
-
-
a+:追加读写模式,会创建文件,不会清空文件,读写顺序可以随意,但读得先将游标跳到开端
-
with open('文件操作的a+操作',encoding='utf-8',mode='a+') as f2: f2.seek(0) for i in f2: print(i) f2.write('1223')
-
-
-
文件操作的其他方法
- tell():返回文件句柄的游标的所在字节位置
- seek(n):将游标移动到n的位置,n必须为字节的长度,移动到开头就是
seek(0)
,结尾是seek(0,2)
- seek的第二个参数表示的是从哪个位置进行偏移,默认是0,表示开头,1表示当前位置,2表示结尾
- flush():将文件更新的数据写入硬盘内
-
-
文件操作的先进方法
-
with方法的优点:
- 不用自己关闭文件,在代码运行过with语句后,一段时间内关闭文件
-
能一次性打开多个文件
-
单一文件操作
with open(路径,编码方式,打开模式) as 变量:
-
多个文件操作【
\
表示本行未结束,下一行也是本行的延申】with open(路径,编码方式,打开模式) as 变量,\ with open(路径,编码方式,打开模式) as 变量:
-
-
文件的改操作
-
五部曲【备胎改造计划】
- 1、 打开要修改的文件
- 2、打开一个备用文件
- 3、将要修改的文件数据写入备用文件
- 4、删除原文件
- 5、将备用文件更名为原文件
-
上代码
with open('男女盆友',encoding='utf-8',mode='r') as f1 ,\ open('男女盆友备胎',encoding='utf-8',mode='w') as f2: for line in f1: f2.write(line.replace('alex','sb')) import os os.remove('男女盆友') os.rename('男女盆友备胎','男女盆友')
-
函数
-
函数的初识
- 函数的作用
- 减少重复代码,使代码更简洁、可读
- 实现代码多次复用
- 以功能为导向实现代码
- 函数的作用
-
函数的结构
-
函数由关键字、函数名、小括号、函数体组成
-
def 函数名(): 函数体
-
def是定义函数的关键字,以该关键字开头,是告诉解释器,接下来的一段代码是函数
-
函数名其实也是变量,定义函数名的要求与变量相同,但更要求语义化,让人见名知义
-
小括号内包裹的是函数内预先定义的变量,也叫形参,命名同变量
-
函数体内写的是函数实现的功能
-
-
函数的返回值【return】
- 关键字:return
- return的作用:
- 作用1:结束函数的执行,函数内的代码执行到该行代码时,就会不会往下执行代码
- 作用2:返回数据
- 当没有设置return时,返回值默认是None,写了return但是后面没有跟数据,返回值也是None
- 返回一个数据时,数据类型就是该数据的类型
- 返回多个数据时,会将多个数据,包裹成元组的数据类型
-
函数的调用:在函数名后跟小括号,小括号内添加的数据就是实参
-
函数的参数
- 函数的参数分两种:实参、形参
- 实参是在函数调用时,传入给函数使用的数据
- 形参是在函数定义时,小括号内的变量
-
实参的传参方式
-
位置传参:根据形参的位置和个数传入数据
- 要求:与形参个数一一对应,顺序不能乱,而且不能多不能少
- 优点:快捷、方便
- 缺点:如果不记得传入的顺序,会导致函数执行错误
-
关键字传参:根据要传入的形参的变量名,一一对应传入参数
- 要求:也要求一一对应,但顺序没要求
- 缺点:麻烦
- 优点:数据顺序可以乱
-
混合传参:可以将位置传参和关键字传参混合传参
- 要求:位置参数必须在关键字参数前,不能重复传参
- 优点:灵活的传入参数
- 缺点:暂时没有
-
def func(key,key2): pass func(value,value) # 位置传参 func(key=value,key2=value2) #关键字传参 func(value,key2=value1) #混合传参
-
-
形参的定义方式
-
位置形参:能接收位置参数和关键字参数
-
def func(变量,变量1): pass func(value,value)
-
-
默认参数形参:在函数定义形参变量时就赋予默认值,函数调用时可以不传入该参数,如果传入就覆盖该默认值
-
def func(变量=value): pass func()
-
-
万能位置形参:进阶的位置形参,贪婪原则,尽可能的接收位置参数,使函数能接收更多的位置参数
-
def func(*args): pass func(value,value1,value2,value3)
-
-
万能关键字形参:贪婪原则,尽可能的接收关键字参数
-
def func(**kwargs): pass func(name=value,age=value,sex=value)
-
-
仅限关键字形参
-
位置处于万能位置形参和万能关键字形参之间
-
只能以关键字传参的方式传入数据
-
def func(*args,变量,**kwargs): pass func(变量 = value)
-
-
-
关于函数形参定义的顺序
-
普通位置形参 > 万能位置形参 >默认形参 and 仅限关键字形参 >万能关键字形参
-
def func(a,*args,sex='男',b,**kwargs): pass
-
-
关于函数传参顺序
- 位置参数 >关键字参数
-
关于*的应用
- 在函数定义时
- 定义万能位置形参:聚合作用,将接收的位置参数,聚合成一个元组
- 在定义万能关键字形参:聚合作用,将接收到的关键字参数,聚合成一个以关键字为key,值为value的字典
- 在函数调用时
- 一个*,代表打散一个可迭代对象,将一个个元素作为位置参数传入给函数
- 两个*,代表打散一个字典,将一对对键值作为关键字参数传入给函数
- 在函数定义时
名称空间
- 什么是名称空间
- 在py代码开始执行时,创建的以变量与值,函数与函数体的关系的字典,就称为名称空间
- 名称空间的种类
- 内置命名空间:存储内置函数的名称空间
- 全局命名空间:py文件执行时,存储变量名与值、函数名与函数体的关系的名称空间
- 局部命名空间:函数执行时,内部产生的临时命名空间
- 名称空间的加载顺序
- py文件没有执行时,内置函数就存在,所以内置名称空间加载最早
- py文件执行时,才会定义函数和执行函数,所以全局名称空间在局部之前
- 内置 > 全局 >局部
- 名称空间的取值顺序
- 取值顺序遵从就近原则,单项不可逆原则
- 就是从当前名称空间开始找,如果当前名称空间有,就用当前的,没有就向上找变量或函数,但是不能往下级名称空间找
作用域
- 什么是作用域:函数和变量能使用的特定区域就称为作用域
- 全局和局部作用域:
- 全局:变量和函数,在py文件的全部的区域都可使用,具体范围包含内置名称空间和全局名称空间的变量和函数
- 局部:函数名称空间内的变量和函数只能在函数内使用,函数外不能使用
- 作用域取值和加载顺序:
- LEGB(就近原则):同名称空间取值原则一致,或者说作用域就是概括性的名称空间
- 全局包含局部,先加载全局才会产生局部
函数的嵌套(高阶函数)
- 在函数内定义函数或调用函数就是函数的嵌套
- 函数内的代码执行是从上到下,直到执行到return或最后的代码,才会跳出函数,如果函数内有其他函数的调用,就得等被调用函数执行完才,继续执行本函数
globals、locals
- global():返回全局作用域内的名称空间
- locals():返回当前作用域内的名称空间
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!