关注微信公众号:(新生程序员教程)
下载python的word笔记,了解更多编程语言和程序员学习网站,学习平台
目录
(1)使用记事本(sublime)书写一个 python 代码
第1章:Python的基础篇
1.1计算机的组成[了解]
- 硬件系统
- 主机部分
- CPU (中央处理器)
- 内存(4G, 8G, 16G 32G 64G)
- 外设部分
- 输入设备
- 键盘
- 鼠标
- 输出设备
- 显示器
- 音响
- 外存储器
- 硬盘
- 输入设备
- 主机部分
- 软件系统
- 系统软件
- ==操作系统: 控制硬件运行, 支持其他软件运行==
- 分类:
- Windows(7 8 10)
- Mac
- Linux
- Android
- iOS
- 分类:
- ==操作系统: 控制硬件运行, 支持其他软件运行==
- 应用软件: 自己安装的使用的软件
- 系统软件
1.2.计算机如何处理程序的[了解]
计算机想要运行程序,需要将软件(指令,数据)加载到内存中.
CPU 只能和内存进行交互.
1.3. 编程语言[了解]
计算机只认识 0 和 1.
编程语言: 就是计算机和人类沟通交流的语言.
常见的编程语言: python , C 语言 C++.
1. 4python 介绍 [了解]
- python 诞生与 1991年, 作者是龟叔
- python 解释器的官方实现版本是 C 语言实现
- python 的版本:
- python2.x 官方已经停止维护
- Python3.x
1.5下载编译器
python: python 解释器, 将 python 代码解释成计算机认识的语言.
pycharm: IDE(集成开发环境), 写代码的一个软件, 集成了写代码, 运行代码,代码调试等功能
写代码的软件除了使用 pycharm 之外,还可以使用 记事本, sublime, vscode ....
(1)使用记事本(sublime)书写一个 python 代码
- 新打开一个记事本程序
- 书写 print('hello world!'), 注意,标点符号都是英文
- 保存文件, 文件的后缀是.py
- 打开 cmd 窗口, 执行代码 python 代码文件名
(2)使用 pycharm 书写 python 代码
- 打开 pycharm 软件
- 创建代码文件
- 书写代码 print('hello world!')
- 运行代码, 右键运行
- 查看运行结果
pycharm 软件的基本设置
file 菜单
setting - 背景色
setting - 设置字体颜色和大小
setting -- 设置解释器
(3) 注释[掌握]
- 注释是不会执行的
- 注释是对代码的解释说明,是让人看得
- 单行注释的快捷键/取消单行注释 Ctrl /, 可以一次选中多行,给其添加单行注释
1.6:python的编程规范
(1)缩进
在编译器中可以用Tab,但最好用空格
(2)空格的使用
(3)代码注释
使用ctrl+/
(4)命名规范
第2章:数字类型与字符串
1.1:变量
(1)变量的定义和使用[掌握]
(2) 数据类型[掌握]
数据类型: int(整型) float(浮点型) str(字符串类型) bool(布尔类型, True False) list(列表) tuple(元组) dict(字典)
type() 函数可以查看变量的数据类型
输入: input() --> str 类型转换
输出: print() %s--字符串 %d -- int %f--float %--%%
f-string {变量}
(3)标识符和关键字[掌握]
- 标识符命名规则: ==由字母,数字和下划线组成,不能以数字开头==
- 变量的命名规范
- 遵循标识符的规则
- 见名知意
- 使用下划线连接
- 不能使用系统的关键字
- 关键字: 系统定义好的标识符,具有特殊的作用
不需要刻意的记忆,后续课程中会逐渐学习
(4) 输出[掌握]
(5)输入[掌握]
(1)input
(2)print()的参数里 ”+“和”,“ 的区别
【1】print()内的“+”前后数据类型保持一致
print("aa"+"bb")
【2】print()内”,“ 用于间隔多个对象
print("请输入公里数,系统会自动转为海里数")
sea_kilometer=input("请输入公里")
nautical_mile=(float(sea_kilometer)/1.852)
print("转换后的海里数为:",nautical_mile)
(6)数据类型转换[掌握]
(7)可变数据和不可变数据类型的区别(重点)
*可变数据类型:list(列表)、dict(字典)、set(集合,不常用)
*不可变数据类型:数值类型(int、float、bool)、string(字符串)、tuple(元组)
*总结:1可变数据类型更改值后,内存地址不发生改变。(列表:地址只与创建有关,内容与增改无关)
2不可变数据类型更改值后,内存地址发生改变。
1.2. 运算符[掌握]
(1)算术运算符
+ - * /
// 整除(求商)
% 取余数
** 指数,幂运算
() 可以改变优先级
(2)赋值运算符
= 将等号右边的结果赋值给等号左边的变量
等号左边,必须是变量,不能是具体的数字
(3)符合赋值运算符
+= c+=a ===> c = c + a
-= c-=a==è c=c-a
(4)比较运算符
比较运算符的结果是 bool 类型, 即 True,或者是 False
== 判断是否相等, 相等是 True. 不相等是 False
!= 判断是否不相等, 不相等是 True, 相等 False
>
<
>=
<=
(5)逻辑运算符
逻辑运算符可以连接连个表达式, 两个表达式共同的结果决定最终的结果是 True,还是 False
and 逻辑与, 连接的两个条件都必须为 True,结果为 True, 一假为假
如果第一个条件为 False,就不会再判断第二个条件
or 逻辑或, 连接的两个条件都为 False,结果为 False, 一真为真
如果第一个条件为 True,第二个条件就不会再判断了
not 逻辑非, 取反,原来是 True,变为 False,原来是 False,变为 True
(6)PEP 8 规范
- 单行注释后边应该有一个空格
- 代码文件的最后一行是空行
步骤:
- 行内注释需要两个空格
-
1.3. 字符串
(1) 字符串定义
1:带引号的内容就是字符串. 2:定义 Str=’1,2,3” 在 python 中,字符串可以乘上一个整数, 字符串 * num
(2)String字符串的方法
(1)使用字符串中的replace()方法模拟敏感词过滤,将含有敏感词的语句使用“*”符号进行替换。 本实例要求编写程序,实现替换语句中敏感词功能。(例如:设置敏感词:“糟糕”“哇靠”) str1=input("输入一段文字,本系统会自动过滤敏感词") str2=str1.replace("糟糕","***").replace("哇靠","***") print("过滤后的文字:"+str2) (2)fromat()格式化输出 name="李倩" age=12 print("你好,我的名字是:{},我今年{}岁".format(name,age))这种常用 print("你好,我的名字是:{1},我今年{0}岁".format(name,age)) 保留n位小数 num1=3.1415926 print("保留2为小数:{:.2f}".format(num1)) 补0,要001 num2=1 print("{:0>3d}".format(num2)) 百分比 {:.0%}:就是百分位的百分比,0.1=10%,0.01=1% 0.001=0% num3=0.01 num4=0.001 print("{:.0%}".format(num3)) print("{:.0%}".format(num4)) print("{:.1%}".format(num4)) (3)字符串分割 split()默空格分割 word="1,2,3,4" str=word.split(",") print("word:",str) Split:获取分割后的其中某一个字符 str="abc,123 efg,567" #以','分割2次后输出 print str.split(',',2);---》['abc', '123 efg', '567'] #以','分割2次后输出地2个参数,1是从0开始,代表第二个参数 print str.split(',',2)[1];-->123 efg (4)去字符串的2边 strip() word=" 1string1 " str=word.strip() print("word:",str) (5)字符串的索引 str_p="python" ---》 "012345" print("[0]",str_p[0]) print("[0:4:1]",str_p[0:4:1]) print("[0:4:2]",str_p[0:4:2]) ---《 -1 -2 -3 -4 -5 -6
(3) 字符串的输出和输出
-
(1) 输入 input() input() 函数得到的内容就是字符串 (2)输出 print() 函数 %s *[1]f-string Address=”河北” Print(f ’欢饮来到{address}’) [2]fromat()格式化输出 name="李倩" age=12 print("你好,我的名字是:{},我今年{}岁".format(name,age))这种常用 print("你好,我的名字是:{1},我今年{0}岁".format(name,age))
-
1.4:常用方法
(1)随机数
【1】随机数的andom.randint(0, 2)#随机生成0-2之间的数 import random随机数包 list=[[],[],[] ]教室 name_list=["a","b","c","d","e","f","t","y"] for i in name_list: num = random.randint(0, 2) list[num].append(i) print(list) for t in list: print(t.leng) 【2】random.random() 功能:随机生成一个 [0,1) 的浮点数 用法: import random number = random.random() # 输出:0.7178886135325596 【3】random.uniform(a,b) 功能:随机生成一个 [a,b) 的浮点数 用法: number = random.uniform(2,4) # 输出:2.070517705689751 【4】random.choice(sequence) 功能:从一个已有的sequence中随机选择一个元素 用法: number = random.choice(range(2,10)) # 输出:6 number = random.choice('anbegvdje') # 输出:g 【5】random.sample(sequence,k) 功能:从某一序列中获取指定长度的片段 用法: a = ['香蕉','苹果','橘子','眼影','眼线'] b = random.sample(a,2) # 输出:['橘子', '苹果'] 【6】random.shuffle(列表) 功能:打乱一个列表的元素顺序 用法: a = ['香蕉','苹果','橘子','眼影','眼线'] random.shuffle(a) # 打乱这个操作不需要重新定义对象,它作用的是对象本身 # 输出:['眼线', '苹果', '眼影', '橘子', '香蕉'] 【7】import secrets#安全机密的随机数 set_jihe={'1','2','3'} set_list=[] #集合是无序的 for item in set_jihe: set_list.append(item) print(secrets.choice(set_list))#随机输出数组
(2)python存盘
网站:
python中在文件中读取与写入的json的strjson与字典转换_stundent的博客-CSDN博客【1】只写--存字符串 # w 只能操作写入 r 只能读取 a 向文件追加 # w+ 可读可写 r+可读可写 a+可读可追加 # wb+写入进制数据 # w模式打开文件,如果而文件中有数据,再次写入内容,会把原来的覆盖掉 file_handle = open('card_417.txt', mode="w") # \n 换行符 file_handle.write(“字符串内容”) file_handle.close()#注意:文件一定要关闭,否则不能存盘
(3)json
【1】将字典类型的--转—string import json import os file_init=open("admin.txt",mode="w",encoding="utf-8") admin_dict={} admin_dict["name"]=name admin_dict["pwd"]=pwd # print("字典",admin_dict) # print("josn:",json.dumps(admin_dict))#json.dumps()用于将dict类型的数据转成str file_init.write(json.dumps(admin_dict)) # json.dumps()用于将dict类型的数据转成str 【2】将jsonStr—转—字典 user_login_file = open("user.txt", mode="r", encoding="utf-8") file_data=user_login_file.read() user_read_dict = json.loads(file_data) #将jsonStr—转—字典 【3】答案的快速写法(考试写,速度比较快) Eval():1将字符串当成有效的表达式来求值并返回计算结果 2简单理解就是直接里面的代码直接运行(没有防止恶意代码的注入) user_login_file = open("user.txt", mode="r", encoding="utf-8") file_data=user_login_file.read() # {2}和我的写法不同处 user_read_dict = eval(file_data)
第3章:流程控制
1.1.判断语句
(1)If 判断的基本格式
if 判断条件: 判断条件为 True,会执行的代码 判断条件为 True,会执行的代码 ... if num1>0: print("num1>0")
-
(2)if else 结构
if 判断条件: 判断条件为 True,会执行的代码 判断条件为 True,会执行的代码 ... else: 判断条件为 False, 会执行的代码 判断条件为 False, 会执行的代码 ..... if 和 else 只会执行其中的一个,
(3)Debug 调试
- 可以查看代码的执行过程
- 可以排查错误
- 打断点(一般可以在代码的开始打上断点,或者在查看代码的地方打断点)
- 右键 debug 运行代码
-
(4)if elif 结构
if 判断条件1:
判断条件1成立,执行的代码
elif 判断条件2:
判断条件1不成立,判断条件2 成立,会执行的代码
else:
判断条件1和判断条件2都不成立,执行的代码
--------
if num1>0:
print("num1>0")
elif num1>2:
print("num1>2")
(5)if 嵌套
if 判断条件1:
判断条件1 成立,会执行的代码
if 判断条件2:
判断条件1成立, 判断条件2成立执行的代码
else:
判断条件1成立, 判断条件2不成立执行的代码
else:
判断条件1不成立,会执行的代码
(6)三目运算
if else 结构变形
if 判断条件1:
表达式1
else:
表达式2
判断条件成立,执行表达式 1, 条件不成立,执行表达式 2
变量 = 表达式1 if 判断条件 else 表达式2 推荐使用扁平化代码
变量最终存储的结构是:
判断条件成立,表达式1的值,
条件不成立,表达式2的值
---jva中
Flag=a>b?True:False
1.2循环
(1)循环的基本语法
while 判断条件:
判断条件成立,执行的代码
判断条件成立,执行的代码
while True: 无限循环
代码
死循环: 相当于是代码的 bug,错误
无限循环: 人为书写的,故意这样写的
i=1
while i<3:
print("while:",i)
i += 1
(2)循环嵌套
while 判断条件1:
代码1
while 判断条件2:
代码2
======
代码 1 执行一次,代码会执行多次
(3)for 循环遍历
for 变量 in 字符串:
代码
for 循环也称为 for 遍历,会将字符串中的字符全部取到
(1)普通for
range(2)循环的次数
for i in range(2):
print("dwdwdw")
(2)forech
str1="zjx"
for i in str1:
print(i)
(4)Break 和 continue
1. break 和 continue 是 python 两个关键字
2. break 和 continue 只能用在循环中
3. break 是终止循环的执行, 即循环代码遇到 break,就不再循环了
continue 是结束本次循环,继续下一次循环, 即本次循环剩下的代码不再执行,但会进行下一次循环
(5)循环 else 结构
for x in xx:
if xxx:
xx if 判断条件成立会执行
else:
xxx if 判断条件不成立,会执行
else:
xxx for 循环代码运行结束,但是不是被 break 终止的时候会执行
需求:
有一个字符串 'hello python', 想要判断这个字符串中有没有包含 p 这个字符,如果包含,就输出, 包含 p, 如果没有 p ,就输出,不包含
(6)总结补充
num = 76
使用代码的方法,求出这个数字的个位数和十位数
个位数: num % 10
十位数: num // 10
判断 if elif else
if 判断条件:
pass 占位,空代码 让代码不报错
elif 判断条件:
pass
else:
pass
循环: 重复做一件事 while for
while 判断条件:
pass
for i in xxx:
pass
break 和 continue,
第4章:列表与元组
1.1列表
(1)列表的定义
List=[“1”,”2”]
(2)列表的方法
列表的基本方法
【1】定义
list=[1,2,3]
list1=[10,20,30]
【2】方法:
1insert(0,4) 功能:insert(位置,内容)
list.insert(0,4)
print("insert(0,4):",list)
2append(内容) 功能:在末尾添加
list.append(5)
print("append(5):",list)
3sort()排序 功能:升序:小--大
list.sort()
print("sort():",list)
4extend() 功能:在列表添加另一个列表中的所有元素
list.extend(list1)
print("extend():",list)
5del() 功能:删除元素
del list[0]
print("del:",list)
6remove(1)功能:移除与1相同的元素
list.remove(1)
print("remove:",list)
7pop() 功能:移除索引位置的元素,没有写默认末尾
list.pop(0)
print("pop();",list)
8数组赋值修改
list[0]=4
print("list[0]=4:",list)
(3)遍历输出
遍历(foreach)
for i in list:
print(i)
1.2:嵌套列表
(1)嵌套数组的方法
import random
# 定义一个列表用来保存3个办公室
offices = [[], [], []]
# 定义一个列表用来存储8位老师的名字
names = ['张老师', '李老师', '赵老师', '高老师',
'刘老师', '周老师', '王老师', '吴老师']
for name in names:
# 将8位老师按照索引为0、1、2进行分组
index = random.randint(0, 2)
# print(index)
# 将8位老师放在不同列表中
offices[index].append(name)
flag = 1
for tempNames in offices:
print('办公室%d的人数为:%d' % (flag, len(tempNames)))
flag += 1
for name in tempNames:
print("%s" % name, end=' ')
print(" ")
(2)二维数组(就是嵌套数组)
num1=[]
num2=[]
1数组的存入
for i in range(4):
num2.append(i)
num1.append(num2)
print(num1)
print(num1)
2数组的便利
for i in range(4):
for t in range(4):
print(num1[i][t])
3数组的删除
for i in range(4):
for t in range(4):
if num1[i][t]==3:
num1[i][t]=
print(num1)
(3)元组
元组的练习
(1)元组的定义
yunzu = (1, 'p')
yunzu1 = ('1', '2')
print(yunzu)
print(yunzu1)
不推荐,tuple(里的参数不能加,)
list1=['1','2','3']
tup_2=tuple(list1)
print(tup_2)
tup_3=tuple('abc')
print(tup_3)
tup_4=tuple('abc[12]')
print(tup_4)
(2)元组是不可修改的
yuanzu2=('hello','100','python')
yuanzu2[0]='hi'
print("sout:",yuanzu2[0])
报错:
File "C:/Users/DELL/PycharmProjects/dom01/venv/dom/dom06.py", line 9, in <module>
yuanzu2[0]='hi'
TypeError: 'tuple' object does not support item assignment
(3)元组里的列表是可以修改的,只要保证地址不变就行
yuanzu3=('hello','100',['1','2','3'])
yuanzu3[2][0]='4'
print("修改元组里的数组内容:",yuanzu3)
(4)遍历
yuanzu4=('1','2','3')
for i in yuanzu4:
print(i)
1.3:元组
(1)元组的基础
#(1)元组的定义
yunzu = (1, 'p')
yunzu1 = ('1', '2')
Yuanzhu2=(‘1’,)#元组只有一个元素时,参数的后面必须带“,”
print(yunzu)
print(yunzu1)
#不推荐,tuple(里的参数不能加,)
list1=['1','2','3']
tup_2=tuple(list1)
print(tup_2)
tup_3=tuple('abc')
print(tup_3)
tup_4=tuple('abc[12]')
print(tup_4)
#(2)元组是不可修改的
# yuanzu2=('hello','100','python')
# yuanzu2[0]='hi'
# print("sout:",yuanzu2[0])
#File "C:/Users/DELL/PycharmProjects/dom01/venv/dom/dom06.py", line 9, in <module>
# yuanzu2[0]='hi'
# TypeError: 'tuple' object does not support item assignment
#(3)元组里的列表是可以修改的,只要保证地址不变就行
# yuanzu3=('hello','100',['1','2','3'])
# yuanzu3[2][0]='4'
# print("修改元组里的数组内容:",yuanzu3)
#(4)遍历
yuanzu4=('1','2','3')
for i in yuanzu4:
print(i)
第5章:字典和集合
1.1:字典
#字典/json
#(1)字典的定义
# info_fact={'name':'herry','age':20,'address':'北京'}
# print("字典的定义",info_fact)
#
# info_dict=dict(name='harry',age='21',address='北京')
# print("dicr:",info_dict)
#(2)key---访问字典
# info_fact1={'name':'herry','age':20,'address':'北京'}
# print("字典的定义",info_fact1['name'])
#(3)字典的方法
#[1]添加update
# info_fact2={'st1':'1'}
# info_fact2.update(st2='2')
# info_fact2['st3']='3' #通过键添加
# print("添加:",info_fact2)
#[2]修改update
# info_fact3={'st1':'1','str2':'2','str3':'3'}
# info_fact3.update(str2=2.2)
# info_fact3['str3']='3.3' #通过键添加
# print("添加:",info_fact3)
#[3]删除
# pop() 通过键来删除
# info_fact4={'str1':'1','str2':'2','str3':'3'}
# info_fact4.pop('str1')
# print(info_fact4)
#popitem() 随机删除字典中的元素
# info_fact5={'str1':'1','str2':'2','str3':'3'}
# print(info_fact5)
# info_fact5.popitem()
# print(info_fact5)
#clear() 清除字典里的全部元素
# info_fact6={'str1':'1','str2':'2','str3':'3'}
# info_fact6.clear()
# print(info_fact6)
#[4]字典元素的查询
#1 items()查询字典里所有的元素
# info_fact7={'str1':'1','str2':'2','str3':'3'}
# print( info_fact7.items() )
#2 keys() 查询字典里所有的键
# info_fact7={'str1':'1','str2':'2','str3':'3'}
# print( info_fact7.keys() )
#3 values() 获取字典里所有的元素
# info_fact7={'str1':'1','str2':'2','str3':'3'}
# print( info_fact7.values() )
#4 values()的输出可以用forech输出
# info_fact7={'str1':'1','str2':'2','str3':'3'}
# for i in info_fact7.values():
# print(i)
#5 get():通过key,获取单个value()
print(info_fact7.get("str1"))
[5]自带遍历的判断字典键值是否存在
info_fact8={'str1':'1','str2':'2','str3':'3'}
if 'str4' in info_fact8:
print(info_fact8['str4'])
else:
print("键值不存在")
#[6]利用items和for循环来获取字典的key和value(最好用的遍历)
for key,value in id_dict.items():
if key==address:
print(value)
#[7]字典与json的区别
import json
admin_dict={}
admin_dict["name"]="root"
admin_dict["pwd"]="a123123"
print("字典",admin_dict)
admin_json=json.dumps(admin_dict)
print("利用dumps将字典--sjonstr:",admin_json)#json.dumps()用于将dict类型的数据转成str
admin_loads=json.loads(admin_json)
print("利用loads将jsonstr---字典:",admin_loads)#json.loads()用于将str类型的数据转成dict。
运行截图:
[7]字典与json的区别
1.2:集合
#5.3集合
# set()集合中的元素:可以增删改
# frozenset()集合中的元素:不可以增删改
注意:1集合里只能添加不可变数据类型(数值类型(int、float、bool)、string(字符串)、tuple(元组))
2不能添加可变数据类型(list(列表)、dict(字典)、set(集合,不常用))
#(1)set()的创建
# set_one=set( [1,2,3] )#存入数组
# set_two=set( (1,2,3) )#存入元组
# set_three={1,2,3}#使用花括号,创建可变的集合
# print( set_one )
# print( set_two )
# print( set_three )
#frozenset()
# frozenset_one=frozenset( [1,2,3] )#存入数组
# frozenset_twe=frozenset( (1,2,3) )#存入元组
# print( frozenset_one )
# print( frozenset_twe )
#(2)集合的方法
#[1]添加
#add()
# demo_set=set()#创建一个set集合
# demo_set.add('py')
# print(demo_set)
# demo_set1=set()#创建一个set集合
# demo_set1.update('thon')
# print(demo_set1)
demo_set2=set([1,2])#创建一个列表的set集合(set(里面要是一个可迭代对象))
demo_set2.add(3)#只能添加不变数据类型,不能添加列表等可变数据类型
print(demo_set2)#在set(列表和元组)--结果都是集合
demo_set3=set((1,2,3))#创建一个元组的set集合(set(里面要是一个可迭代对象))
demo_set3.add(4)#只能添加数字和字母,不能添加元组和列表
print(demo_set3)#在set(列表和元组)--结果都是集合
#[2]删除
# #remove() 删除可变集合中,指定的元素
# #注意:若指定元素不存在,会KeyError报错
# remove_one={'1','2','3'}#存入数组
# remove_one.remove('1')
# print("remove():",remove_one)
#
# #discard() 删除指定元素,若指定元素不存在,不执行
# discard_one={'1','2','3'}
# discard_one.discard('1')
# print("discard():",discard_one)
# discard_twe={'1','2','3'}
# discard_twe.discard('4')
# print("discard():",discard_twe)
#
# #pop() 用于删除可变集合中的随机元素
# pop_set={'1','2','3'}
# pop_set.pop()#随机删除
# print(pop_set)
#
# #clear() 用于删除可变集合set里的全部元素
# clear_one={'1','2','3'}
# clear_one.clear()
# print(clear_one)
#【3】遍历
set_list={'1','2','3'}
#集合是无序的
for item in set_list:
print(item)
【4】集合—列表进行随机去一个值输出
import secrets#安全机密的随机数
set_jihe={'1','2','3'}
set_list=[]
#集合是无序的
for item in set_jihe:
set_list.append(item)
print(secrets.choice(set_list))#随机输出数组
#(3)集合类型的操作符
# &交集 |并集 -差集 ^对称
#交集 &
set_a={'a','c'}
set_b={'b','c'}
print(set_a & set_b )# c
#并集 |
set_a={'a','c'}
set_b={'b','c'}
print(set_a | set_b )#a,b,c
#差集 - (谁减谁,谁就缺一角)
set_a={'a','c'}
set_b={'b','c'}
print(set_a - set_b )# a
#对称 ^ (获取只属于set_a和set_b集合里的元素)
set_a={'a','c'}
set_b={'b','c'}
print(set_a ^ set_b )# a,b
第7章:类与面向对象------第9章:错误与异常的笔记在