Python | 基本语法与面向对象

本文介绍了Python的基础语法,涵盖数据类型、运算符、字符串操作、类型转换、集合与字典、决策结构,以及正则表达式的应用。还深入讲解了模块化编程和面向对象编程的原理与实践,包括函数定义、模块构建、OOP概念和实例。
摘要由CSDN通过智能技术生成

一.基本语法

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中,对象被抽象为数据和动作的结合体,数据用属性(变量)表示,动作用方法表示

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值