Python常忘的进阶知识(上)
0.目录
1.面向对象
- 1.1 函数与方法
- 1.2 类变量与实例变量
- 1.3 实例方法、类方法、静态方法
- 1.4 公开和私有:没有什么是不能访问的
1.5 继承
2.正则表达式
- 2.1 Python内置函数与正则表达式
- 2.2 元字符、字符集、概括字符集
- 2.3 贪婪与非贪婪
- 2.4 匹配0次1次或者无限多次
- 2.5 边界匹配符
- 2.6 匹配模式参数
- 2.7 re.sub正则替换
- 2.8 search与match函数
2.9 group分组
3.JSON
- 3.1 理解JSON
- 3.2 反序列化
3.3 序列化
4.枚举
- 4.1 枚举其实是一个类
- 4.2 枚举类型、枚举名称与枚举值
- 4.3 枚举的比较运算
- 4.4 枚举的遍历与转换
4.5 限制枚举
5.闭包
- 5.1 一切皆对象
- 5.2 什么是闭包
- 5.3 闭包的经典误区
5.4 非闭包解决与闭包解决
6.函数式编程
- 6.1 匿名函数与lambda表达式
- 6.2 map与lambda
- 6.3 reduce
6.4 filter
1.面向对象
1.1 函数与方法
类的方法必须含参数self:
函数与方法的区别:
- C、C++ 一般称函数
- Java、C# 一般称方法
- 方法:设计层面
- 函数:程序运行、过程式的一种称谓
构造函数的定义:
可以显式地调用构造函数:
显式地调用构造函数返回了什么?
ps:在构造函数中不能指定return的内容,只能返回None
1.2 类变量与实例变量
类变量与实例变量的区别:
类与对象的变量查找顺序:
__dict__ 变量保存着当前对象所有的相关的变量:
当对象中不存在name的实例变量时,会去寻找类变量,还没有的话会去父类中继续寻找:
类的相关变量:
1.3 实例方法、类方法、静态方法
self与实例方法:
- self 改成 this 也可以正常使用
- self 就是当前调用方法的对象
- self 代表着实例而不是类
在实例方法中访问实例变量与类变量有两种方法:
- 类.变量名
- 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将过滤这个元素!
Python常忘的进阶知识(上)的更多相关文章
- Python常忘的进阶知识(下)
0.目录 1.装饰器 1.1 为每个函数都增加一个功能 1.2 装饰器只是一种模式 1.3 语法糖 1.4 函数需要传递参数,该如何更改装饰器? 1.5 函数需要传递关键字参数,该如何更改装饰器? 2 ...
- Python常忘的基础知识
0.目录 1.进制 1.1 各进制的表示 1.2 各进制的转换 2.字符 2.1 转义字符 2.2 原始字符串 3.类型 3.1 基本数据类型 3.2 type() 4.变量与运算符 4.1 值类型与 ...
- python 常忘代码查询 和autohotkey补括号脚本和一些笔记和面试常见问题
笔试一些注意点: --,23点43 今天做的京东笔试题目: 编程题目一定要先写变量取None的情况.今天就是因为没有写这个边界条件所以程序一直不对.以后要注意!!!!!!!!!!!!!!!!!!!!! ...
- python教程(三)·函数进阶(上)
在介绍了函数定义的方法后,再来介绍一些进阶知识 参数收集 有时候我们需要参数的数量是任意的,比如print函数的参数的数量是任意的,print函数的内部实现我们不探究,但是单单是参数数量可变这一方面实 ...
- 周末班:Python基础之面向对象进阶
面向对象进阶 类型判断 issubclass 首先,我们先看issubclass() 这个内置函数可以帮我们判断x类是否是y类型的子类. class Base: pass class Foo(Base ...
- 《Python自动化测试修炼宝典》线上课程已经成功入驻网易云课堂......
<Python自动化测试修炼宝典>线上课程已经成功入驻网易云课堂...... IT测试老兵利用工作之余,亲自录制的<Python自动化测试修炼宝典>线上课程已经成功入驻网易云课 ...
- Httpd服务进阶知识-LAMP架构概述
Httpd服务进阶知识-LAMP架构概述 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.LAMP架构概述 1>.什么是LAM(M)P架构 L: linux A: apa ...
- Httpd服务进阶知识-HTTP协议详解
Httpd服务进阶知识-HTTP协议详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.WEB开发概述 1>.C/S编程 CS即客户端.服务器编程. 客户端.服务端之间需 ...
- Python:什么是进阶,如何进阶?
目录 Python:什么是进阶,如何进阶? 1. 什么是进阶? 2. 如何进阶? 3. 除此之外呢? Python:什么是进阶,如何进阶? 1. 什么是进阶? 一门编程语言的基础部分,往往非常简单.如 ...
随机推荐
- Yii 2.0 使用验证码
Yii2.0 提供了验证码组件.调用起来比较方便.以登录页面添加验证码为例. 1. 模型中添加字段和验证规则. common\models\LoginForm 添加如下代码 public $captc ...
- PL/SQL编辑数据"这些查询结果不可更新,请包括ROWID或使用SELECT...FOR UPDATE获得可更新结果"处理
只要有人用了: select t.* from 表名 t where 字段=xxx for update 而不是: select t.rowid,t.* from 表名 t where 字段=x ...
- Python接口测试实战5(下) - RESTful、Web Service及Mock Server
如有任何学习问题,可以添加作者微信:lockingfree 课程目录 Python接口测试实战1(上)- 接口测试理论 Python接口测试实战1(下)- 接口测试工具的使用 Python接口测试实战 ...
- Java EE JSP内置对象及表达式语言
一.JSP内置对象 JSP根据Servlet API规范提供了一些内置对象,开发者不用事先声明就可使用标准变量来访问这些对象. JSP提供了9种内置对象: (一).request 简述: JSP编程中 ...
- 『ACM C++』PTA浙大 | 基础题 - Have Fun with Numbers
连着这两道都是开学前数构老师的“爱心作业”,还没上课开学就给我们布置作业了,这道题有点小坑,也经常遇到类似的问题,特地拿出来记录一下. -------------------------------- ...
- Python3实现机器学习经典算法(三)ID3决策树
一.ID3决策树概述 ID3决策树是另一种非常重要的用来处理分类问题的结构,它形似一个嵌套N层的IF…ELSE结构,但是它的判断标准不再是一个关系表达式,而是对应的模块的信息增益.它通过信息增益的大小 ...
- Github二次学习
作者声明:本博客中所写的文章,都是博主自学过程的笔记,参考了很多的学习资料,学习资料和笔记会注明出处,所有的内容都以交流学习为主.有不正确的地方,欢迎批评指正. 本节课视频内容:https://www ...
- 20162316刘诚昊 第八周实验报告:实验二 Java面向对象程序设计
实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 实验要求 1.没有Linux基础的同学建议先学习<L ...
- web项目页面加载时,下拉框有值
1.我用的框架是springmvc和mybaitis 由于没有整个项目,直接就去请求的action :http://localhost:8080/ytert/test/selectStoreType ...
- Beta阶段冲刺第一天
提供当天站立式会议照片一张 讨论项目每个成员的昨天进展 昨天开始了Beta阶段的冲刺,总体讨论了一下这个阶段的任务,然后明确了个人分工. 讨论项目每个成员的存在问题 第一天暂时还没有什么问题,可能最大 ...