Python常忘的进阶知识(下)
0.目录
1.装饰器
- 1.1 为每个函数都增加一个功能
- 1.2 装饰器只是一种模式
- 1.3 语法糖
- 1.4 函数需要传递参数,该如何更改装饰器?
- 1.5 函数需要传递关键字参数,该如何更改装饰器?
2.原生爬虫
- 2.1 爬虫常规思路
- 2.2 HTML结构分析基本原则
- 2.3 正则分析HTML
- 2.4 正则分析获取名字和人数
- 2.5 数据精炼与排序
- 2.6 案例总结
3.补充知识点
- 3.1 用字典映射代替switch case语句
- 3.2 列表推导式
- 3.3 字典如何编写列表推导式
- 3.4 迭代器(iterator)
- 3.5 生成器(generator)
- 3.6 对象存在并不一定是True
- 3.7 装饰器的副作用
1.装饰器
1.1 为每个函数都增加一个功能
Unix时间戳(Unix时间戳(英文为Unix time、POSIX time或Unixtimestamp),是一种时间的表示方式):
定义为从1970年01月01日00时00分00秒起至现在的总秒数

为每一个函数都增加一个打印时间的功能:

缺点:打印时间这个需求应该属于函数本身,并不是属于新增的函数
这种做法与
print(time.time())
f1()
并没有什么区别
1.2 装饰器只是一种模式
这就是装饰器:

依旧是有缺点的!
1.3 语法糖
使用Python给予的语法糖@:(没有改变原来的调用逻辑!)

可以接受定义时的复杂,不能接受调用时的复杂!
Python中的装饰器体现了AOP的编程思想
1.4 函数需要传递参数,该如何更改装饰器?
使用*args来代表可变参数:

1.5 函数需要传递关键字参数,该如何更改装饰器?
使用**kw来代表可变关键字参数:

ps:猜测kw的意义可能是key word
2.原生爬虫
2.1 爬虫常规思路
爬虫前奏:
- 明确目的
- 找到数据对应的网页
- 分析网页的结构找到数据所在的标签位置
正式编码:
- 模拟HTTP请求,向服务器发送这个请求,获取到服务器返回给我们的HTML
- 用正则表达式提取我们要的数据(名字,人气)
此原生爬虫的目的是爬取熊猫直播https://www.panda.tv/cate/lol这个页面的所有主播名称与人气,然后依据人气进行排序
2.2 HTML结构分析基本原则
三个原则:
- 尽量选取具有唯一标识性的标签作为定位标签
- 尽量选取最接近要提取的数据的标签
- 尽量选取可以闭合的标签
采用面向对象的方式编写爬虫:

分析页面获得数据结构:
htmls(一组数据):
<div class="video-info">包含主播姓名和观看人数</div><span class="video-nickname">主播姓名</span><span class="video-number">观看人数</span><i class="video-station-num">真实人数</i>
<div class="video-info">包含主播姓名和观看人数</div><span class="video-nickname">主播姓名</span><span class="video-number">观看人数</span><i class="video-station-num">真实人数</i>
<div class="video-info">包含主播姓名和观看人数</div><span class="video-nickname">主播姓名</span><span class="video-number">观看人数</span><i class="video-station-num">真实人数</i>
......
2.3 正则分析HTML
分析每组数据:

2.4 正则分析获取名字和人数
单项数据匹配规则:

输出第一项提取的数据:

2.5 数据精炼与排序
数据精炼:
- 去掉主播名称前后的空格和换行符
- 把列表转化为单一的字符串的值
将数据进行精炼:(使用字符串.strip()去掉字符串首尾的空格和换行符)

对数据进行排序:
- Python内置函数sorted()可以方便排序
- reverse=True则为降序排序
- 设置排序种子__sort_seed()函数

2.6 案例总结
修改一下输出格式:


最终不太面向对象的代码:



3.补充知识点
3.1 用字典映射代替switch case语句
C++中的switch case

Python使用字典:

defalut功能没有解决!
不使用下标来取值:

返回值改为返回函数:

3.2 列表推导式
求平方、求立方:


只对列表中部分元素进行操作:

集合(set)也可以被推导:

ps:字典(dict)和元组(tuple)也可以被推导
3.3 字典如何编写列表推导式
将key和value颠倒顺序:

元组是不可变的:

3.4 迭代器(iterator)
可迭代对象(iterable)——凡是可以被for...in...循环遍历的数据结构都是可迭代对象,比如列表、元组、集合
迭代器(iterator)
- 迭代器是一个对象(class)
- 迭代器可以被遍历,普通对象不可以被遍历
如何让普通对象变成迭代器?
只需实现两个函数——def __iter__(self): 和 def __next__(self):
for...in...循环的实质在于会不断地去调用迭代器里面的__next__()方法:

也可以不用for...in...循环遍历:

迭代器具有一次性,第一次已经用完了,第二次就不会输出任何值!
列表、元组、集合无论遍历多少次都会输出相同的结果!
如何遍历多次迭代器?
1.再次实例化一个对象

2.拷贝对象

ps:copy.copy()实现的是浅拷贝
pps:copy.deepcopy()实现的是深拷贝
3.5 生成器(generator)
生成器是对于函数来说的
输出0~10000:

缺点:非常消耗内存,因为n是列表,有10001个数,都存在内存中
如何输出010000,同时又不需要把010000所有的数字都存储在计算机中?

优点:解决了性能问题
只是一个普通的函数,并不是生成器
缺点:实现的目的太过于特殊了,直接在函数内部输出了数字,假如最终目的不是输出数字,而是得到数字用来做别的事情......
在函数外部调用函数真实的目的应该是函数返回0~10000个数字,但是我怎么用,函数应该不要管,更不应该在函数内部输出数字
将return改为yield后,就会返回一个生成器:


