一、指导方针
指导方针:
IDE提示,哪里找,常用模块及命令
- Python标准库: 如builtins、math、datetime
- 菜鸟教程查用法
- IDE:自动补全tab、函数用法
- 命令行dir(builtins):查看库/类下所有的类、函数/方法和属性
- 命令行help(abs):查看库的说明、函数的使用、变量的操作
关于dir和help的作用:分析 ('list' and 'len') in dir(builtins)和help(builtins.list)和help(builtins.len)
二、语法与常用库
(1)基础语法
a、数据类型、函数、面向对象
- 数字:3e-2,1+2j,常量pi,e
- 字符串、列表、元组:变量[头下标:尾下标:步长](ps:左闭右开)
- a=[]/{}/()/set();type(a):list/dir/tuple/set
- tuple的元素不能修改,但也可以*+
- list/dir/tuple/set推导式: []/{}/tuple()/{}
- isinstance()会认为子类是一种父类类型;type()不会认为子类是一种父类类型;
isinstance(True, int)为True;
type(True)==int为False - 运算符:/,%,//;&,^,<<(位运算符把数字看作二进制来进行计算,集合运算);and,or,not逻辑运算符;in,not in成员运算符返回bool值;is,not is身份运算符
- is: 判断两个变量内存地址id是否一样。只有数值型和字符串型,并且在通用对象池中的情况下,a is b才为True;否则当a和b是int、str、tuple、list、dict或set型时,a is b均为False1
- ==: 判断两个变量的值是否相等。其中True为1,False为0.
- 函数的参数:必选参数,默认参数,*args可变参数tuple(调用时,在list或tuple前面加一个*号,把list或tuple的元素变成可变参数传进去),**kw关键字参数,*,name1,name2命名关键字参数。
- 类:属性(类变量、实例变量:__init__里的self.变量名)
类变量定义在“类里方法外”的变量,是该类所有实例共享的变量,但是实例对象只能访问、不可修改类变量,类变量只能通过[类名.类变量名]进行修改,每个实例对象去访问同一个类变量[实例名.类变量名]都将得到相同结果。通过对象名引用变量,会先找有没有这个同名的实例变量,如果没有,引用到的才是类变量
)和方法(类的方法第一个参数必须self‘或任意名字’,代表类的实例,而非类
)、继承(多个基类、方法重写),私有属性和方法(双下划线开头,只能在类的内部使用),专有方法(双下划线开头结尾,魔术方法) if __name__ == '__main__':
使该模块被另一个程序第一次引入时,其主程序不运行
b、语句
- assert语句2:
assert expression
,不满足条件则直接触发异常,不必执行接下来的代码
- print语句:print(“%.2f”%(3.333))和print(“{:<8d.2f}”.format())
- break 语句: 可以跳出for和while的循环体且循环语句的else子句也不执行。
- del:删除
- lambda语句(匿名函数):
lambda: [arg1[,argn]]:expression
- try:执行代码 except:发生任何异常时执行的代码 else:没有发生任何异常时执行的代码 finally:无论是否发生异常都将执行的代码
- with关键字系统会自动调用f.close()方法, with的作用等效于文件处理中的try/finally语句
with open('./test_runoob.txt') as f: read_data = f.read()
(2)常用库
- os模块:chdir,getcwd,listdir,os.path模块(主要用于获取文件的属性:abspath,basename,dirname,join,split)
function usage os.getcwd() 获取当前工作目录,也就是在哪个目录下运行这个程序 os.path.abspath("train.py“) 获取train.py这个文件的绝对路径 os.path.abspath(__file__) 只有当脚本执行时,获取当前脚本的完整路径 - builtins模块:里面有内置函数3,不需要写成builtins.function(),可直接使用。如len()\help()\dir()\list\dict\set\tuple
- keyword模块:包含对python关键字(如assert、break、global、nonlocal)进行操作的函数
- 内置模块的str类: capitalize,count,find,is系列如islower,join,len,lower,max,replace,split,swapcase,title,upper
- 内置模块的list类: list,append,count,index,remove,sort
- 内置模块的dict类:items(和item的区别),keys,values
- 内置模块的set类: add,update,remove
- math模块:ceil,fabs,modf,round,acos,degrees
- random模块: random,seed,shuffle,uniform
- copy模块:copy
- 内置io模块:open函数(r,w,a)返回TextIOWrapper修饰器,里面包含read,readline,write,close
- datetime模块:date.today
- typing模块:自带
弱类型注解(type hints)
,如long,int,float,bool,str,list,tuple等:s: str = ‘abc’; def add(a: int=0) -> int。引入typing模块进行强类型注解
,如List,Set,Iterator,Any,NoReturn,Sequence,Union等:def func(a: int, string: str) -> Union[int, str, [int, float]] - re(正则表达式)4:compile,match(只匹配字符串的开始)/search(扫描整个字符串并返回第一个成功的匹配)/findall(以列表形式返回整个字符串中所有成功的匹配)/finditer(以迭代器形式返回整个字符串中所有成功的匹配),sub(将匹配到的数据进⾏替换,返回替换后的字符串)/subn(返回替换后的字符串和替换次数组成的元组),split(根据匹配进⾏切割字符串,并返回⼀个列表),参数细节
(1)匹配单个字符: .(任意字符),[](里面列举的字符), [^](不在[]里面列举的字符),\d(数字),\s(空格),\w(字母数字下划线)。大写即非
(2)匹配多个字符(针对前一个\w字符或()分组): *(匹配可有可无),+(匹配至少1次),?(匹配0或1次),{m}(匹配m次),{m,n}(匹配m~n次)import re # re.match(正则表达式,字符串,标志位),从起始位置开始匹配,匹配失败返回none,成功返回一个匹配的对象,re.I表示忽略大小写 result1 = re.match(".[hH]i[4-9]\d0\wbC","$Hi520abc123",flags=re.I)# result1为:<re.Match object; span=(0, 8), match='$Hi520abc'> result1.group()#使⽤group⽅法来提取数据: '$Hi520abc'
(3)匹配开头和结尾: ^(匹配字符串开头),$(匹配字符串结尾)#匹配出⼀个字符串:该字符串的第⼀个字⺟为⼤写字符,后⾯都是⼩写字⺟并且这些⼩写字⺟可有可⽆ re.match("[A-Z][a-z]*","AabcdeF")# <re.Match object; span=(0, 6), match='Aabcde'> #匹配出有效的变量名:字母或下划线开头,其后为字母数字或下划线 [re.match("[a-zA-Z_]+[\w]*",name) for name in ["name1", "_name", "2_name", "__name__"]] # 输出:[<re.Match object; span=(0, 5), match='name1'>, # <re.Match object; span=(0, 5), match='_name'>, # None, # <re.Match object; span=(0, 8), match='__name__'>]
(4)匹配分组: |(匹配左右任意⼀个表达式),()(将括号内字符串作为⼀个分组),\num(引⽤分组num匹配到的字符串),(?P<name>)和(?P=name)组合使用(前者用于给分组起别名,后者引⽤别名为name的分组匹配到的字符串)#匹配地址是163.com的邮箱: [re.match("[\w]{4,20}@163\.com$", email) for email in ["xiaoWang@163.comhi","xiaowang@qq.com","xiaoWang@163.com"]] # 输出:[None, None, <re.Match object; span=(0, 16), match='xiaoWang@163.com'>]
#匹配出0-100之间的数字: [re.match("[1-9]?\d$|100", number) for number in ["12","01","100"]] # 输出:[<re.Match object; span=(0, 2), match='12'>, # None, # <re.Match object; span=(0, 3), match='100'>] #匹配地址是163、126、qq.com的邮箱: [re.match("[\w]{4,20}@(163|126|qq)\.com$", email) for email in ["test@163.com","test@gmail.com","test@qq.com"]] # 输出:[<re.Match object; span=(0, 12), match='test@163.com'>, # None, # <re.Match object; span=(0, 15), match='test@qq.com'>] #使⽤group⽅法来提取数据,使用group(num) 或 groups() 来获取匹配到的内容,num的值为0~(正则表达式中()的数目,即分组数) #提取区号和电话号码 ret = re.match("([^-]*)-(\d+)","010-12345678")#[^]表示不在[]里面列举的字符,^相当于取反操作 print(ret.group())#等价print(ret.group(0)),输出:010-12345678 print(ret.group(1))#输出:010 print(ret.group(2))#输出:12345678 print(ret.groups())#输出:('010', '12345678') #\num的使用:匹配出 <html><h1>www<h1><html>。下面的\1和\2分别代表第一个分组()和第二个分组()的内容 [re.match(r"<(\w*)><(\w*)>.*<\2><\1>", str) for str in["<html><h1>www<h2><html>","<html><h1>www<h1><html>"]] #输出:[None, <re.Match object; span=(0, 23), match='<html><h1>www<h1><html>'>] #(?P\<name>)和(?P=name)的使用:匹配出 <html><h1>www<h1><html>。一个用于标记,一个用于在同一个正则表达式中复用 re.match(r"<(?P<分组1>\w*)><(?P<分组2>\w*)>.*<(?P=分组2)><(?P=分组1)>", "<html><h1>www<h1><html>") #输出:<re.Match object; span=(0, 23), match='<html><h1>www<h1><html>'>
三、修复bug
- vscode中.py文件
运行时
os.getcwd()获取当前工作目录,而调试时
获取当前工程目录。所以调试时加一行:os.chdir('./工程下的工作目录')
- 语法错误(SyntaxError)和异常(运行期检测到的错误,以不同的类型出现)
四、插件拓展
- ctrl+shift+p:调出命令板(vscode自带命令和插件扩展命令,也可以修改命令快捷键)
- vscode用markdown编辑时,插入粘贴板的图片:ctrl+alt+v或先ctrl+shift+p再paste image(利用了paste image插件)
五、记忆卡片
1.数字和常数
2.切片
3.空列表、集合、元组、字典
4.哪个元素不可修改
5.推导式
6.判断类型
7.运算符:算术、位、集合、逻辑
8.in, is, ==
9.ctrl+shift+p, ctrl+alt+v
1、函数的参数
2、类的属性/方法,继承; 魔术方法
3、只在当前模块运行: name
4、assert, print, break,else, del,raise
5、lambda, try, except, else, finally,with
6、global,nonlocal,end
7、SyntaxError和异常
1、builtins:len,help,dir,open(r,w,a),class list/tuple/str
TextIOWrapper: read,readline,write,close
str: capitalize,count,find,islower,join,max,
replace,split,title,upper,lower
list: append,count,index,remove,sort
dict: keys,values,item
set: add,update,remove
2、os: chdir,getcwd,listdir;
path.abspath,basename,dirname,join,split
3、math: ceil,modf,fabs,round,acos,degree
4、random: random,seed,shuffle,uniform
5、copy: copy,deepcopy
6、datetime: date.today
7、typing:long,int,float,bool,str,list,tuple;List,Set,Iterator,Any,NoReturn,Sequence,Union