python笔记
2024-05-05 09:53:48 1 举报
AI智能生成
基础语法
作者其他创作
大纲/内容
基础语法
python是动态语言
给变量赋值的时候,不需要指定变量的数据类型
尽管会警告,但还是照样运行<br>告诉程序员看:我这个函数规定了数据类型,你传错类型后续出了什么事不负责
print
print("{0}+{1}={2}".<font color="#ff0000">format</font>(1, 2, 3))
1+2=3
这个在下面字符串格式化里会详细讲
print("balabalabala", end=" ")
不写end,默认换行(end="\n")<br>
"这个是<font color="#ff0000"><b>%s</b></font>常用的<font color="#ff0000"><b>%s</b></font>格式化"<b><font color="#ff0000"> %</font></b> ("我", "字符串")<br>
%s
字符串
%10s,表示10个字符的宽度<br>
%i or %d
整数
同上
%f
浮点数
%<b><font color="#ff0000">.</font></b>3f,保留三位小数<br>
%10.3f,宽10并保留三位小数<br>
<b><font color="#ff0000">f</font></b>'我叫{"你猜"},今年{88}岁'
保留字
['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']
转义字符
\n
换行,一般在末尾,strip对其也有效
\0
空字符
\t
tab,四个空格
\'
‘
\''
“
\\
\<br>
以下不常用
\a
发出系统响铃声
\b
退格符,覆盖删除前一个
\r
换行,并将当前字符串之前的所有字符删除
\v
不常用
\f
不常用
数据类型
内置的 type() 函数可以用来查询变量所指的对象类型
Number(数字)<br>String(字符串)<br>List(列表)<br>Tuple(元组)<br>Set(集合)<br>Dictionary(字典)
<font color="#ff0000">不可变数据(3 个)</font>:Number(数字<包括int(整型)、float(浮点型:小数)、bool(布尔型)、complex(复数)>)<br>String(字符串)、Tuple(元组);<br>不可以增删改<br>做改变之后 id() 查看内存地址,改变<br>
<font color="#ff0000">可变数据(3 个)</font>:List(列表)、Dictionary(字典)、Set(集合)。<br>可以增删改<br>增删改后用内置函数 id() 查看内存地址,不变<br>
<b>作用:</b><br>number:用来存储数字类型的数据,多用于运算,布尔型也属于number,用于逻辑运算,true为真,false为假<br>string:用来存储字符串,如中文、英文等,一般用于一些描述性的文字输出<br>list:用来存储列表,即多个数据类型任意的元素<br>tuple:用来存储元组,一种有序的且不可更改的集合<br>set:用来存储集合,一种无序的,且可以更改的集合<br>dictionary:用来存储字典,一种无序的,可变的有索引的集合
字符类型转化<br>
str()<br>
int()
float()
注释
单行:#
多行: ''' 或者"""
input
运算符
算数
+
-
*
/
%取余
**幂
//取整除,向下取整
赋值
=
+=
-=
*=
/=
%=
**=
/=
:=,不常用<br>
比较
==<br>
!=
<
>
<=
>=
逻辑(布尔)
and,与<br>
or,或
not,非
位运算
将数字转成二进制进行计算<br>python中可用bin(4).replace('0b','')得到对应二进制数<br>
&
按位与,都是1才是1,其他全是0
|<br>
按位或,有1就是1
^
按位异或,不同就是1
~
按位取反,0变1,1变0
<<<br>
左移动相应位数,高位丢弃,低位补0<br>
x<<n==x*(2**n)
>>
右移动相应位数,低位丢弃,高位补0<br>
x>>n==x/(2**n)
int除完会变成float<br>所以只是数值上相等,type上还是不同的<br>
优先级
**
*,/,//,%<br>
+,-
<<,>>
&
|
>,<,>=,<=,==,!=
and
or
=
<font color="#ff0000">三大结构(顺序,选择,循环)</font><br>
顺序结构
<font color="#ff0000">选择结构</font>
对象的布尔值
python一切皆对象,所有对象都有一个布尔值,<br>bool()<br>
以下都为false
false
数值0
None
空字符串
"", ''
空列表
[], list()<br>
空元组
(), tuple()<br>
空字典
{}, dict()
空集合
set()
其他对象布尔值都为true
判断方法
==
比较值
is
是否是同一个地址
<font color="#ff0000">isinstance</font>
判断当前对象是否是指定对象的子类
if isinstance (当前对象,指定对象)<br>
单分支
if
双分支
if else
多分支
if elif elif (else)<br>
嵌套
if 套 if
插一嘴
pass语句
一个占位符:没想好if判断后执行啥,先pass占个位
<b><font color="#ff0000">三元运算</font></b>
<b>语句1</b> if 判断语句 else <b>语句2</b>
判断语句成立执行语句1,否则执行语句2
<font color="#ff0000">循环结构</font>
range()
range(stop)<br>
range(start, stop)
range(start, stop, step)
while循环<br>
一般while true,也可以while+条件
for_in 循环<br>
break跳出<br>
if...break
结束当前循环,本层
或者直接break<br>
continue
if...continue<br>
结束当前循环,直接进入下次循环,本层
或者直接continue<br>
else
for...else
当循环中不执行break,则执行else
while...else
break会让else中的代码不执行,continue就没这个功能
嵌套循环
字符串
驻留
在内存中保存一份且不可变字符串的方法。(相同的字符串只保留一份)
交互模式(cmd)
字符串长度为0或者1
符合标识符的字符串(只包含<b>字符 数字 下划线</b>)
字符串只在编译时进行驻留,而非运行时
a = 'abc'<br>b = 'ab' + 'c'<br>c = ''.join(['ab','c'])<br>print(a is b)>>True<br>print(a is c)>>False
<b>a b c</b>值一样,type也都是str<br><b>b</b>的值在运行之前就连接完毕了<br><b>c</b>的值是程序运行的时候通过join的方法和列表连接的,<br>运行的时候会开辟新的存储空间,所以和a b的存储空间不一样<br>
[-5,256]之间的整数数字
通过a == b,查看值是否相等,通过a is b,查看存储位置是否相等,用id( )也可以查看存储位置<br>
相同的值可以强制驻留
import sys<br>a = sys.intern(b)
pycharm对字符串进行了优化,有些不驻留的进行了强制驻留处理
优点
避免频繁重复创建销毁,提升效率节约内存
因为字符串的拼接和修改比较影响性能
用str类型的join来拼接字符串,而非+
join()是先计算所有字符串的长度,再拷贝,只new一次对象,效率比+高
查
index()<br>
查询substr(子串)第一次出现的位置<br>
找不到报valueerror
rindex()
查询substr(子串)最后一次出现的位置
找不到报valueerror
find()
查询substr(子串)第一次出现的位置
找不到返回-1
rfind()
查询substr(子串)最后一次出现的位置<br>
找不到返回-1
count()<br>
返回str在start和end之间,在my_str里出现的次数<br>
my_str.count(str, start=0, end=len(my_str))
startswith()
检查字符串是否以指定字符串开头,返回True或False
endswith()<br>
检查字符串是否以指定字符串结束,返回True或False<br>
大小写转换
a.upper()<br>
所有都大写
a.lower()
所有都小写
a.swapcase()
大转小,小转大
a.capitalize()
第一个大写,其余小写
a.title()
每个单词的,第一大写,其余小写
对齐
居中<br>
a.center(20,'*')
参数第一个是宽度,第二个是填充符(默认空格)<br>
如果宽度参数小于字符串长度,则返回原字符串
左对齐<br>
a.ljust(20, '*')<br>
同上
右对齐
a.rjust(20, '*')
同上
右对齐,左0补齐
a.zfill(20)<br>
一个参数,如果是-87654,在 - 后面填0 <br>
分割
split()<br>
从左开始分割,默认从空格开始<b>分割</b>
放回一个<b>列表</b>
a.split(spe='分隔符参数', maxsplit=1最大分割次数)<br>
maxsplit是可选参数
rsplit()
从右侧,同上
partition(str)<br>
字符串分割为<b>str前+str+str后</b>三部分<br>
splitlines()<br>
若字符串中有<b>换行</b>,则<b>按行分割</b>,返回各行为元素的<b>列表</b>
判断
a.isidentifier()
是否为合法标识符字符串(只包含<b>字母(中文) 数字 下划线</b>)
a.isspace()
是否<font color="#ff0000">全</font>是空白字符(<b>空格 换行 tab</b>)
a.isalpha()
是否<font color="#ff0000">全</font>是<b>字母(中文)</b><br>
a.isdecimal()
是否<font color="#ff0000">全</font>是<b>十进制数字</b>
a.isnumeric()
是否<font color="#ff0000">全</font>是<b>数字</b>
只要是数字就行,中文数字,中文大写数字,罗马数字
a.isdigit()<br>
是否<b>只含数字</b>
这个就只是<b>阿拉伯数字</b><br>
a.isalnum()
是否<font color="#ff0000">全</font>是<b>字母(中文)和数字</b><br>
替换
a.replace('原字符串',‘替换成的字符串’,2)<br>
第三个参数是最大替换次数,可选
合并
join()
'*'.join(list)<br>
将列表中的元素用 * 合并成一个字符串
元组同上
字符串序列
单个字符当一个元素
a = '*'.join('hello world')<br>print(a)<br>>>h*e*l*l*o* *w*o*r*l*d
比较
>, >=, <, <=, ==, !=
比较规则:从第一个字符开始比较,到第一个不相同的字符
比较原理:比较的是字符的原始值order value
ord('a')<br>
查看a的原始值
chr(97)<br>
查看原始值为97的字符
切片
a[start : end : step]<br>
a[:5]<br>
从0到4
a[6:]<br>
从6到最后
step正从前开始,step负从后开始<br>
其他方法<br>
删除两端空白字符
strip()<br>
格式化(按固定格式输出)<br>在字符串中加入变量
"这个是<font color="#ff0000"><b>%s</b></font>常用的<font color="#ff0000"><b>%s</b></font>格式化"<b><font color="#ff0000"> %</font></b> ("我", "字符串")<br>
%s
字符串
%10s,表示10个字符的宽度<br>
%i or %d
整数
同上
%f
浮点数
%<b><font color="#ff0000">.</font></b>3f,保留三位小数<br>
%10.3f,宽10并保留三位小数<br>
"这个是<font color="#ff0000"><b>{0}</b></font>比较常用的<font color="#ff0000"><b>{1}</b></font>格式化".<b><font color="#ff0000">format</font></b>("我", "字符串")<br>
{0:.3}<br>
一共三位
{0:.3f}
三位小数
{0:10.3}
宽10位,共三位小数
<b><font color="#ff0000">f</font></b>'我叫{"你猜"},今年{88}岁'
编码转换
编码
将字符串转换成二进制数据(bytes)
word = "赞美愚者"<br>encoding1 = word.encode(encoding='GBK') # GBK编码格式 一个中文两个字节<br>encoding2 = word.encode(encoding='utf-8') # utf-8 一个中文三个字节<br>print(encoding1)<br>print(encoding2)
>>b'\xd4\xde\xc3\xc0\xd3\xde\xd5\xdf'<br>>>b'\xe8\xb5\x9e\xe7\xbe\x8e\xe6\x84\x9a\xe8\x80\x85'
解码
将bytes数据转换成字符串
decoding1 = encoding1.decode(encoding='GBK')<br>decoding2 = encoding2.decode(encoding='utf-8')<br>print(decoding1)<br>print(decoding2)
>>赞美愚者<br>>>赞美愚者
列表
1. 列表对象有序排序<br>2. 索引映射唯一数据<br>3. 列表可以存储重复数据<br>4. 任意数据类型混存<br>5. 根据需要动态分配和回收内存
创建
lst=["a", "b", 98]<br>
lst=list(["a", "b", 98])
列表生成式
lst = [i for i in range(1, 10)]<br>
lst = [2*i for i in range(1, 6)]<br>>>[2, 4, 6, 8, 10]
获取
lst.index("a")
获取制定元素的索引(第一个)
lst[1]
获取列表中index为1的元素<br>
切片
lstChild = lst[start : stop : step]
step为正
从前往后start
step为负
从后往前start
增删改查
查
判断元素是否存在
in
not in
遍历
首选
for item in lst:
item是可迭代对象
while
>>1<br>>>2<br>>>3<br>
统计元素个数
L.count('a')<br>
查询元素的索引
list.index('元素')<br>
增
append()<br>
列表末尾添加一个元素
extend()
列表末尾添加<b>至少</b>一个元素,增加的是另一个序列的多个值,但用的时候()里面是一个参数<br>
这样不行list_ouput.extend(user_input1, user_input2, user_input3)
得这样list_ouput.extend([user_input1, user_input2, user_input3])<br>
insert()
任意位置插入一个元素
insert(1,90):在index 1 位置上加入90<br>
删
remove()<br>
一次删除一个,有重复的删除第一个
lst.remove(元素值)<br>
pop()
删除指定索引的元素,不写索引默认最后一个元素
lst.pop(索引号)<br>
clear()
清空列表
del
根据下标删除
del list[2]<br>
删除列表
改
lst[index]=修改后的元素<br>
lst[start:stop]=[........]
切片修改
排序
lst.sort()<br>
lst.sort(reverser=True),表示降序<br>
通过id(lst)可查看还是同一个列表<br>
lst.sort(key=function( ))
key参数主要用于自主选择排序的方式,一般=某函数<br>
stus = [<br> {'name': 'yucas', 'age': 18},<br> {'name': 'wayne', 'age': 20}<br>]<br><br>stus.sort(<font color="#ff0000">key=</font>lambda x: x['age'])<br>print(stus)
sorted(lst)
sorted(lst, reverser=True), 降序<br>
创建了一个新列表
reverse()
将列表倒叙
给程序传递参数
import sys<br>print(sys.argv)<br>
sys.argv就是一个列表,这个列表中存储着运行是传递的参数,注意全部是字符串<br>
python test.py 卢卡斯<br>>>卢卡斯<br>
元组
创建
("元素",“有一个元素”, 8 )<br>
()可以省略
tuple(......)<br>
tuple(("元素",“有一个元素”, 8 ))<br>
("元素",)<br>
<font color="#ff0000">一个元素的元组,一定要加逗号</font>
()
元组不可变,但元组中的可变数据可以改变,比如有个list元素
遍历
t = tuple(("python", "good", 98))<br>for item in t:<br> print(item)
>>python<br>>>good<br>>>98
集合
没有value的字典<br>也有hash表计算存储位置<br>元素<b>不允许重复</b>,<b>无序</b><br>
创建
{......}<br>
set(......)<br>
set([列表])<br>
将列表转成集合
set((元组))<br>
将元组转成集合
set("字符串")<br>
将字符串转成集合
s1 = set("python")<br>print(s1)<br>>>{'o', 'p', 'n', 'y', 'h', 't'}
set() 空集合<br>
用{}创建的是空字典
增删改查
查
in
not in
增
s.add(一个元素)<br>
s.update(至少一个元素)<br>
删
s.remove(元素)<br>
元素不存在报keyerror
s.discard(元素)<br>
元素不存在不报错
s.pop()<br>
不能加参数,随意删一个<br>
s2 = s1.pop(),s2是s1中拿出的那个元素<br>
s.clear()<br>
清空元素<br>
del s<br>
删除集合<br>
改
集合的<b><font color="#ff0000">元素</font></b>为不可变类型,所以无法修改
集合之间的关系
相等<br>
==
!=
子集
s1.issubset(s2)<br>
s1是否是s2的子集<br>
超集
s2.issuperset(s1)<br>
s2是否是s1的超集<br>
<b>不</b>相交
s1.isdisjoint(s2)
s1和s2是否<b>不</b>相交
交并差
交集
s1.intersection(s2)
s1 & s2
并集
s1.union(s2)
s1 | s2
差集<br>
s1.difference(s2)<br>
s1 - s2
对称差集(s1并s2 - s1交s2)<br>
s1.symmetric_difference(s2)
s1 ^ s2
集合生成式(和列表差不多)<br>
s1 = {i for i in range(1, 10)}<br>
s4 = {2*i for i in range(1, 6)}<br>>>{2, 4, 6, 8, 10}
序列类型的类型转换(不包括字典)
tuple()
列表,集合转换为元组
set()
列表,元组转换为集合
可完成对list和tuple的快速去重
list()
元组,集合转换为列表
判断数据是否可迭代
<font color="#ff0000">from</font> collections.abc <font color="#ff0000">import </font>Iterable<br><br><font color="#0d47a1">print</font>(<font color="#0d47a1">isinstance</font>([]<font color="#ff0000">, </font>Iterable))<br>>>True
zip()
zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表
字典
1.键值对,键不可以重复,值可以重复<br>2.元素是无序的<br>3.key必须是不可变对象<br>4.动态调整内存<br>5.消耗较大内存<br>6.hash表计算存储位置
创建
a = {"name": 'Lucas', "age": 30}<br>
b = dict(name='LucasLu', age=32),内置函数<br>
c={},空字典
字典生成式
items = ["a", "b", "c"]<br>values = [1, 2, 3]
d = {item.upper() : value for item, value in zip(items, values)}
>>{'A': 1, 'B': 2, 'C': 3}
增删改查
查(键对应的值)<br>
[键]<br>
a["name"]<br>>>Lucas<br>
如果键不存在,报错,keyerror<br>
get(键)
a.get("name")
如果键不存在,返回None
a.get("gaga", 99)<br>
如果键不存在,返回默认值<br>
key的判断<br>
in
not in
遍历
所有键
for key in dict.keys():<br> print(key)
所有值
for val in dict.values():<br> print(val)<br>
所有元素
for item in dict.items():<br> print(item)<br>
每对键值输出为一个元组tuple<br>
删
del a["name"]<br>
删除指定键值对
del a<br>
删除整个字典a
a.clear
清空字典a
增
a["新键"]=对应的值<br>
改
a["要修改的键"]=新值<br>
视图操作
dict.keys()<br>
获取字典中所有的键(key)<br>
dict.values()
获取字典中所有的值(value)
dict.items()
获取字典中所有的键值对(key.value)
遍历元素
for item in a:<br>
print(item)<br>
获取键keys
print(a[item])
获取值values
print(a.get(item))
获取值values
推导式
快速生成数据
列表(List Comprehension列表解析)
[变量 for 变量 in 可迭代对象]<br>
[x for x in range(4)]
加条件<br>
[x for x in range(4) if x % 2 ==0]<br>
for嵌套循环
a = [(x, y) for x in range(1, 3) for y in range(5, 10)]
自动x和y在取值范围内排列组合
列子[1, ..., 100]变成[[1,2,3], [4,5,6],...]<br>
a = [x for x in range(1, 101)]<br>print(a)<br>b = [a[x:x+3] for x in range(0, len(a), 3)]<br>print(b)
集合
同上
字典
name = ['张三', '李四', '王五', '赵六']<br>sign = ['水瓶', '射手', '摩羯', '双鱼']<br>dict = <b>{</b>x+'爷':y+'座' for x,y in <b>zip</b>(name, sign)<b>}</b><br>print(dict)
拆包
快速提取
元组
a, b = [11, 22]<br>
列表
同上<br>
集合
同上
字典
同上,默认取到的是key
# 这样可以去键值对<br>for k,v in dict.items():<br> print(k, v)<br>
经典python交换变量值
a, b = b, a<br>
=右边b, a 会被当做一个元组(b, a)<br>
<font color="#ff0000">函数</font>
创建<br>
def 函数名([函数参数]):<br> 函数体<br> [return xxx]
def calc(a, b):<br> result = a+b<br> return result<br>
部分内置函数
len
返回长度
max
返回最大值
del
del a或者del(a)<br>
time包
稍后再说
random包
用到再说
自定义函数记得加说明文档
参数传递<br>
形参实参
形参(定义处)
a和b
实参(调用处)
a和b的实际值
参数调用
print(calc(10, 20))<br>print(calc(b=20, a=10))
形参实参名称可以不同
参数传递时的内存
如果是不可变对象,在函数体内的修改不影响实参的值
记住python赋值不是改变对象的值而是将对象<b><font color="#ff0000">指向</font></b>存储值的内存就行
如果是可变对象,在函数体内的修改影响实参的值
参数定义
函数定义时,给形参定义默认值,调用时只有和默认值不符时传递实参
def fun(a, b=10):<br> print(a, b)<br> <br>fun(100) # a=100, b=10<br>fun(20, 30) # a=20, b=30
*args(未命名参数)<br>
个数可变的位置参数
<font color="#ff0000">结果是元组</font>
def fun(*args):<br> print(args)<br><br>fun(10)<br>fun(10, 20, 30)
>>(10)<br>>>(10, 20, 30)
这时args是一个元组,可以进行元组的各种操作<br>
表示调用函数时多余的<b><font color="#ff0000">未命名参数</font></b>都会以元组的方式存储到args里
一个函数只能定义<font color="#ff0000">一个</font>位置参数<br>
**args(**kwagrs)(命名参数)<br>
个数可变的关键字参数
<font color="#ff0000">结果是字典</font>
def fun(**args):<br> print(args)<br><br>fun(a=10)<br>fun(a=10, b=20, c=30)
>>{'a': 10}<br>>>{'a': 10, 'b': 20, 'c': 30}
表示调用函数时多余的<b><font color="#ff0000">命名参数</font></b>都会以键值对的方式存储到kwagrs
def fun(a, b, *, c, d)<br>
*之后的参数只能用关键字参数传递<br>
一个函数只能定义<font color="#ff0000">一个</font>关键字参数,且要放在<b><font color="#ff0000">位置参数后面</font></b>
不过这样也可以def fun(a, b, *, c, **arges)<br>因为本质上它还是只有一个关键字参数,*只不过是个条件
总结
def fun(a, b, c):<br> print('a=', a)<br> print('b=', b)<br> print('c=', c)
fun(1, 2, 3)
a= 1<br>b= 2<br>c= 3
lst = [10, 20, 30]<br>fun(*lst)
a= 10<br>b= 20<br>c= 30
dic = {'a': 11, 'b': 12, 'c': 13}<br>fun(**dic)<br>
a= 11<br>b= 12<br>c= 13
返回值return
返回值和结束函数2个作用
return后面的语句不会被执行,只执行第一个return<br>
返回多个值时,结果为元组
是元组就能拆包
通过星号拆包
*对列表、元组、集合可以拆包,但一般都是在调用函数时用
**可以对字典进行拆包,拆包的结果是命名参数
4种函数
无参,无返回
一般情况下用来打印提示等类似的功能
无参,有返回
一般情况下像采集数据等功能会用到
有参,无返回
一般情况下对某些变量设置数据而不需结果时用此类函数
有参,有返回
大多数
函数嵌套
# 例1 画线<br>def line():<br> print('---------------'*3)<br><br><br>def print_lines(num):<br> for i in range(num):<br> line()<br> i += 1<br><br><br>print_lines(5)<br>
# 算平均数<br>def sum_up(n1, n2, n3):<br> return n1 + n2 + n3<br><br><br>def average(n1, n2, n3):<br> return sum_up(n1, n2, n3)/3<br><br><br>print(average(1, 5, 9))<br>
变量的作用域
局部变量
函数内的
全局变量
函数外的
要在<b>函数内</b>修改<b>全局变量</b>,先用<font color="#ff0000"><b>globa</b></font>l声明<br>
匿名函数(lambda)<br>
add_up = lambda 形参1,形参2:表达式<br>
用add_up(1, 2)调用<br>
接收任何数量的参数但只能返回一个表达式的值,<br>其默认就是返回的,不用写return<br>
使用方式
1.像普通函数一样,变量名( )<br>
2.在其他函数实参的位置,直接定义一个lambda
def fun(a, b, <font color="#ff0000">opt</font>):<br> print(opt(a, b))<br><br>fun(1, 4, <font color="#ff0000">lambda x, y: x+y</font>)
递归函数
就是函数内调用自己
占内存效率低,但简单易懂啊
阶乘函数<br>def fac(n):<br> if n == 1:<br> return 1<br> else:<br> res = n*fac(n-1)<br> return res<br>
斐波拉契数列<br>F[n]=F[n-1]+F[n-2] (n>=2,F[0]=0,F[1]=1)<br>
def fib(n):<br> if n == 1:<br> return 0<br> elif n == 2:<br> return 1<br> else:<br> return fib(n-1)+fib(n-2)<br><br><br>for i in range(1, 8):<br> print(fib(i))
有调用有终止
其实递归是一种算法,一般用来解决“树”、“图”等操作,还能解决像“汉罗塔问题”等
<font color="#ff0000">面向对象</font>
面向过程 VS 面向对象<br>
类
类 VS 对象
不同的数据类型属于不同的类
900就是int数据类型下的一个对象
python中一切皆对象<br>有id(内存空间),有type(数据类型),有值<br>
类的创建
class Student:<br> pass
一般首字母大写,其余小写
组成
类属性<br>
可以在外面通过Student.gender = None,加一个类属性<br>
self
当通过实例对象调用方法的时候,self能够自动指向实例对象,从而拥有了操作这个对象中的属性或者方法的可能。
静态方法
静态方法之所以不需要self,是因为方法内不需要实例对象的引用
比如上面的例子中,<b>eat方法</b>,并没有指向name或者age,所以其实属于<font color="#ff0000">静态方法</font>
能获取构造函数定义的变量,也不可以获取类的属性。
类方法
不能获取构造函数定义的变量,可以获取类的属性。
对象的创建
stu = Student(初始化方法的参数)<br>
stu.eat()<br>
对象名.方法名
Student.eat(stu)<br>
类名.方法名(类的对象)----方法定义处的self
stu.name
调用属性
删除属性
调用
类属性
类中方法外的变量,被该类所有对象共享
# 直接写在类里面的变量<br> native_pace = '江苏'
print(Student.native_pace)<br>print(stu.native_pace)
类方法
使用类名直接访问的方法
@classmethod<br> def cm(<b><font color="#ff0000">cls</font></b>):<br> print('类方法写cls')
Student.cm()<br>
静态方法
使用类名直接访问的方法
@staticmethod<br> def method():<br> print('静态方法<b><font color="#ff0000">不加self</font></b>')
Student.method()<br>
对象关联
类A,实例对象a=A()<br>类B,实例对象b=B()<br>
B.新属性aa=a
再用<font color="#ff0000">B.aa</font>就可以调用A的属性和方法了
三大特征(封装,继承,多态)
封装
将数据(属性)和行为(方法)包装到类对象中。(转为私有属性or隐藏属性)
如果属性不希望被外部调用,可以前面加2个_<br>
self.__age = age<br>再用stu.__age是访问不到的,<br>但用stu._Student__age还是能访问,纯靠自觉<br>
print(dir(cat)),可以看到cat的所有属性和方法<br>
继承
基本概念
没写父类的默认继承object
定义子类时,要在构造函数中调用父类的构造函数
super().__init__( )<br>
支持多继承
子类有多个父类<br>
关于多继承的__mro__顺序<br>用类名.__mro__,这个魔术方法,可以查看这个类的继承顺序<br>
如果2个子类中都继承了同个父类,当在子类中通过父类名调用时,parent被执行了2次
子主题
如果2个子类中都继承了同个父类,当在子类中通过super调用时,parent被执行了1次
子主题
子主题
单继承
子类只有一个父类
子主题
子主题
1.super().__init__相对于类名.__init__,在单继承上用法基本无差<br>2.但在多继承上有区别,super方法能保证每个父类方法只会执行一次,而类名.方法()会导致方法可能被执行多次<br>3.多继承时,用super方法,对父类传参,由于super的算法,必须把参数全部传递,否则报错,所以就要加上*args和**kwargs<br><u>4.单继承时,用super方法,不用全部传参,只能传父类方法所需的参数,否则报错</u><br>注:在多继承时,尽量不用super,用父类名.方法()<br>用super虽然对于同个父类的调用可以避免重复执行,但代码阅读难度增加,不利于debug<br>
object类<br>
所有类的父类
__str__()方法<br>
返回对象的描述
https://blog.csdn.net/m0_57133702/article/details/120568504
方法重写
子类想输出自己独有的东西,父类没有
就是在子类中重新定义父类的方法<br>先加个super().xx()<br>这样可以继承父类的xx()方法<br>然后再加新的功能
如果不加super(),就继承不了父类方法<br>
多态
有别于如Java的静态语言,python这种动态语言的多态就相当灵活了<br><br>如果一个变量存储了某一个实例对象的引用,且通过这个变量调用指向的对象中的某个方法,<br>此时如果变量指向的对象是子类创建的那么就调用子类中的方法,如果是父类创建的对象那么就调用父类的方法<br>
反正就是调用类的方法很方便
class Dog():<br> def bark(self):<br> print("普通狗汪汪叫")<br><br><br>class LangDog(Dog):<br> def bark(self):<br> print("狼狗狂吠")<br><br><br>class ZangAo(Dog):<br> pass<br><br><br>class Person():<br> def pk_dog(self, dog):<br> print('人向狗进行了攻击')<br> dog.bark()<br><br><br>Anna = Person()<br>dog1 = Dog()<br>dog2 = LangDog()<br>dog3 = ZangAo()<br><br>Anna.pk_dog(dog1)<br>Anna.pk_dog(dog2)<br>Anna.pk_dog(dog3)
>>人向狗进行了攻击<br>>>普通狗汪汪叫<br>>>人向狗进行了攻击<br>>>狼狗狂吠<br>>>人向狗进行了攻击<br>>>普通狗汪汪叫<br>
内建属性
常用内建属性
__new__(<font color="#ff0000">cls</font>)
帮助类在内存中<font color="#ff0000">只</font>开辟<font color="#ff0000">一个</font>空间<br>储存属性和方法<br>在__init__之前<br>
如果需要当前类做<font color="#ff0000">多个</font>实例化,则<font color="#ff0000">只</font>需要创建<font color="#ff0000">一个</font>空间来存储实例对象
__init__<br>
__class__
实例对象p是通过__class__找到Person这个类的,然后才能调用类中的方法<br>
__getattribute__
实例对象要访问实例属性,要通过这个方法
方法中的item参数是实例属性的属性名称
能够完成属性访问时进行拦截
用户访问属性,传入一个参数,可以返回提前设定好的值
如果访问的是name1,会被拦截,传回指定值,如果访问name2,则可以返回传入的值
object.__getattribute__(self, item)是为了保证能返回属性的值,没有的话返回None<br>
注意:不要在__getattribute__方法中调用self.xxxx,会进入死递归,用object.__getattribute__(self, item)<br>
__doc__
类名.__doc__<br>
输出类的说明描述。类的说明写在类名下一行,__doc__只调用那段注释。<br>
__module__和__class__<br>
module打印所在的模块(所在的py文件)<br>class打印所在类
__del__
当对象在内存中被释放之前,自动触发执行
一般不去改
<font color="#ff0000">__call__</font>
可以在__call__中添加一些功能,用Foo()()直接调用<br>
把实例对象当成一个函数去使用
当成函数去用,就可以传参了
__dict__
返回类的属性和方法,以及对应的值<br>返回实例对象的属性,名称和值
__str__
如果在类中定义了__str__方法,打印方法时,默认输出这个方法的返回值<br>
返回值只接受string
__getitem__, __setitem__, __delitem__
对容器类型进行操作,获取,设置,删除<br>对于列表,元组,字符串。foo[index],索引<br>对于字典。foo[key],键<br>
字典<br>一定要用foo['hahaha']操作才能调用这三个方法<br>
动态绑定属性和方法
创建完对象后,为个别对象动态绑定一个属性(方法),该属性只有这个对象有,其他对象没有
class Student:<br> def __init__(self, name, age):<br> self.name = name<br> self.age = age<br><br> def eat(self):<br> print(self.name + '在吃饭')<br><br>stu1 = Student('张三', 20)<br>stu2 = Student('李四', 30)<br><font color="#ff0000">stu1.gender</font> = '女' <u># 这一步就是动态绑定新属性</u><br><br><br>
gender属性只有stu1有<br>
def show(self):<br> print('stu1专属方法', self.name)<br><br><u>import types<br></u># MethodType给类动态绑定<font color="#ff0000">实例方法</font><br>stu1.show = <font color="#ff0000">types.MethodType</font>(show, stu1) # 将show方法帮给stu1对象<br>stu1.show()
show()只有stu1能调用<br>
<font color="#ff0000">@staticmethod<br></font>def static_func():<br> print('这是一个<font color="#ff0000">静态方法</font>')<br><br><br>Student.address = '深圳' # 先创建一个类属性<br><font color="#ff0000">@classmethod</font><br>def class_func(cls):<br> print(f'这是<font color="#ff0000">类方法</font>,类属性值为:{cls.address}')<br><br><u>Student.static_func = static_func<br>Student.class_func = class_func</u><br><br>stu2.static_func()<br>stu1.class_func()
__slots__特殊属性<br>
限制属性的创建<br>1.为了限制随意给对象添加属性或者方法<br>2.对子类不起作用,只限制当前类<br>3.不可以卸载__init__中<br>
property属性
1.装饰器方式<br>
当前类中,装饰在某个方法上,使得这个方法可以像属性那样被调用<br>用于拿到当前方法中计算的返回值<br>被property装饰的方法不能创建<font color="#ff0000">除了self之外</font>的形参
@property<br> def func(self):<br> return '调用func'<br><br>foo = Foo()<br>res = <font color="#ff0000">foo.func</font><br>
简单例子:<br>
'''<br>对于京东商城中显示电脑主机的列表页面,<br>每次请求<b>不可能</b>把数据库中的<u>所有内容</u>都显示到页面上,<br>而是通过<font color="#ff0000">分页</font>的功能局部显示,<br>所以在向数据库中请求数据时就要显示的指定获取<b>从第m条到第n条</b>的所有数据 这个分页的功能包括:<br>1.根据用户请求的<b>当前页</b>和<b>总数据条数</b>,计算出m和n<br>2.根据<b>m和n</b>去数据库中请求数据<br>'''<br>
>>第一页显示第0到第9条数据<br>>>第一页显示第10到第19条数据<br>
用property进行商品价格控制
>>100<br>>>200<br>>>... AttributeError: 'Goods' object has no attribute 'price'. Did you mean: '_price'?
在商城开发中设置打折价格
>>80.0<br>>>setter被调用<br>>>160.0<br>>>deleter被调用<br>>>.... AttributeError: 'Goods' object has no attribute 'original_price'
2.类属性方式,创建值为property对象的类属性
类属性 = property(需要装饰的方法)<br>
>>100<br>
案例<br>
第一个参数是方法名,调用 <font color="#ff0000">对象.属性</font> 时自动触发执行方法<br>第二个参数是方法名,调用<font color="#ff0000"> 对象.属性 = XXX</font> 时自动触发执行方法<br>第三个参数是方法名,调用 <font color="#ff0000">del 对象.属性</font> 时自动触发执行方法<br>第四个参数是字符串,调用 <font color="#ff0000">类名.属性.__doc__</font> ,此参数是该属性的描述信息<br>注:property中的参数顺序一定要按照get set del排序
>>当前get bar被执行<br>>>a<br>>>当前set bar被执行 d<br>>>当前del bar被执行<br>>>当前字符串是对property的一个解释说明<br>
python2.7中常这么用,3之后很少用<br>
if__name__=='__main__':<br>
函数入口:写在入口下的内容只能在当前文件内运行,被引用时,入口下的内容引用不到
test_1
test_2
>>num1是可引用内容<br>>>100<br>>>AttributeError:不拉不拉,test_1没num2这个属性<br>
<strike>特殊属性和方法</strike>
用到再查
特殊属性
特殊方法
new和init的传参过程
<strike>类的赋值和浅拷贝</strike>
<font color="#ff0000">三器一闭</font>
迭代器
可以记住遍历的位置的<b>对象</b><br>只能往前不能后退
iter()和next()
for
while
<font color="#ff0000"># 一般写except <b>Exception</b>:当前python所有错误的基类</font>
Iterable和Iterator
如果对象只有__iter__方法,是可迭代对象<br>如果对象有__iter__和__next__方法,则是迭代器<br>
自定义迭代器
例
1. 先定义主要类
2. 给这个类定义一个迭代器
3. MyList的实例对象my_list这时就可以用for循环遍历了<br>
>>11<br>>>22<br>>>33<br>
例:学生系统
1.初始化和add方法
2.iter和next
3.实例化,调用3次add,for循环遍历
请输入姓名: lucas<br>请输入年龄: 18<br>请输入地址: nanjing<br>请输入姓名: wayne<br>请输入年龄: 20<br>请输入地址: shenzhen<br>请输入姓名: bill<br>请输入年龄: 19<br>请输入地址: shanghai<br>>>{'name': 'lucas', 'age': 18, 'address': 'nanjing'}<br>>>{'name': 'wayne', 'age': 20, 'address': 'shenzhen'}<br>>>{'name': 'bill', 'age': 19, 'address': 'shanghai'}<br>
注释:<br>如果有4个类,分别在4个py文件中<br>这4个类的迭代的方法是一模一样的<br>写一个迭代器直接导入引用<br>
多继承也可以,但项目开发中,尽量少继承,继承的执行速度比对象关联慢
生成器
概念:含yield的函数
例
定义了一个<b>生成器函数</b>,函数返回一个<b>生成器对象</b>,然后就可以通过for语句进行<b>迭代访问</b>了。
<b>生成器函数</b>返回<b>生成器的迭代器</b>。<u> "生成器的迭代器"这个术语通常被称作"生成器"</u>。<br>要注意的是<b>生成器</b>就是一类<b><font color="#ff0000">特殊的迭代器</font></b>。<br>作为一个迭代器,生成器必须要定义一些方法,其中一个就是__next__()。如同迭代器一样,我们可以使用__next__()函数来获取下一个值。<br>
执行流程
会在yield处暂停
生成器表达式
创建长序列时使用<br><font color="#ff0000">(</font><b>x</b> for <b>x</b> in range(100)<font color="#ff0000">)</font>
对比
列表解析(列表推导式)
>>列表推导式时间为3.2063777446746826<br>
生成器表达式
>>生成器表达式时间为0.0
原因
<b>列表解析:<br></b>1.开辟一个内存<br>2.开完内存创建<b>所有值</b><br><b>生成器表达式:<br></b>1.返回的不是具体序列数据,是生成器<b>对象</b><br>2.使用next()取生成器中的值,内存中<b>只有一个值</b>。调用一次,产生一个值
例
>>True<br>>>True<br>>>25000000<br>>>[]<br>
内置方法
send()
1.send方法与next方法类似<br>2.可以向生成器传递一个参数,并在生成器中进行接受<br>3.一般不在第一次获取值时使用,第一次获取时必须传递None<br> print(my_iter.send(None))<br>4.可以在程序运行的过程中对当前的函数运行过程进行操作
>>0<br>>>接收到参数,将此时的i(即0)+10输出=10<br>>>1
注意 <b><font color="#ff0000">i </font></b>的值,第一次取值时在yield处暂停,第二次取值继续时,先读if判断,此时<b><font color="#ff0000"> i </font></b>还未 <b><font color="#ff0000">+1</font></b><br>
close()
关闭当前生成器(相当于删除或销毁)
my_iter.close()<br>print(next(my_iter))
关闭之后再取值会抛出异常
总结
当调用生成器函数的时候,函数只是<b>返回了一个生成器对象</b>,并<b>没有执行</b>。
当next()方法第一次被调用的时候,生成器函数才开始执行,执行到yield处<b>暂停<br></b>next()方法返回值就是yield处的参数
继续调用next()方法时,函数直接接着上一次暂停的yield处继续执行,到下一个yield出暂停<br>如果后面没有yield就抛出StopIteration异常
和return的区别
return:代表整个函数结束,结束前返回值,函数中<b>只能有一个,<font color="#ff0000">生成器中不可以有return</font><br></b>yield:不代表函数结束(<b>只是暂停</b>),返回一个生成器对象(可用next取到其值),函数中<b><font color="#ff0000">可以写多个yield</font></b>
生成器内部声明了迭代器协议:__iter__ __next__,不需要自己定义<br>
闭包(优雅的编程技巧)<br>
1.有函数嵌套,一般只嵌套一层<br>2.内部函数引用了外部函数的参数<br><u>就是当某个函数被当成对象返回时,夹带了外部变量,就形成了一个闭包。<br>可以这样理解,闭包就是能够读取其他函数内部变量的函数。</u><br>
如果在一个函数中有内层函数<br>如果内层函数没有释放,则外层函数会永远占着内存
def person():<br> def info():<br> xxxxxx<br>p = person() # 这里只<b><font color="#ff0000">引用</font></b>了info(),并没有<b>调用</b>,所以info没有运行,此时person()这个函数还是占着内存<br>p() # 这样就运行了info()这个函数,运行完就会释放内存
案例<br>
>>内部函数的参数为: 10<br>>>30<br>
函数引用
定义一个函数可以理解为:<br>定义了一个<b>全部变量</b>,<b>变量名</b>就是<b>函数名</b>(test)<br>这个<u>test变量</u>指向一个<b>代码块</b>,就是<b>函数</b><br>就是说test保存了一个代码块的<b>地址</b>,即<b><font color="#ff0000">引用</font></b><br>
>>1<br>>>2<br>>><font color="#ff0000">True </font>None None<br>>><font color="#ff0000">True</font><br>>>2217856965072<br>>>140714178485464<br>
None<br>
使用闭包修改函数中的变量<font color="#ff0000"><b>nonlocal</b></font>
>>6<br>>>7<br>>>51<br>>>52<br>
装饰器(依赖闭包)
概念
装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。<br>它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。<br>装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。<br><u>简单来讲:装饰器的作用就是<b><font color="#ff0000">为已经存在的函数或者对象添加额外的功能</font></b>。</u><br>
例
初体验(现在不这么写)<br>
>>[DEBUG]: enter say_hello()<br>>>hello<br>
这段代码的运行流程
1.将say_hello这个函数的引用,传递给debug函数(引用:给内存地址,不运行)<br>
2.预读wrapper代码。<font color="#ff0000">预读开始</font>
3.发现wrapper函数的返回值是say_hello函数的调用<br>
4.返回wrapper函数的引用。<font color="#ff0000">预读结束</font>
5.执行debug(),并传递一个say_hello的函数引用。<font color="#ff0000">开始运行</font><br>
6.debug函数返回的是一个内部函数的引用
7.sayHello(),调用内部函数wrapper
print(f'********')
return func(),就是say_hello()<br>
print(‘hello’)
上面的<font color="#ff0000">debug函数其实已经是一个装饰器</font>了,它对原函数做了包装并返回了另外一个函数,额外添加了一些功能。<br>因为这样写实在不太优雅,在后面版本的Python中支持了@语法糖。<br><font color="#ff0000">在不修改say_hello函数原代码的基础上,加一个debug功能。</font><br>
效果一样,这是<font color="#ff0000">最简单的装饰器</font>,被装饰函数无法传参
流程
1.say_hello()处,@debug,运行debug<br>
2.将@debug下的函数传给func
3.预读wrapper,返回wrapper的引用
4.say_hello加(),实际上就是调用wrapper函数。>>打印[DEBUG]这段话<br>
5.wrapper返回func(),就是say_hello()。>>打印hello<br>
被装饰函数可以传参
>>[DEBUG]: enter say()<br>>>hello! lucas<br>
万能装饰器(被装饰函数可以有多个参数)
终极装饰器(带参数的装饰器)<br>
>>info: enter function say()<br>>>hello lucas
类装饰器
装饰器要求接收一个callable对象,并返回一个callable对象。<br>所以类装饰器中,__init__接收函数,重载__call__()并返回一个函数<br><u>一个装饰器可以装饰多个函数<br>一个函数可以有多个装饰器(很少用)</u>
简单的类装饰器
带参数的类装饰器
>>INFO: enter function say()<br>>>say lucas<br>>>INFO: enter function say()<br>>>say lll<br>>><font color="#ff0000">None</font><br>
元类
开发中用不到,用于阅读源代码<br>
类的本质是个对象,
所以可以对它做一下操作
将它赋值给一个变量
拷贝它
为它增加属性
将它作为函数参数进行传递
代码解释
创建一个类
类是可以动态创建的
type
所有类都继承于object,所有类都是由type创建。<br>object也是由type创建的,type也是由type创建<br>
<b>实例对象</b>由<b>类对象</b>创建,所以type(实例对象),出来的是对应的类<br>而<b>类对象</b>是由<b>type</b>创建,所以type(类对象),出来的是type。<br>object也是类,所有类都继承于object,但其创建者是type<br>
使用type创建一个类
type函数的第二种用法(自己写函数不要让一个函数有两种完全不同的功能)
例
定义一个父类
定义一堆方法
将方法和父类放进子类中去
实例化后检查子类功能
>>住在深圳的lucas同学<br>>>lucas 深圳<br>>>这是一个静态方法<br>>>这是类方法 深圳<br>
元类本身的探究
元类创建类,类创建实例对象
函数type实际上是一个元类。type是python在背后用来创建所有类的元类。<br>str是用来创建字符串对象的类<br>int是用来创建整数对象的类<br>type是用来创建类对象的类<br><font color="#ff0000">可以通过__class__属性来看到这一点</font><br>
__metaclass__<br>
class Foo(object, metaclass=something):<br> # __metaclass__ = something, python2这么写<br><font color="#ff0000"># 这个方法不用加def</font><br>
自定义类
元类的主要目的是为了创建类时能够自动地改变类
例<br>
异常处理
例,什么是异常<br>
一个简单的登录系统
输入两个整数算商
try:<br> n1 = int(input('输入一个整数:'))<br> n2 = int(input('输入另一个整数:'))<br> res = n1/n2<br># except ZeroDivisionError:<br># print('除数不能为0哦')<br># except ValueError:<br># print('懂什么叫整数吗')<br>except BaseException as B:<br> print('出错了,请学会自己看报错:', B)<br>else:<br> print('结果为:', res)<br>finally:<br> print('-----------------')<br> print('感谢使用,本程序结束')<br>
<font color="#ff0000">处理异常</font>
try--except
try正常运行,出<b><font color="#ff0000">对应</font></b>异常走except
多个异常
try--except--except(多个异常)<br>
只执行一个分支
except(NameError, TypeError):<br><font color="#ff0000">多个异常一般这么写</font>
except后面跟一个元组<br>
try--except--else<br><font color="#ff0000">用的不多</font>
try内没有异常走else
try--except--else--finally
报不报错都要跑<br>
捕获异常对象(异常本身信息)
as e
全捕捉
用Exception
不写默认Exception
自定义异常(用的不多)
例1
<font color="#ff0000">自定义的异常要继承Exception</font>
例2
先定义一个异常类
在函数中主动抛出异常
调用函数
通过异常捕获获得以下字符串里面的字母字符
str_1='d52a733i2327ha244i982d23s553b245'
抛出异常
raise
<font color="#ff0000">不加as e</font>
打印出自定义信息
一般不这么用,在except下面加raise
一般使用场景
网络请求
文件读写
常见异常类型
BaseException
<b>所有</b>异常的基类
https://docs.python.org/zh-cn/3.9/library/exceptions.html#exception-hierarchy
<font color="#ff0000"><b>Exception</b></font>
<b>常见</b>异常的基类(父类)
不知道会有什么异常就用这个
ZeroDivisionError<br>
除(or取模)0,所有数据类型
IndexError<br>
序列中没索引
KeyError<br>
映射中没这个键
NameError<br>
未声明/初始化对象(没有属性)<br>
SyntaxError<br>
语法错误
ValueError
传入无效参数
traceback模块<br>
pycharm程序调试<br>
debug shift+F9
文件操作<br>
打开文件
<font color="#ff0000">内置函数open</font>
open(file_name [, access_mode][, buffering])<br>
<b><font color="#ff0000">file_name</font></b> 变量:是一个包含要访问的文件名称的字符串值。
<b><font color="#ff0000">access_mode</font></b> 变量:指打开文件的模式,对应有只读、写入、追加等。<br>access_mode变量值不是必需的(不带access_mode变量时,要求file_name存在,否则报异常),<b>默认</b>的文件访问模式为<b>只读</b>(<font color="#ff0000">r</font>)。<br>
'r'<br>
- 读取 - 默认值。只能读取,如果文件不存在则报错。<br>
'a'
- 追加 - 在原有内容基础上追加内容,在末尾写入,如果不存在则创建该文件。
'w'
- 写入 - 只能写入,如果文件不存在则创建该文件。
‘w+’<br>
可读可写
'x'
- 创建 - 创建指定的文件,如果文件存在则返回错误。
't'
- 文本 - 默认值。文本模式。
'b'
- 二进制 - 二进制模式(例如图像)。
'rb'<br>
二进制格式打开一个文件,只读
'wb'<br>
同上,只写<br>
'ab'
同上,追加
'wb+'
同上,读写
<font color="#ff0000">注意:尽量一次只用一种模式,+模式好像不太好用</font>
<b>buffering</b>:(一般很少用)<br>如果buffering的值被设为<b>0</b>,就不会有寄存;<br>如果buffering的值取<b>1</b>,访问文件时就会寄存行;<br>如果将buffering的值设为<b>大于1的整数</b>,表示这就是寄存区的缓冲大小;<br>如果取<b>负值</b>,寄存区的缓冲大小就是系统默认的值。<br>
路径
绝对路径
从根文件夹开始
E:/zoom/palegechong/图灵/基础语法/文件操作/文档/test.txt
相对路径
相对于当前工作目录的路径
./文档/test.txt
例
<font color="#ff0000">encoding='utf-8',设置编码</font><br>
基本文件操作
read()
write()
readline()
读一行<br>
readlines()
放进列表,每行一个元素
writelines()
<font color="#ff0000">文件流操作</font>
如果对文件进行了读写之后,要关闭文件流(close())<br>因为文件读写需要使用计算机资源<br>如果不关容易程序异常,还占系统资源
<font color="#ff0000">with open as f:</font>
with open可以自动调用close<br>
重命名<br>
os模块
os.rename('原文件名', '新文件名')<br>
<font color="#ff0000">文件名这里写路径,不论是绝对路径还是相对路径</font>
删除
os模块
也是填路径
迭代读取<br>
普通版<br>
fileinput模块
<font color="#ff0000">fileinput读完一行释放一行内存</font>
StringIO函数
序列化/反序列化<br>
JSON
前端的字典
json模块
0 条评论
下一页