Python常忘的进阶知识(上)

0.目录

1.面向对象

2.正则表达式

3.JSON

4.枚举

5.闭包

6.函数式编程

1.面向对象

1.1 函数与方法

类的方法必须含参数self:

函数与方法的区别:

  • C、C++ 一般称函数
  • Java、C# 一般称方法
  • 方法:设计层面
  • 函数:程序运行、过程式的一种称谓

构造函数的定义:

可以显式地调用构造函数:

显式地调用构造函数返回了什么?

ps:在构造函数中不能指定return的内容,只能返回None

1.2 类变量与实例变量

类变量与实例变量的区别:

类与对象的变量查找顺序:
__dict__ 变量保存着当前对象所有的相关的变量:

当对象中不存在name的实例变量时,会去寻找类变量,还没有的话会去父类中继续寻找:

类的相关变量:

1.3 实例方法、类方法、静态方法

self与实例方法:

  • self 改成 this 也可以正常使用
  • self 就是当前调用方法的对象
  • self 代表着实例而不是类

在实例方法中访问实例变量与类变量有两种方法:

  1. 类.变量名
  2. self.__class__.变量名

定义和调用类方法的方法:

定义和调用静态方法的方法:

ps:不需要参数self或者cls
pps:能用静态方法的地方大都能用类方法代替,不建议使用静态方法

1.4 公开和私有:没有什么是不能访问的

定义私有的方法:
在数据成员名称或者方法名称之前加上 __ 即可

__name已经被置为私有了,此时访问student1.__name由于Pyhton的动态性,实际上是动态创建了student1.__name,与对象的内置成员变量__name是不同的。
直接访问student2.__name,果然报错:

实际上__name存储的是_Student__name:

所以说没有什么是不能访问的:

1.5 继承

继承的方法:

子类调用父类的构造函数需要传递self(不推荐的方法):

子类方法调用父类方法:super关键字(推荐的方法)

2.正则表达式

2.1 Python内置函数与正则表达式

初识正则表达式:
1.正则表达式是一个特殊的字符序列,用来检测一个字符串是否与我们所设定的这样的字符序列相匹配
2.快速检索文本,实现一些替换文本的操作,比如:

  • 检查一串数字是否是电话号码
  • 检测一个字符串是否符合email
  • 把一个文本里指定的单词替换为另外一个单词

判断字符串是否包含'Python'(使用Python内置函数):

判断字符串是否包含'Python'(使用正则表达式):

正则表达式的灵魂在于规则

2.2 元字符、字符集、概括字符集

元字符:
找出字符串中的所有数字:

字符集:
1.找出中间字符是c或f的单词

2.找出中间字符不是c也不是f的单词

3.找出中间字符是c或d或e或f的单词

概括字符集:
数字——\d —— 等价于[0-9]
非数字——\D —— 等价于[^0-9]
字母、数字、下划线——\w——等价于[A-Za-z0-9_]
非字母、数字、下划线——\W——等价于[^A-Za-z0-9_]
任何空白字符,包括空格、制表符、换页符等等——\s——等价于[ \f\n\r\t\v]
任何非空白字符——\S——等价于[^ \f\n\r\t\v]
除换行符(\n、\r)之外的任何单个字符——.

2.3 贪婪与非贪婪

找出3个字母组成的单词:

找出3至6个字母组成的单词(默认是贪婪模式):

使用 ? 改为非贪婪模式:

2.4 匹配0次1次或者无限多次

匹配前面的子表达式0次或多次—— *

匹配前面的子表达式1次或多次—— +

匹配前面的子表达式0次或1次—— ?

2.5 边界匹配符

判断QQ号是不是4到8位的QQ号:

加入边界控制符:

^ —— 表示从字符串的开始位置匹配
$ —— 表示从字符串的结束位置匹配

边界控制符的作用:

2.6 匹配模式参数

re.I——忽略大小写匹配:

ps:多个模式之间可以用 | 隔开,表示且关系

re.S——点号. 可以匹配包括换行符(\n、\r)在内的任何单个字符:

2.7 re.sub正则替换

用于查找成功后替换:

sub第4个参数count默认为0,表示无限匹配。count表示所能替换的最大次数:

Python内置函数实现替换(replace()函数相当于正则表达式的简化版,也有count):

sub强大之处在于第2个参数可以是函数:
1.可以看到C#消失了:

2.value的值:一个对象

3.用group()函数取出匹配值:

把函数作为参数传递:

2.8 search与match函数

match从字符串的首字母开始匹配,如果没有找到相应的匹配结果,将返回None:

search搜索整个字符串,直到找到第一个满足正则表达式的结果,然后将匹配的结果返回:

search与match都只会匹配一次,找到后立马停止搜索
使用group返回值,使用span返回位置:

2.9 group分组

