当前位置:   article > 正文

Python_python全栈

python全栈

第一章 初识Python

Python它是一种直译式,面向对象,解释式的脚本语言。有很多库,被称为胶水语言。

  1. def print_hi(name):
  2. print(f'Hi, {name}')
  3. if __name__ == '__main__':
  4. print_hi('PyCharm')
  • 分号 ; 分割一行多句
  • 新行作为语句的结束标识,可以使用 \ 将一行语句分为多行显示( [], {}, 或 () 中不用 )
  • 使用缩进来表示代码块,不需要使用大括号 {}
  • # 注释一行 ''' 注释多行 '''   """ 注释多行 """ (python中单引号=双引号)
  • pass 是空语句,它不做任何事情,一般用做占位语句,作用是保持程序结构的完整性。

第二章 数据结构

一、基础知识

1. 标识符

Python 中以下划线开头的标识符有特殊含义:

  • _xxx :表示不能直接访问的类属性,需通过类提供的接口访问,不能用from xxx import * 导入
  • __xx:表示私有成员
  • __xx__:表示 Python 中内置标识

关键字:Python关键字大全

andexecnotassertfinallyoras
breakforpassclassfromprinttrue
continueglobalraisedefifreturnfalse
delimporttryelifinwhilenone
elseiswithexceptlambdayieldnonlocal

2. 命名空间

通常在不同时刻创建的命名空间拥有不同的生命周期:

  • 内置:在 Python 解释器启动时创建,退出时销毁。
  • 全局:在模块定义被读入时创建,在 Python 解释器退出时销毁。
  • 局部:对于类,在 Python 解释器读到类定义时创建,类定义结束后销毁;对于函数,在函数被调用时创建,函数执行完成或出现未捕获的异常时销毁。

3. 作用域

  • 局部:最先被搜索的最内部作用域,包含局部名称。
  • 嵌套:根据嵌套层次由内向外搜索,包含非全局、非局部名称。
  • 全局:倒数第二个被搜索,包含当前模块的全局名称。
  • 内建:最后被搜索,包含内置名称的命名空间。

修改作用域:

  • global修改局部作用域的变量为全局作用域
  • nonlocal修改嵌套作用域中的变量为全局作用域

4. 引用

  • 引用是一种变量指向数据存储空间的现象
  • 相同数据在内存空间中仅占用一个存储空间

二、数据类型

type(变量/常量)    # 可查询变量所指的对象类型

1. 数字Num

数据类型:int(整数)float(浮点数)complex(复数)

bool(布尔)None(空值)

模块描述
math提供了对 C 标准定义的数学函数的访问(不适用于复数)
cmath提供了一些关于复数的数学函数
decimal为快速正确舍入的十进制浮点运算提供支持
fractions为分数运算提供支持
random实现各种分布的伪随机数生成器
statistics提供了用于计算数字数据的数理统计量的函数
math模块中函数描述
abs(x)返回 x 的绝对值
ceil(x)返回 x 的上入整数,如:math.ceil(1.1) 返回 2
floor(x)返回 x 的下舍整数,如:math.floor(1.1) 返回 1
exp(x)返回 e 的 x 次幂
log(x)返回以 e 为底 x 的对数
log10(x)返回以 10 为底 x 的对数
pow(x, y)返回 x 的 y 次幂
sqrt(x)返回 x 的平方根
factorial(x)返回 x 的阶乘

2. 字符串Str

