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. 什么是进阶? 一门编程语言的基础部分,往往非常简单.如 ...
随机推荐
- Discover Feature Engineering, How to Engineer Features and How to Get Good at It
Feature engineering is an informal topic, but one that is absolutely known and agreed to be key to s ...
- 前后端分离之JWT用户认证zf
在前后端分离开发时为什么需要用户认证呢?原因是由于HTTP协定是不储存状态的(stateless),这意味着当我们透过帐号密码验证一个使用者时,当下一个request请求时它就把刚刚的资料忘了.于是我 ...
- Yii 2.0 Gridview源码分析
GridView yii\grid\GridView 作用:GridView是Yii中的一个Widget,用来展示数据表格.有排序,分页和过滤功能. GridView默认界面如下.这是用Gii生成的. ...
- Angular开发者手册重点翻译之指令(一)
创建自定义的指令 这个文章将解释什么需要在自己的angularjs应用中创建自己的指令,以及如何实现它. 什么是指令 在高的层面上讲,指令是DOM元素中的标记(例如一个属性,一个节点名,注释或者CSS ...
- charles基本使用文档
Charles 主要的功能包括: 截取 Http 和 Https 网络封包. 支持重发网络请求,方便后端调试. 支持修改网络请求参数. 支持网络请求的截获并动态修改. 支持模拟慢速网络. Charle ...
- ython进阶06 循环对象
这一讲的主要目的是为了大家在读Python程序的时候对循环对象有一个基本概念. 循环对象的并不是随着Python的诞生就存在的,但它的发展迅速,特别是Python 3x的时代,循环对象正在成为循环的标 ...
- centos7挂载Windows共享文件夹(学习笔记)
centos7挂载windows共享文件夹 练习环境:centos7是安装在台式机的虚拟机,Windows共享文件夹是公司服务器的共享文件夹(已设置好的共享) 步骤 1. 设置挂载点:mkdir /m ...
- python错误记录
在主函数里调用其他函数时形参顺序要一致 错例如下:
- CentOS-6.x系列查看cpu核数
使用CentOS7.x使用习惯了后用top命令,然后按1就可以查看相关的cpu核心数等相关信息 相关概念: 物理CPU:实际Server中插槽上的CPU个数. 物理cpu数量:可以数不重复的 phys ...
- mysql 性能优化 20 条建议
MySQL性能优化的最佳20+条经验 2009年11月27日陈皓发表评论阅读评论100,946 人阅读 今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性 ...