0.目录

1.装饰器

2.原生爬虫

3.补充知识点

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结构分析基本原则

三个原则:

  1. 尽量选取具有唯一标识性的标签作为定位标签
  2. 尽量选取最接近要提取的数据的标签
  3. 尽量选取可以闭合的标签

采用面向对象的方式编写爬虫:

分析页面获得数据结构:

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 数据精炼与排序

数据精炼:

  1. 去掉主播名称前后的空格和换行符
  2. 把列表转化为单一的字符串的值

将数据进行精炼:(使用字符串.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常忘的进阶知识(下)的更多相关文章

  1. Python常忘的进阶知识(上)

    0.目录 1.面向对象 1.1 函数与方法 1.2 类变量与实例变量 1.3 实例方法.类方法.静态方法 1.4 公开和私有:没有什么是不能访问的 1.5 继承 2.正则表达式 2.1 Python内 ...

  2. Python常忘的基础知识

    0.目录 1.进制 1.1 各进制的表示 1.2 各进制的转换 2.字符 2.1 转义字符 2.2 原始字符串 3.类型 3.1 基本数据类型 3.2 type() 4.变量与运算符 4.1 值类型与 ...

  3. python 常忘代码查询 和autohotkey补括号脚本和一些笔记和面试常见问题

    笔试一些注意点: --,23点43 今天做的京东笔试题目: 编程题目一定要先写变量取None的情况.今天就是因为没有写这个边界条件所以程序一直不对.以后要注意!!!!!!!!!!!!!!!!!!!!! ...

  4. Python开发【第七篇】:面向对象 和 python面向对象进阶篇(下)

    Python开发[第七篇]:面向对象   详见:<Python之路[第五篇]:面向对象及相关> python 面向对象(进阶篇)   上一篇<Python 面向对象(初级篇)> ...

  5. Python:什么是进阶,如何进阶?

    目录 Python:什么是进阶,如何进阶? 1. 什么是进阶? 2. 如何进阶? 3. 除此之外呢? Python:什么是进阶,如何进阶? 1. 什么是进阶? 一门编程语言的基础部分,往往非常简单.如 ...

  6. Spring实战3:装配bean的进阶知识

    主要内容: Environments and profiles Conditional bean declaration 处理自动装配的歧义 bean的作用域 The Spring Expressio ...

  7. Kinect for Windows SDK开发入门(15):进阶指引 下

    Kinect for Windows SDK开发入门(十五):进阶指引 下 上一篇文章介绍了Kinect for Windows SDK进阶开发需要了解的一些内容,包括影像处理Coding4Fun K ...

  8. 盘点 Python 中的那些冷知识(二)

    上一篇文章分享了 Python中的那些冷知识,地址在这里 盘点 Python 中的那些冷知识(一) 今天将接着分享!! 06. 默认参数最好不为可变对象 函数的参数分三种 可变参数 默认参数 关键字参 ...

  9. 整理的最全 python常见面试题(基本必考)

    整理的最全 python常见面试题(基本必考) python 2018-05-17 作者 大蛇王 1.大数据的文件读取 ① 利用生成器generator ②迭代器进行迭代遍历:for line in ...

随机推荐

  1. [BZOJ3218]a + b Problem-[主席树+网络流-最小割]

    Description 传送门 Solution 此处我们按最小割的思路考虑. 暴力:S->i表示该点选黑色的权值b[i]:i->T表示该点选白色的权值w[i].考虑如果某个点i受点j为白 ...

  2. BZOJ3174. [TJOI2013]拯救小矮人(dp)

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=3174 题解 其实此题并不需要那么多YY的部分. 我们考虑若干个小矮人逃出的顺序.若跳出的 ...

  3. Android开源的精美日历控件,热插拔设计的万能自定义UI

    Android开源的精美日历控件,热插拔设计的万能自定义UI UI框架应该逻辑与界面实现分离,该日历控件使用了热插拔的设计 ,简单几步即可实现你需要的UI效果,热插拔的思想是你提供你的实现,我提供我的 ...

  4. C++自学第一课:函数

    此贴并非教学,主要是自学笔记,所述内容只是些许个人学习心得的记录和备查积累,难以保证观点正确,也不一定能坚持完成. 如不幸到访,可能耽误您的时间,也难及时回复,贴主先此致歉.如偶有所得,相逢有缘,幸甚 ...

  5. youtube高清视频下载方法

    youtube下载方法有多种, 但都不支持1080P以上的高清下载, 今天找到一种支持1080P的, 记录一下 步骤1: 百度搜: Dooseen tubedown 下载该软件, 并安装, 一直下一步 ...

  6. java.lang.Boolean.valueOf(String s)

    简单说,就是s为true(这四个字母大小写任意)时,返回值为true,否则为false public class one { public static void main(String[] args ...

  7. 网络通讯中 bind函数的作用

    面向连接的网络应用程序分为客户端和服务器端.服务器端的执行流程一般为4步,客户端程序相对简单,一般需要两个步骤. 服务器端执行流程4步如下: (1)调用socket函数,建立一个套接字,该套接字用于接 ...

  8. Linux内核学习笔记(1)-- 进程管理概述

    一.进程与线程 进程是处于执行期的程序,但是并不仅仅局限于一段可执行程序代码.通常,进程还要包含其他资源,像打开的文件,挂起的信号,内核内部数据,处理器状态,一个或多个具有内存映射的内存地址空间及一个 ...

  9. 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 ...

  10. loadrunner处理https请求

    录制到的脚本如下: login() { lr_think_time(10); web_url("verifycode.jsp", "URL=https://192.168 ...