如何使用生成器:
1.使用next()函数

2.使用for...in...循环遍历

生成器的优势
- 既保证了函数的通用性,又解决了性能问题
- 生成器内部根本就没有保存任何的数据,实质是保存了一个算法
- 通过算法不断地生成新的数字
列表推导式也可以得到生成器(把中括号改成小括号):

3.6 对象存在并不一定是True
对象存在:

将对象长度置为0:

对象的真假由两个内置方法决定——__len__与__bool__内置方法!
1.不定义__len__()方法与__bool__()方法时默认为True

2.定义__len__()方法时——__len__()方法必须返回大于等于0的整数或者True或者False

ps:当使用 bool() 方法或者 len() 方法时会调用__len__()方法
3.定义__bool__()方法时——__bool__()方法必须返回True或者False,不能返回0或者1

4.定义了__bool__()方法后,取bool(对象)的值不会再调用__len__()方法

3.7 装饰器的副作用
加了装饰器后,函数f1的名称变为wrapper了:

加了装饰器后查找不到帮助文档了:

Python提供了另一个装饰器来解决这个函数名称会被改变的问题:

Python常忘的进阶知识(下)的更多相关文章
- Python常忘的进阶知识(上)
0.目录 1.面向对象 1.1 函数与方法 1.2 类变量与实例变量 1.3 实例方法.类方法.静态方法 1.4 公开和私有:没有什么是不能访问的 1.5 继承 2.正则表达式 2.1 Python内 ...
- 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开发【第七篇】:面向对象 和 python面向对象进阶篇(下)
Python开发[第七篇]:面向对象 详见:<Python之路[第五篇]:面向对象及相关> python 面向对象(进阶篇) 上一篇<Python 面向对象(初级篇)> ...
- Python:什么是进阶,如何进阶?
目录 Python:什么是进阶,如何进阶? 1. 什么是进阶? 2. 如何进阶? 3. 除此之外呢? Python:什么是进阶,如何进阶? 1. 什么是进阶? 一门编程语言的基础部分,往往非常简单.如 ...
- Spring实战3:装配bean的进阶知识
主要内容: Environments and profiles Conditional bean declaration 处理自动装配的歧义 bean的作用域 The Spring Expressio ...
- Kinect for Windows SDK开发入门(15):进阶指引 下
Kinect for Windows SDK开发入门(十五):进阶指引 下 上一篇文章介绍了Kinect for Windows SDK进阶开发需要了解的一些内容,包括影像处理Coding4Fun K ...
- 盘点 Python 中的那些冷知识(二)
上一篇文章分享了 Python中的那些冷知识,地址在这里 盘点 Python 中的那些冷知识(一) 今天将接着分享!! 06. 默认参数最好不为可变对象 函数的参数分三种 可变参数 默认参数 关键字参 ...
- 整理的最全 python常见面试题(基本必考)
整理的最全 python常见面试题(基本必考) python 2018-05-17 作者 大蛇王 1.大数据的文件读取 ① 利用生成器generator ②迭代器进行迭代遍历:for line in ...
随机推荐
- [BZOJ3218]a + b Problem-[主席树+网络流-最小割]
Description 传送门 Solution 此处我们按最小割的思路考虑. 暴力:S->i表示该点选黑色的权值b[i]:i->T表示该点选白色的权值w[i].考虑如果某个点i受点j为白 ...
- BZOJ3174. [TJOI2013]拯救小矮人(dp)
题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=3174 题解 其实此题并不需要那么多YY的部分. 我们考虑若干个小矮人逃出的顺序.若跳出的 ...
- Android开源的精美日历控件,热插拔设计的万能自定义UI
Android开源的精美日历控件,热插拔设计的万能自定义UI UI框架应该逻辑与界面实现分离,该日历控件使用了热插拔的设计 ,简单几步即可实现你需要的UI效果,热插拔的思想是你提供你的实现,我提供我的 ...
- C++自学第一课:函数
此贴并非教学,主要是自学笔记,所述内容只是些许个人学习心得的记录和备查积累,难以保证观点正确,也不一定能坚持完成. 如不幸到访,可能耽误您的时间,也难及时回复,贴主先此致歉.如偶有所得,相逢有缘,幸甚 ...
- youtube高清视频下载方法
youtube下载方法有多种, 但都不支持1080P以上的高清下载, 今天找到一种支持1080P的, 记录一下 步骤1: 百度搜: Dooseen tubedown 下载该软件, 并安装, 一直下一步 ...
- java.lang.Boolean.valueOf(String s)
简单说,就是s为true(这四个字母大小写任意)时,返回值为true,否则为false public class one { public static void main(String[] args ...
- 网络通讯中 bind函数的作用
面向连接的网络应用程序分为客户端和服务器端.服务器端的执行流程一般为4步,客户端程序相对简单,一般需要两个步骤. 服务器端执行流程4步如下: (1)调用socket函数,建立一个套接字,该套接字用于接 ...
- Linux内核学习笔记(1)-- 进程管理概述
一.进程与线程 进程是处于执行期的程序,但是并不仅仅局限于一段可执行程序代码.通常,进程还要包含其他资源,像打开的文件,挂起的信号,内核内部数据,处理器状态,一个或多个具有内存映射的内存地址空间及一个 ...
- Your funds transfer has been delayed
Hello from Amazon. Your funds transfer in the amount of 9,422.88 USD has been delayed because the cr ...
- loadrunner处理https请求
录制到的脚本如下: login() { lr_think_time(10); web_url("verifycode.jsp", "URL=https://192.168 ...