一.基本语法
1.基本数据类型
整型:也就是整数,它的表示和数学上表示一致,当遇到长整数时,为了让可读性更高,可以用下划线连接,比如1_000_000,这就等价于没有下划线的一百万
浮点型:就是小数,大的浮点型可以用科学记数法表示,如1e4等价于10000
布尔型:True或者False,存在三种运算,与,或,非,分别用and,or,not关键字
2.运算符
算术运算符
比较运算符:返回布尔值
3.字符串
字符串就是使用单引号或者双引号或者三引号括起来的文本
三引号常用来表示跨行文本
使用反斜杠表示转义,\n表示换行,\t表示Tab,\\表示\
当使用r来修饰字符串时,r表示raw,表示使用原始字符串,即不转义
字符串的运算符:拼接(+),重复(*),索引([ ]),切片([ : ]),是否在(in)
字符串的格式化输出:格式化字符串用%s,格式化数值用%d,格式化浮点数用%f
字符串的内建函数,经常会用到的有:
首字符大写(capitalize)
以子串结尾(endswith),以子串开头(startswith)
是否是数字(isdigit)
小写化(lower)
去掉两端的空白字符(strip)
替换(replace)
合并(join)
字符串长度(len)
4.类型转换
使用内建函数显式转换:int(),float(),bool(),str()
布尔运算符的隐式转换:一般情况下,[ ],{ },( ),' ',set(),0,None都被默认转换为False,其余会被转换为True
5.集合类型
集合类型用来存放多个不同类型的对象,常见的集合类型包括:列表(list),元组(tuple),集合(set),字典(dict)
列表:是一种有序集合,元素可以是任意类型
列表常见操作:索引([ ]),切片([ : ]),修改(=),拼接(+),复制(*),迭代(for),检查元素是否存在(in)
列表编辑操作:追加元素到尾部(append),插入元素到特定位置(insert),删除特定位置元素(remove),弹出尾部元素(pop),合并两个列表(extend),反转(reverse),排序(sort)
使用extend合并两个列表,区别于列表拼接+,虽然两个都是合并列表,但extend是改第一个列表,是原地操作;拼接是原始列表都不变,返回一个新的列表
我们还可以使用内建函数对列表进行操作:列表长度(len),最大值(max),最小值(min),转换(list)
列表解析式,它仅通过一行,迭代序列生成一个列表,例[ i for i in l if i>2]
元组:和列表非常类似,但是不能修改
元组的常见操作和列表非常类似,它可以索引,切片,拼接,复制,迭代,判断元素是否存在等,但是它不能被修改,也就是说它不支持所有的编辑操作
集合:就是无序的,不重复的元素集,我们可以用大括号来定义一个集合,也可以用set()函数生成一个空集合
常见集合操作:迭代(for),元素是否存在(in)
集合的编辑操作:添加元素(add),删除元素(remove),清空(clear)
常见的集合操作:交集(&),并集(|),差集(-),对称差(^)
内建函数也可以操作集合:获得集合长度(len),获得集合中的最大值(max),使用set函数将序列转化为集合(set)
字典:是用来存储key value对的集合,key不能重复,可以用大括号来构造一个字典
常见操作:迭代(for),元素是否存在(in),访问([ ])
常见编辑操作:修改([ ] =),删除(del [ ]),添加([ ] =)
常见的函数操作:指定默认值的访问(get),获取所有的key(keys),获取所有的value(values),获取所有key-value对(items),清空(clear)
set经常被用来对序列去重,因为集合是没有重复元素的
判断元素是否存在时,集合比列表速度快得多,尤其是数据量很大时
6.三种决策结构:顺序结构,条件结构,循环结构
顺序结构:最为常见,即程序从上往下执行
条件结构:根据条件结果来决定执行哪个代码块
循环结构:for循环和while循环
python中没有do while语句
为了减少运算,请及时跳出循环,尤其是在处理大数据量下,尽量减少循环次数,提升代码效率
continue可以减少代码嵌套层数,使代码更加优雅
列表解析式的速度比for循环更快,实践中推荐优先使用
二.正则表达式
1.正则是什么?
正则表达式,通常被用来检索或替换符合某种模式的文本,这里的模式即规则
正则是一种逻辑公式,主要用来对字符串进行操作
对于搞NLP,正则表达式非常重要,正则和NLP模型一样,都是对文本进行处理,对于模型产生的一些异常结果,我们往往需要写规则去人工干预,正则就是写规则的一种强大工具
2.语法
可以使用的普通字符:字母,数字,标点符号和其他符号(\s,\S,\w等)
转义字符:换行符(\n),回车符(\r),制表符(\t),垂直制表符(\v),换页符(\f)
限定符:用来指定前面匹配的次数,正则提供了6种可用的限定符,+,*,{ }都是贪婪的,它们尽可能多的匹配
定位符:用来描述字符串或者词的边界
逻辑或:使用 | 或者[ ]表示
分组或断言:使用()来表示
分组:是将正则分块,使得你明确知道当前匹配属于哪块
断言:使得你可以在匹配时限定一些上下文条件
分组和断言非常适合NLP领域的信息抽取任务,信息抽取是将文本里面的关键信息抽取出来
元字符:指在正则表达式中具有特殊意义的专用字符,因为元字符已经被正则征用,如果你想匹配元字符,必须使用 \ 来转义
正则表达式的一些运算符是有优先级的
3.Python里的正则
Python内置库re提供了正则表达式的实现,我们可以直接使用
①匹配
re.match尝试从字符串的起始位置匹配一个模式
re.match(pattern,string,flags=0)
re.fullmatch用来实现从起始到结束的完全匹配
re.fullmatch(pattern,string,flags=0)
②搜索
re.search扫描整个字符串,并返回第一个成功的匹配
注意search和match的区别在于:match限定只会从头开始匹配
re.search(pattern,string,flags=0)
假如你的正则有分组,你可以根据分组号取匹配里的相应块
③替换
re.sub提供将匹配到的字符串进行替换的功能
re.sub(pattern,repl,string,count=0,flags=0)
这里的count表示替换次数
④查找所有
re.search只返回第一个匹配,如果我们想返回所有匹配,可以使用re.findall和re.finditer
re.findall:直接返回所有匹配的字符串
re.finditer:依次返回所有匹配的match对象
re.findall(pattern,string,flags=0)
re.finditer(pattern,string,flags=0)
⑤分割
re.split主要用来分割字符串
Python的字符串函数str.split也提供了字符串分割功能,但是它的功能过于简单,我们可以使用re.split实现更复杂的字符串分割
⑥编译正则
re.compile用来编译正则,被编译后的正则运行起来速度更快
re.compile(pattern,flags=0)
4.更强大的正则库 -- regex
第三方库regex提供了额外的一些功能,以及对unicode的支持更加彻底,并且基本兼容内置库re模块,如果发现内置re库不能满足你的需求,可以尝试使用regex库
三.模块化程序和面向对象
1.模块化程序
①为什么要模块化
定义:指在进行程序设计时,将一个大程序按照功能划分成若干小程序模块,每个小程序模块完成一个确定的功能,并在这些模块之间建立必要的联系,通过模块的互相协作完成整个功能的程序设计方法
简单来说,模块化就是将大程序按照功能拆解成若干个独立的小模块,然后通过协调这些小模块,完成整个功能
②函数的定义和传参
函数是组织好的,实现特定功能的代码段,函数是最小级别的模块化
def 函数名(参数列表):
函数体
return 返回值
函数传参包括:顺序传参,关键字传参,列表传参和字典传参
顺序传参:按照参数位置传参
关键字传参:明确声明传给函数哪个参数
列表传参:使用一个序列(比如list或tuple),按顺序解析参数
字典传参:使用一个字典,按字典的key解析参数
常见的函数参数定义:位置参数,关键字参数,不定长参数
def func1(a,b,c=0,d=0,*args,**kwargs):
print('a={},b={},c={},d={},args={},kwargs={}'.format(a,b,c,d,args,kwargs))
以上函数定义:
a,b两个参数均为位置参数,传参时必填
c,d两个参数均为关键字参数,它允许我们指定其默认值,传参时选填
args和kwargs两个均为不定长参数,它允许我们传递变长的参数给此函数,其中:
args用来解析多余的顺序传参,参数被解析为tuple
kwargs用来解析多余的关键字传参,参数被解析为dict
匿名函数:不通过def关键字定义,而是通过lambda表达式定义,它总是一行,主要用来封装简单的代码
你应该总是使用函数来模块化你的程序,提高代码的可读性和复用性
函数定义时,使用不定长参数可以增加函数的扩展性,所谓扩展性好,是指比如在调用时需要新增传参时,函数签名(函数名+参数列表)无需发生任何改动
匿名函数常被用作max,min,sort等函数的key参数,表示对元素做一个转换
③模块的构建和导入
在Python里面,一个py文件就是一个模块,在模块里面,你可以定义一些类或者函数,并执行它
模块只有被导入后,才能使用
你可以导入的三种模块:Python内置模块(比如sys),第三方模块(比如sklearn),你自己写的模块
模块的导入使用import语句,你可以:
直接import模块
使用from...import...语句,从模块里面import变量,类或函数
使用from...import * 语句,将模块里所有内容import进来,但是不推荐这么做,你应该明确引入你需要的内容
模块的执行直接输入命令:python<module>.py或python -m <module>
你应该将模块内主函数的执行放到if __name__ == '__main__'条件内, __name__内置变量只有在你运行当前module时,才为__main__
想要成功import某个模块,必须确保其在搜索路径中被找到
所谓搜索路径,就是一系列存放python模块的目录
搜索路径保存在sys.path中,我们可以将其打印出来
④包的概念
包主要用来组织模块,它可以有多种级别
一个包含__init__.py文件(经常为空)的目录就被视为一个包
模块的导入分为绝对导入和相对导入,使用 * 表示当前包的导入即为相对导入,为了代码可读性更高,建议无特殊情况都使用绝对导入
⑤标准包结构
包由模块构成
模块由函数/类构成
2.面向对象编程(Object Oriented Programming,简称OOP)
把相关的数据和操作组织为一个整体,从更高的层次来进行系统建模
在OOP中,对象被抽象为数据和动作的结合体,数据用属性(变量)表示,动作用方法表示