通过单引号 '、双引号 "、三引号 ''' 或 """ 来定

  1. my_str.find(str start=0, end=len(mystr)) # 检测str1是否包含在my_str中,如果是返回开始的索引值,否则返回-1
  2. my_str.rfind(str, start=0, end=len(my_str)) # 从右边开始查找
  3. my_str.count(str, start=0, end=len(mystr)) # 返回str在start和end之间在my_str里面出现的次数
  4. my_str.replace(str1, str2, mystr.count(str1)) # 把my_str中的str1替换成str2,如果count指定,则替换不超过count次
  5. my_str.split(str=" ", maxsplit) # 以str为分隔符切片my_str,如果maxsplit有指定值,则仅分隔 maxsplit个子字符串
  6. my_str.startswith(hello) # 检查字符串是否是以hello开头, 是则返回True,否则返回False
  7. my_str.endswith(obj) # 检查字符串是否以obj结束,如果是返回True,否则返回 False.
  8. my_str.lower() # 所有大写字符变小写
  9. my_str.upper() # 所有小写字母变大写
  10. my_str.strip() # 删除字符串两端的空白字符
  11. my_str.partition(str) # 把my_str以str分割成三部分,str前,str和str后
  12. my_str.splitlines() # 按照行分隔,返回一个包含各行作为元素的列表
  13. my_str.isalpha() # 如果 my_str 所有字符都是字母(空格、小数点不算) 则返回 True,否则返回 False
  14. my_str.isdigit() # 如果 my_str 只包含数字则返回 True 否则返回 False.
  15. my_str.isalnum() # 如果 my_str 所有字符都是字母或数字则返回 True,否则返回 False
  16. my_str.join(str) # my_str 中每个元素后面插入str,构造出一个新的字符串

 序列sequene

  • 一块存放多个值的连续内存空间,按顺序排列,每个值所在位置都有一个编号,称其为索引
  • 字符串、列表、元组

操作:

  • 索引:通过下标访问对应元素,seq[0~n-1] / seq[-1~-n]

  • 切片: 访问一定范围内的元素,seq[start : end : step](无start /end表最末,左闭右开原则)
  • 加乘: 通过+/*使序列相加或重复
  • 检查成员: 检查某元素是否为序列的成员,val in seq / val not in seq
  • 遍历成员: 依次读取序列元素,for i in seq / while i<length
函数描述
len()计算序列的长度
max()找出序列中的最大元素
min()找出序列中的最小元素
list()将序列转换为列表
str()将序列转换为字符串
sum()计算元素的和
sorted()对元素进行排序
enumerate()将序列组合为一个索引序列,多用在 for 循环中

3. 列表List[]

列表VS数组:都能存储多个数据,列表可以存储不同类似的数据,而数组只能存储相同数据类型

  1. # 增
  2. my_list.append(obj) # 向列表末尾添加一个新元素(追加单个)
  3. my_list.extend(my_list1) # 将另一个列表中的元素逐一添加到列表中(追加多个)
  4. my_list.insert(index, obj) # 在指定位置前插入元素
  5. my_list.copy() # 复制列表
  6. #删
  7. del my_list[2] # 根据下标进行删除
  8. my_list.pop() # 删除最后一个元素
  9. my_list.remove(obj) # 删除指定的数据
  10. my_list.clear() # 清空列表
  11. #改
  12. my_list[下标] = obj
  13. #查
  14. obj in my_list
  15. my_list.count(obj) # 统计列表中某个元素出现的次数
  16. my_list.index(obj) # 查找某个元素在列表中首次出现的位置

4. 元组Tuple()

元组VS列表:都能存储多个数据,但元组不能修改,数据较安全, 因此成为了python的默认形式

  • 元组只有一个元素时,要写上逗号 3,) 用于区分数值运算中处理运算符优先级的 3
  • 元组中元素不能被修改,可用重新赋值的方式操作
  • 元组中的元素不能被删除,只能删除整个元组

5. 集合Set{}

集合可以存储多个数据,数据不能重复自动去重,所以实际存储顺序与定义的顺序没有关系

  • 列表、元组、集合可互转不是对原数据进行修改,而是得到一个新的数据

6. 字典Dict{}

  • 增删改查等使用数字下标易错乱,改为自定义标识,键值对 {Key:Value}
  • Key相当于集合中的下标值012...所以Key值不能相同,且无序号了所以无序存放
  • 空集合和空字典都是{},为了不容易混乱,使用如下方式:
    • blank_set=set()  # 空集合
    • blank_dict=dict()# 空字典
  1. # 增
  2. my_dict['新键'] = 新数据 #这个“键”在字典中不存在,那么就会新增这个元素。
  3. #删
  4. del my_dict[Key] # 删除指定的键值对
  5. del my_dict # 删除整个字典
  6. my_dict.clear() # 清空整个字典数据,但不删除
  7. #改
  8. my_dict['键'] = 新数据 # 只要通过key找到,即可修改
  9. #查
  10. my_dict[key] #若访问不存在的键,则会报错
  11. my_dict.get(key, default=None) #返回指定键的值,如果键不在字典中返回 default 设置的默认值,也可以将none修改为想要返回的内容
  12. # 默认遍历键,my_dict.value遍历键值,my_dict.sort遍历键值对

分析总结:列表、元组、集合、字典各有特点,不同场合使用不同特色存储

  • 列表:推荐使用,数据类型相同,且可能需要对数据进行操作
  • 元组:使用一般,数据类型相同,且不能修改这些数据
  • 集合:使用较少,数据去重
  • 字典:使用较多,数据类型不同,且这些数据都是相当于一个整体的

三、数据处理

1. 推导式

for ... in ...是一种快速生成数据的方式,可以用一行代码生成有规律的列表

  • 列表推导式: [xxx for 变量 in 可迭代对象 ]
  • 没有元组推导式,而是生成器
  • 集合推导式: {xxx for 变量 in 可迭代对象}
  • 字典推导式 :{xxx:xxx for 变量 in 可迭代对象}

2. 拆包

拆包(解包)是一种快速提取数据的方式

  • 拆列表 a,b=[1,2]
  • 拆元组 a,b=(1,2)
  • 拆集合 a,b={1,2}  每次结果乱序
  • 拆字典 a,b={}取到的是字典的key,取value要用遍历 for k, v in dict1.items():

经典面试题(交换a,b的值)

3. 枚举

枚举的定义可以通过继承 Enum 的方式来实现

  1. from enum import Enum
  2. @unique
  3. class 枚举名(Enum):
  4. 枚举成员表
  5. 枚举名.枚举成员 # 访问枚举成员
  6. 枚举名.枚举成员.name # 访问枚举成员名称
  7. 枚举名.枚举成员.value # 访问枚举成员值
  • 成员名不可重复,成员值可重复
  • 装饰器 @unique 保证成员值不可重复

 第三章 语法结构

一、模块

Python 有很多自带的模块(标准库)和第三方模块,从包中引入模块:

  • import ...
  • from ... import ...

 os 模块:负责与操作系统进行交互

  1. os.getcwd() # 查看当前路径
  2. os.listdir(path) # 返回指定目录下包含的文件和目录名列表
  3. os.path.abspath(path) # 返回路径path的绝对路径
  4. os.path.split(path) # 将路径path拆分为目录和文件两部分,返回结果为元组类型
  5. os.path.join(path, *paths)# 将一个或多个 path(文件或目录) 进行拼接
  6. os.path.getctime(path)# 返回 path(文件或目录) 在系统中的创建时间。
  7. os.path.getmtime(path)# 返回 path(文件或目录)的最后修改时间。
  8. os.path.getatime(path)# 返回 path(文件或目录)的最后访问时间。
  9. os.path.exists(path) # 判断 path(文件或目录)是否存在,存在返回 True,否则返回 False。
  10. os.path.isdir(path) # 判断 path 是否为目录。
  11. os.path.isfile(path) # 判断 path 是否为文件。
  12. os.path.getsize(path) # 返回 path 的大小,以字节为单位,若 path 是目录则返回 0
  13. os.mkdir() # 创建一个目录
  14. os.makedirs() #创建多级目录。
  15. os.chdir(path) # 将当前工作目录更改为 path。
  16. os.system(command) #调用 shell 脚本

sys 模块:负责与 Python 解释器进行交互

  1. sys.argv # 返回传递给Python脚本的命令行参数列表
  2. sys.exit() # 退出当前程序
  3. sys.version # 返回 Python 解释器的版本信息
  4. sys.winver # 返回 Python 解释器主版号
  5. sys.platform # 返回操作系统平台名称
  6. sys.path # 返回模块的搜索路径列表
  7. sys.maxsiz # 返回支持的最大整数值
  8. sys.maxunico # 返回支持的最大 Unicode 值
  9. sys.copyright # 返回 Python 版权信息
  10. sys.modules # 以字典类型返回系统导入的模块
  11. sys.byteorder # 返回本地字节规则的指示器
  12. sys.executable # 返回 Python 解释器所在路径
  13. sys.stdout.write(obj) # 标准输出
  14. sys.stdin.readline() # 标准输入
  15. sys.stderr.write() # 错误输出
  16. sys.getdefaultencoding() # 返回当前默认字符串编码的名称
  17. sys.getrefcount(obj) # 返回对象的引用计数
  18. sys.getrecursionlimit() # 返回支持的递归深度
  19. sys.getsizeof(object[, default]) # 以字节为单位返回对象的大小
  20. sys.setswitchinterval(interval) # 设置线程切换的时间间隔
  21. sys.getswitchinterval() # 返回线程切换时间间隔

二、函数

1. 自定义函数

  1. def 函数名(参数):
  2. 函数体
  3. return 返回值

(1)函数参数

  • 必需参数:实参与形参顺序对应、个数相同
  • 缺省参数:形参名=XXX 传则替换,不传则用默认(若为列表则每次调用都为同一个列表)
  • 命名参数:形参名=实参 (整体不带缺省/命名的在左,整体带的在右,不可杂)
  • 不定长参数:参数个数不确定
    • * args会以元组的形式导入(*表特殊,变量仍是args)
    • ** kwargs会以字典的形式导入 以形参名=实参(args中数据通过遍历元组/字典读取)
    • *args在前**kwargs在后,即多余的给args,带形参名=XXX格式的给**kwargs

(2)返回值

  • 一个函数中只能有1个return被执行,
  • 结束函数的执行,后面函数体语句不执行
  • 默认none,可通过return返回列表、元组、集合、字典等从而实现一次性返回多个数据

(3)函数拆包

  • 函数的返回值拆包
  • */**对列表集合/字典拆包去命名参数

2. 匿名函数

一个没有名字的函数 把def name换成了lambda

  1. lambda 形参1, 形参2, 形参3... : 表达式
  2. #lambda函数能接收任何数量的参数但只能返回一个表达式的值,其默认就是返回的,不用写return
  • 变量名=lambda 参数 : 表达式,通过变量名()调用
  • lambda 参数 : 表达式整体当实参

 3. 迭代器

  • 可迭代对象:具有 __iter__() 方法,它们均可使用 for 循环遍历
  • 迭代器iterator具有 __iter__() 和 __next__() 两个方法,是一个可记住遍历位置的对象
  • 迭代器一定是可迭代的,反之不成立如list dict str,不过可通过 iter() 获得其迭代器对象

iter(可迭代对象)获取可迭代对象迭代器对迭代器使用next(迭代器)获取下一条数据,当没有下一项数据时抛出 StopIteration 异常迭代结束

for 循环语句的实现便是利用了迭代器

自定义迭代器

  • 迭代对象返+迭代器 ,集成在一个类中
  • 迭代对象+迭代器 两个类分开, 调用关系

4. 生成器

generator:元素可按某种算法推算,则不必创建完整的列表,边循环边计算,只存算法占用内存小

生成器是用来创建迭代器的工具,创建生成器:

  • 生成器表达式:nums=(.. for ...in...)推导式的[]换成()
  •  函数+yield语句
    • 保存当前运行状态(断点),然后暂停执行,即将生成器(函数)挂起,将yield关键字后面表达式的值作为返回值返回,此时可以理解为起到了return的作用
    • 可以使用next()函数让生成器从断点处继续执行,即唤醒生成器(函数)
    • 还可以使用send()函数来唤醒执行,好处是:可以在唤醒的同时向断点处传入一个附加数据

5. 闭包

closure:调用一个带有返回值的函数 x,此时函数 x 返回一个函数 y,这个函数 y 就被称作闭包

  • 内部函数用到了外部函数的局部变量或者形参,其被永久存储
  • 闭包与类有一些相似,比如:它们都能实现数据的封装、方法的复用等;此外,通过使用闭包可以避免使用全局变量,还能将函数与其所操作的数据关连起来。

函数、匿名函数、闭包、对象当做实参时,有什么区别?

  • 匿名函数能完成基本的简单功能,传递是这个函数的引用 只有功能
  • 普通函数能完成较为复杂的功能,传递是这个函数的引用 只有功能
  • 闭包能完成较为复杂的功能,传递是这个闭包中的函数及数据(形参)
  • 对象能完成最为复杂的功能,传递是很多功能+很多数据(形参)

6. 装饰器

decorator:是一种闭包的应用,在不修改原函数代码的基础上,对函数执行之前和执行之后添加额外功能,它就是语法糖

  1. 定义装饰函数/类
  2. @装饰函数名/类名
  3. 定义业务函数
  • 装饰器可以基于函数实现也可基于类实现
  • 装饰函数也是可以接受参数的
  • 支持多个装饰器同时使用

三、语法

1. 条件语句

  •  if 语句
  •  if...else 语句
  •  if...elif...elif...else 语句
  •  无 switch 语句

2. 循环语句

  • for 循环,函数体内无法调用次数变量
  • while 循环
  • 无 do...while语句

3. 转向语句

  • break
  • continue
  • else

4. 异常处理

  1. BaseException
  2. +-- SystemExit
  3. +-- KeyboardInterrupt
  4. +-- GeneratorExit
  5. +-- Exception
  6. +-- StopIteration
  7. +-- StopAsyncIteration
  8. +-- ArithmeticError
  9. | +-- FloatingPointError
  10. | +-- OverflowError
  11. | +-- ZeroDivisionError
  12. +-- AssertionError
  13. +-- AttributeError
  14. +-- BufferError
  15. +-- EOFError
  16. +-- ImportError
  17. | +-- ModuleNotFoundError
  18. +-- LookupError
  19. | +-- IndexError
  20. | +-- KeyError
  21. +-- MemoryError
  22. +-- NameError
  23. | +-- UnboundLocalError
  24. +-- OSError
  25. | +-- BlockingIOError
  26. | +-- ChildProcessError
  27. | +-- ConnectionError
  28. | | +-- BrokenPipeError
  29. | | +-- ConnectionAbortedError
  30. | | +-- ConnectionRefusedError
  31. | | +-- ConnectionResetError
  32. | +-- FileExistsError
  33. | +-- FileNotFoundError
  34. | +-- InterruptedError
  35. | +-- IsADirectoryError
  36. | +-- NotADirectoryError
  37. | +-- PermissionError
  38. | +-- ProcessLookupError
  39. | +-- TimeoutError
  40. +-- ReferenceError
  41. +-- RuntimeError
  42. | +-- NotImplementedError
  43. | +-- RecursionError
  44. +-- SyntaxError
  45. | +-- IndentationError
  46. | +-- TabError
  47. +-- SystemError
  48. +-- TypeError
  49. +-- ValueError
  50. | +-- UnicodeError
  51. | +-- UnicodeDecodeError
  52. | +-- UnicodeEncodeError
  53. | +-- UnicodeTranslateError
  54. +-- Warning
  55. +-- DeprecationWarning
  56. +-- PendingDeprecationWarning
  57. +-- RuntimeWarning
  58. +-- SyntaxWarning
  59. +-- UserWarning
  60. +-- FutureWarning
  61. +-- ImportWarning
  62. +-- UnicodeWarning
  63. +-- BytesWarning
  64. +-- ResourceWarning
异常名称描述
BaseException所有异常的基类
SystemExit解释器请求退出
KeyboardInterrupt用户中断执行(通常是输入^C)
Exception常规错误的基类
StopIteration迭代器没有更多的值
GeneratorExit生成器(generator)发生异常来通知退出
StandardError所有的内建标准异常的基类
ArithmeticError所有数值计算错误的基类
FloatingPointError浮点计算错误
OverflowError数值运算超出最大限制
ZeroDivisionError除(或取模)零 (所有数据类型)
AssertionError断言语句失败
AttributeError对象没有这个属性
EOFError没有内建输入,到达EOF 标记
EnvironmentError操作系统错误的基类
IOError输入/输出操作失败
OSError操作系统错误
WindowsError系统调用失败
ImportError导入模块/对象失败
LookupError无效数据查询的基类
IndexError序列中没有此索引(index)
KeyError映射中没有这个键
MemoryError内存溢出错误(对于Python 解释器不是致命的)
NameError未声明/初始化对象 (没有属性)
UnboundLocalError访问未初始化的本地变量
ReferenceError弱引用(Weak reference)试图访问已经垃圾回收了的对象
RuntimeError一般的运行时错误
NotImplementedError尚未实现的方法
SyntaxErrorPython 语法错误
IndentationError缩进错误
TabErrorTab 和空格混用
SystemError一般的解释器系统错误
TypeError对类型无效的操作
ValueError传入无效的参数
UnicodeErrorUnicode 相关的错误
UnicodeDecodeErrorUnicode 解码时的错误
UnicodeEncodeErrorUnicode 编码时错误
UnicodeTranslateErrorUnicode 转换时错误
Warning警告的基类
DeprecationWarning关于被弃用的特征的警告
FutureWarning关于构造将来语义会有改变的警告
OverflowWarning旧的关于自动提升为长整型(long)的警告
PendingDeprecationWarning关于特性将会被废弃的警告
RuntimeWarning可疑的运行时行为(runtime behavior)的警告
SyntaxWarning可疑的语法的警告
UserWarning用户代码生成的警告

四、输入输出

1.标准输入输出

input()

  • 会把用户输入的任何值都作为字符串来对待 ,str = input("请输入:")
  • 如果一个程序需要获取多个数据,那么就要用多个input,即一个变量存储一个输入数据

print()

  • 格式字符串:%

  • 新格式字符串:字符串.format() = print(f'.....')

  1. # 1.通过位置
  2. print('{o},{1}'.format('laowang',20)) # laowang,20
  3. print('{0]-{1}'.format('laowang',20)) # laowang-20
  4. print('{},{}'.format('laowang',20)) # 1aowang,20
  5. print('{1},{0},{1}'.format('laowang',20)) # 20,1aowang,20
  6. print('{name},{age}'.format(age=18,name='laowang')) # laowang,18
  7. # 2.通过关键字参数
  8. class Person:
  9. def _init_(self,name,age):
  10. self.name = name
  11. self.age = age
  12. def _str_(self):
  13. return 'name is {a.name},age is {a.age} old'.format(a=self)
  14. print(Person('laowang',18)) # name is laowang,age is 18 old
  15. # 3.通过映射list
  16. a_list=['laowang',20,'China']
  17. print('my name is {0[0]},from {0[2]},age is {0[1]}'.format(a_list)) # my name is laowang,from China,age is 20
  18. # 4.通过映射dict
  19. b_dict ={'name':'laowang','age':20,'province':'shandong'}
  20. print('my name is {name},age is {age},from {province}'.format(**b_dict))
  21. print('my name is {info[name]},age is {info[age]},from {info[province]}'.format(info=b_dict))
  22. # print('my name is {info["name"]},age is {info["age"]},from {info["province"]}'.format(info=b_dict)) # 错误的
  23. #5.填充与对齐
  24. print('****{:>8}****'.format('189')) # **** 189****
  25. print('****{:<8}****'.format('189')) # ****189 ****
  26. print('****{:0>8}****'.format('189')) # ****00000189****
  27. print('****{:a>8}****'.format('l89')) # ****aaaaa189****
  28. #精度与类型f
  29. print('{:.2f}'.format(321.33345)) # 保留两位小数 321.33
  30. #用来做金额的干位分隔符
  31. print('{:,}'.format(1234567890)) # 1,234,567,890
  32. #其他类型主要就是进制了,b、d、0、X分别是二进制、十进制以、八进制、十六进制。
  33. print('{:b}'.format(18)) # 二进制10010
  34. print('{:d}'.format(18)) #十进制18
  35. print('{:o}'.format(18)) #八进制22
  36. print('{:x}'.format(18) #十六进制12

2. 正则表达式

正则表达式 | 白月黑羽 (byhy.net)

regex101: build, test, and debug regex

正则表达式是一个强大的字符串处理工具,进行单个字符检查。

  1. content = '''
  2. Python3 高级开发工程师 上海互教教育科技有限公司上海-浦东新区2万/月02-18满员
  3. 测试开发工程师(C++/python) 上海墨鹍数码科技有限公司上海-浦东新区2.5万/每月02-18未满员
  4. Python3 开发工程师 上海德拓信息技术股份有限公司上海-徐汇区1.3万/每月02-18剩余11人
  5. 测试开发工程师(Python) 赫里普(上海)信息科技有限公司上海-浦东新区1.1万/每月02-18剩余5人
  6. Python高级开发工程师 上海行动教育科技股份有限公司上海-闵行区2.8万/月02-18剩余255人
  7. python开发工程师 上海优似腾软件开发有限公司上海-浦东新区2.5万/每月02-18满员
  8. '''
  9. import re
  10. p = re.compile(r'([\d.]+)万/每{0,1}月')
  11. for one in p.findall(content):
  12. print(one) #2 2.5 1.3 1.1 2.8 2.5

(1)运算符

  • 原义字符:字符本身的含义,可以直接匹配。r,表示原始字符串
  • 转义字符:不表示字符而表示其他含义

  • 特殊字符:匹配某种类型的字符
单个字符个数位置点
. 任意字符,除了换行符* 任意次^ 开头
\w 数字字母下划线或汉字,\W word+ 至少一次$ 结尾
\d 数字,相当于[0-9],\D非数字[^0-9]?最多一次\b 边界 \B非边界
\s 空白符(空格、tab等),\S 空白符{n} 出现n次,{n,}至少n次,{n,m} 出现n-m次
  •  在正则表达式中,*、?都是贪婪的,使用他们时,会尽可能多的匹配内容。
  • 使用非贪婪模式,可以在*后面加上?
整体代表单个字符范围
[][]内,多选一
[^][]外(非),多选一
-左到右,多选一
|左或右,二选一

(2)方法 

  1. # re模块的主要方法
  2. re.compile(pattern, flags=0) #编译正则表达式,生成一个正则表达式对象。flags匹配模式
  3. re.search(pattern, string, flags=0)#扫描整个字符串找到匹配样式的第一个位置,并返回一个相应的匹配对象;如果没有匹配,就返回一个 None。
  4. re.match(pattern, string, flags=0)#如果字符串开始的0或者多个字符匹配到了正则表达式样式,就返回一个相应的匹配对象;如果没有匹配,就返回None。
  5. re.fullmatch(pattern, string, flags=0)#如果整个字符串匹配到正则表达式样式,就返回一个相应的匹配对象;否则就返回一个 None。
  6. re.split(pattern, string, maxsplit=0, flags=0)#用 pattern 分开 string,如果在 pattern 中捕获到括号,那么所有的组里的文字也会包含在列表里,如果 maxsplit 非零,最多进行 maxsplit 次分隔,剩下的字符全部返回到列表的最后一个元素。
  7. re.findall(pattern, string, flags=0) #对string返回一个不重复的pattern的匹配列表,string 从左到右进行扫描,匹配按找到的顺序返回,如果样式里存在一到多个组,就返回一个组合列表,空匹配也会包含在结果里。
  8. re.finditer(pattern, string, flags=0)#pattern 在 string 里所有的非重复匹配,返回为一个迭代器 iterator 保存了匹配对象,string 从左到右扫描,匹配按顺序排列。
  9. re.sub(pattern, repl, string, count=0, flags=0)#返回通过使用 repl 替换在 string 最左边非重叠出现的 pattern 而获得的字符串,count 表示匹配后替换的最大次数,默认 0 表示替换所有的匹配。
  10. re.subn(pattern, repl, string, count=0, flags=0)#行为与 re.sub() 相同,但返回的是一个元组。
  11. re.escape(pattern)#转义 pattern 中的特殊字符。
  12. re.purge()#清除正则表达式缓存。
匹配模式说明
re.A让 \w, \W, \b, \B, \d, \D, \s, \S 只匹配 ASCII
re.I忽略大小写
re.M多行模式
re.L由当前语言区域决定 \w, \W, \b, \B 和大小写敏感匹配
re.S. 匹配包括换行符在内的任意字符
re.U在 Python3 中是冗余的,因为 Python3 中字符串已经默认为 Unicode
re.X忽略空格和 # 后面的注释
  1. # 正则表达式对象的主要方法
  2. Pattern.search(string[, pos[, endpos]])#扫描整个 string 寻找第一个匹配的位置,并返回一个相应的匹配对象,如果没有匹配,就返回 None;可选参数 pos 给出了字符串中开始搜索的位置索引,默认为 0;可选参数 endpos 限定了字符串搜索的结束。
  3. Pattern.match(string[, pos[, endpos]])#如果 string 的开始位置能够找到这个正则样式的任意个匹配,就返回一个相应的匹配对象,如果不匹配,就返回 None。
  4. Pattern.fullmatch(string[, pos[, endpos]])#如果整个 string 匹配这个正则表达式,就返回一个相应的匹配对象,否则就返回 None。
  5. Pattern.split(string, maxsplit=0)#等价于 re.split() 函数,使用了编译后的样式
  6. Pattern.findall(string[, pos[, endpos]])#使用了编译后样式,可以接收可选参数 pos 和 endpos,限制搜索范围。
  7. Pattern.finditer(string[, pos[, endpos]])#使用了编译后样式,可以接收可选参数 pos 和 endpos ,限制搜索范围
  8. Pattern.sub(repl, string, count=0)#使用了编译后的样式
  9. Pattern.subn(repl, string, count=0)#使用了编译后的样式
  1. # 匹配对象的主要方法
  2. Match.expand(template)#对 template 进行反斜杠转义替换并且返回
  3. Match.group([group1, ...])#返回一个或者多个匹配的子组
  4. Match.groups(default=None)#返回一个元组,包含所有匹配的子组,在样式中出现的从 1 到任意多的组合,default 参数用于不参与匹配的情况,默认为 None
  5. Match.groupdict(default=None)#返回一个字典,包含了所有的命名子组,default 参数用于不参与匹配的组合,默认为 None。
  6. Match.start([group]) 和 Match.end([group])#返回 group 匹配到的字串的开始和结束标号
  7. Match.span([group])#对于一个匹配 m,返回一个二元组 (m.start(group), m.end(group))

3. 文件操作

  1. f=open(file, mode='r') # 打开文件,返回文件对象
  2. f.write(str) # 将字符串写入文件,返回写入字符长度
  3. f.writelines(s) # 向文件写入一个字符串列表
  4. f.read([size]) # 读取指定的字节数,参数可选,无参或参数为负时读取所有
  5. f.readline() # 读取一行
  6. f.readlines() # 读取所有行并返回列表
  7. f.close() # 关闭文件。关闭后文件不能再进行读写操作。
  8. with open() as f # 进阶中采用 with 进行文件关闭,
  9. f.tell() # 返回文件对象在文件中的当前位置
  10. f.seek(offset[, whence])# 将文件对象移动到指定的位置;offset 表示移动的偏移量;whence 为可选参数,值为 0 表示从文件开头起算(默认值)、值为 1 表示使用当前文件位置、值为 2 表示使用文件末尾作为参考点
模式描述
r读取(默认)
w写入,并先截断文件
x排它性创建,如果文件已存在则失败
a写入,如果文件存在则在末尾追加
b二进制模式
t文本模式(默认)
+更新磁盘文件(读取并写入)

3. with与上下文管理器

系统资源执行完业务后必须关闭,一般使用XXX.close(),但这样方式在产生异常时不会被调用。

上下文管理器申请及释放资源,而with会自动调用申请资源,以及释放资源的代码,所以更便捷。

  • __enter__() __exit__() 方法的对象,上下文管理器对象可以使用 with 关键字
  • contextmanager 的装饰器更加简化,通过 yield 将函数分割成两部分

第四章 类和对象

  • 面向对象VS面向过程

面向过程:数据和功能分离,下标错位/全局变量等易乱套

面向对象:数据和功能形成整体

面向对象编程有3个特征:封装 继承 多态

一、类

  • 经典类(旧式类):class 类名
  • 新式类定义形式: class 类名(object)   (object 是Python 里所有类的最顶级父类)

1. 属性成员

2. 方法成员

3. 静态类型

  1. class 类名:
  2. @staticmethod
  3. def A(): # 形参不含self
  4. pass
  5. 实例对象.静态方法()# 调用
  6. 类名.静态方法() # 调用

4. 类属性、类方法、类对象

当通过同一个类创建了多个实例对象之后,每个实例对象之间是相互隔离的。

  • 类属性:多个对象之间共享数据
  1. class 类名:
  2. 类属性 = ....
  3. def __init__(self, name):
  4. .....
  5. 类名.类属性名 #调用
  • 类方法:对类属性进行操作
  1. class 类名:
  2. @classmethod
  3. def 类方法名(cls): # cls指向类对象
  4. pass
  5. 类名.类方法名 #调用
  6. 对象名.类方法名 #调用
  •  类对象:定义的类其实就是一个对象,为将其与自身实例化后的对象区分,将其叫做类对象

实例化对象是由类对象创建的,类对象对于实例化对象而言是共享的,实例对象只存储各自独有的

  • 类属性
  • 所有的方法(魔法方法、实例方法、静态方法 、类方法)

5.dir(类名) 魔法属性

  1. ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']

二、对象

1. 对象定义

  • 对象名 = 类名(参数) 

2. 成员访问

  • 对象名.属性
  • 对象名.方法(实参) 

3. self 自动指向实例对象

  •  self仅仅是一个变量名,也可将self换为其他任意的名字
  • self会在类定义方法时自动填写

5. 对象关联

  • 对象名.属性名=另外一个对象名
  • 另外一个对象的引用当作实参

三、继承

Class类名(Class1,Class2...)

重写:对象调用时先子类后父类查找,所以子类中的方法可覆盖父类中的同名方法,从而改写

super().父类方法名():在父类的基础上进一步新增而已

四、多态

Python中的多态体现的非常不明显,因为Python不需要写类型


第五章 结构与算法

10 个数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树

10 个算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法


第六章 C/C++ 

Python与C/C++相互调用_flowerspring的博客-CSDN博客

Python调用C++程序的几种方法_python c++_宗而研之的博客-CSDN博客 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/354154
推荐阅读
相关标签
  

闽ICP备14008679号