group(0)永远记录的是正则表达式完整的匹配结果,如果要访问完整的匹配结果内部的某个分组的话,必须从1开始访问:

使用findall()函数简单得多:

可以有多个分组:


3.JSON

3.1 理解JSON

JSON:JavaScript Object Notation(JavaScript对象标记)
JSON是一种轻量级的数据交换格式JSON是一种数据格式
字符串是JSON的表现形式
符合JSON格式的字符串叫做JSON字符串
JSON优势:

  • 易于阅读
  • 易于解析
  • 网络传输效率高
  • 跨语言交换数据

3.2 反序列化

json中key和value必须用双引号括起来,数字不需要:

JSON Object → Python dict或JSON array → Python list:

ps:JSON中布尔值是小写的,Python中布尔值首字母大写

反序列化—— 字符串 → 某种语言中的某种数据结构

3.3 序列化

序列化—— 某种语言中的某种数据结构 → JSON字符串

Python list → JSON字符串:

4.枚举

4.1 枚举其实是一个类

定义VIP,输出黄钻:

枚举和普通类相比有什么优势:
普通类——可变,没有防止相同标签的功能
枚举——不能更改,有防止相同标签的功能

4.2 枚举类型、枚举名称与枚举值

取值:

取标签名称:

VIP.GREEN和VIP.GREEN.name的区别:

通过枚举名称获取枚举类型:

遍历枚举:

4.3 枚举的比较运算

能做的比较:

4.4 枚举的遍历与转换

枚举注意事项:
可以有相同值,但是此时GREEN算作YELLOW的别名:

此时遍历枚举:

如何遍历包括别名的枚举:

不用items():

枚举转换:
如何通过枚举值转化为枚举类型?(并不是真正的类型转换)

4.5 限制枚举

限制值为整数——IntEnum:

限制相同值——unique:

枚举在Python中实现的是单例模式,即对枚举类型不能实例化。

5.闭包

5.1 一切皆对象

在其他语言中:

  • 函数只是一段可执行的代码,常驻于内存中,并不是对象
  • 函数不能实例化

Python中一切皆对象:

  • 把函数当作另外一个函数的参数,传递到另外的函数里
  • 把一个函数当作另外一个函数的返回结果
  • 函数是对象

5.2 什么是闭包

不可以直接调用curve():

间接调用curve():

a*x*x

模块中调用curve()时,内部a的值不取模块中的变量a,而仍然是定义时的环境变量:(也就是说return curve时实际上不是返回一个函数,而是返回一个闭包)

闭包 = 函数 + 环境变量(函数定义时)

  • 环境变量在定义函数的外部
  • 环境变量不能是全局变量

闭包的环境变量实质是保存在内置变量 __closure__ 中:

取出闭包的环境变量:__closure__[0].cell_contents

5.3 闭包的经典误区

这不是闭包:

这才是闭包:

环境变量应该被引用,且不能被当成一个变量进行赋值,否则就不是闭包!

5.4 非闭包解决与闭包解决

问题:编写函数,传入参数x代表旅行者走了x步,计算旅行者迄今为止已经走过的路程result,初始值result为0。

  • 即传入x=0得result=0
  • 传入x=1得result=1
  • 传入x=2得result=3
  • 传入x=5得result=8

非闭包解决:global声明是全局变量

闭包解决:nonlocal声明不是局部变量(origin这个全局变量并没有被改变)

通过闭包在模块中调用了局部变量(环境变量)
闭包的问题:环境变量常驻于内存中,容易造成内存泄漏

6.函数式编程

6.1 匿名函数与lambda表达式

匿名函数——定义函数时不需要定义函数名
lambda定义函数:

三元表达式(如果x大于y,返回x,否则返回y):
其他语言中——x > y ? x : y
Python中——x if x > y else y

6.2 map与lambda

map是一个类,不是函数
求列表中每个数的平方(循环实现):

求列表中每个数的平方(map实现):

map将传入序列的每一项都会执行传入函数的操作。
map相当于数学上的映射。

map与lambda:
1.map的真正打开方式

2.map可以传递多个参数

3.参数不相等时的结果

6.3 reduce

from functools import reduce
reduce是一个函数,不是类
reduce()里面的第一个函数参数一定要有两个参数:

reduce做的是连续的计算,每一次lambda表达式的计算结果将作为下一次的lambda表达式的参数进行运算!

reduce的第三个参数将作为初始值进行运算!

6.4 filter

filter(过滤):帮助我们过滤掉一些不需要的元素,或者是一些不符合规定的元素
过滤掉为0的元素:

filter要求lambda表达式必须返回可以代表真假的:

filter根据lambda表达式返回的结果判断这个元素是否要保留在序列里,如果返回的是False,那么filter将过滤这个元素!

posted @ 2018-11-28 15:30  PyLearn  阅读(868)  评论(0编辑  收藏  举报