python 功能键ord_Python常忘的进阶知识(下)

0.目录

1.装饰器

1.1 为每个函数都增加一个功能

Unix时间戳(Unix时间戳(英文为Unix time、POSIX time或Unixtimestamp),是一种时间的表示方式): 定义为从1970年01月01日00时00分00秒起至现在的总秒数

1e69f20adfe2e029aa172c2da8d0b754.png

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

9c1d3a314a5ce56bea4c9f4002cfce8f.png 缺点:打印时间这个需求应该属于函数本身,并不是属于新增的函数 这种做法与

print(time.time())

f1()

并没有什么区别

1.2 装饰器只是一种模式

这就是装饰器:

fcfb3d4ee20ee232d96170dfac79fd7a.png 依旧是有缺点的!

1.3 语法糖

使用Python给予的语法糖@:(没有改变原来的调用逻辑!)

27fbdc5ecac4652ea5e5f12e5c6708ec.png

可以接受定义时的复杂,不能接受调用时的复杂! Python中的装饰器体现了AOP的编程思想

1.4 函数需要传递参数,该如何更改装饰器?

使用*args来代表可变参数:

2d932fc3bf78a2ac7d28c2920717d20d.png

1.5 函数需要传递关键字参数,该如何更改装饰器?

使用**kw来代表可变关键字参数:

165cab4dec80aa560934ef1d44dfdd1e.png

ps:猜测kw的意义可能是key word

2.原生爬虫

2.1 爬虫常规思路

爬虫前奏:

明确目的

找到数据对应的网页

分析网页的结构找到数据所在的标签位置

正式编码:

模拟HTTP请求,向服务器发送这个请求,获取到服务器返回给我们的HTML

用正则表达式提取我们要的数据(名字,人气)

此原生爬虫的目的是爬取熊猫直播https://www.panda.tv/cate/lol这个页面的所有主播名称与人气,然后依据人气进行排序

2.2 HTML结构分析基本原则

三个原则:

尽量选取具有唯一标识性的标签作为定位标签

尽量选取最接近要提取的数据的标签

尽量选取可以闭合的标签

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

c2bbb37768902a076729d9d21263861b.png

分析页面获得数据结构: htmls(一组数据):

包含主播姓名和观看人数

主播姓名

观看人数

真实人数

包含主播姓名和观看人数

主播姓名

观看人数

真实人数

包含主播姓名和观看人数

主播姓名

观看人数

真实人数

......

2.3 正则分析HTML

分析每组数据:

442f84077fa6ed925abdebf140647ea1.png

2.4 正则分析获取名字和人数

单项数据匹配规则:

4efb9d474dba50d449ade87411f05d0b.png

输出第一项提取的数据:

dda322fab6cfb84048087e8656ca60a5.png

2.5 数据精炼与排序

数据精炼:

去掉主播名称前后的空格和换行符

把列表转化为单一的字符串的值

将数据进行精炼:(使用字符串.strip()去掉字符串首尾的空格和换行符)

4ade43e589fe38830fdee6e66a6f217e.png

对数据进行排序:

Python内置函数sorted()可以方便排序

reverse=True则为降序排序

设置排序种子__sort_seed()函数

40dc512b542151f4c776225dd6cc7b06.png

2.6 案例总结

修改一下输出格式:

ba38cf214b706a5479567c2fa58fb3d6.png

e2e420dd1f91137700ba14a11a46bb4c.png

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

b7817524c2da0f9ef5a17c99a5635b42.png

103157adf924162246bd9d23034b617c.png

fcca2536d6d2a6b726f58c5a837134f9.png

3.补充知识点

3.1 用字典映射代替switch case语句

C++中的switch case

404ab555dfe9968dbc6929e17c7d1b13.png

Python使用字典:

640e43909e3b83bb156d4856c9e33e8d.png defalut功能没有解决!

不使用下标来取值:

0d89c52af98ab5090dbcad85772af1b9.png 返回值改为返回函数:

23a0d943710f68f052b5bc9bf7cfd280.png

3.2 列表推导式

求平方、求立方:

b3a791fd0bfa86cf7a5e7dacb6d810f1.png

e40b5ab826b90aea791e5595bb3f8f58.png

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

db6895ef758e620a20e10c428213b83f.png

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

446414924e3f1b5062893dd9745ffd41.png ps:字典(dict)和元组(tuple)也可以被推导

3.3 字典如何编写列表推导式

将key和value颠倒顺序:

311b7a57315ceac8c3c49ef41302ee09.png

元组是不可变的:

53fc1eee1a317714e81e044b1d6c6c43.png

3.4 迭代器(iterator)

可迭代对象(iterable)——凡是可以被for...in...循环遍历的数据结构都是可迭代对象,比如列表、元组、集合

迭代器(iterator)

迭代器是一个对象(class)

迭代器可以被遍历,普通对象不可以被遍历

如何让普通对象变成迭代器? 只需实现两个函数——def __iter__(self): 和 def __next__(self):

for...in...循环的实质在于会不断地去调用迭代器里面的__next__()方法:

29ee1652cd168898482e4cd86d4e6b6d.png

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

f63dfc8f8ae2097b10ac7c891c2df059.png

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

如何遍历多次迭代器? 1.再次实例化一个对象

087098601fa0794c146a25104d343d15.png 2.拷贝对象

1bbb90ee86dd99aaffe23ae67c052ebc.png ps:copy.copy()实现的是浅拷贝 pps:copy.deepcopy()实现的是深拷贝

3.5 生成器(generator)

生成器是对于函数来说的 输出0~10000:

d6f95eb1ab796b462e02d8a72bbdd5b9.png 缺点:非常消耗内存,因为n是列表,有10001个数,都存在内存中

如何输出0~10000,同时又不需要把0~10000所有的数字都存储在计算机中?

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

将return改为yield后,就会返回一个生成器:

6b6ed4efeac0336061e95065a9bee828.png

600dc62d13770a06a49cca6ee45f25bc.png

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

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

d9c41a4607af36c5341b304ec608f9cb.png

生成器的优势

既保证了函数的通用性,又解决了性能问题

生成器内部根本就没有保存任何的数据,实质是保存了一个算法

通过算法不断地生成新的数字

列表推导式也可以得到生成器(把中括号改成小括号):

bd7a01c6deeebeac7fe3fd14f0d771b4.png

3.6 对象存在并不一定是True

对象存在:

0e0f29ead9533e77faa5fedfedaefdc0.png

将对象长度置为0:

fbe4f0b2ef2fb52900bd28c20f42821e.png

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

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

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

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

06d0561f3c1cfb3bd0d26929a596cb80.png

3.7 装饰器的副作用

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

cbe08d77639c85679770602f2f2642b5.png

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

bdecdf4afa96a5795b6ac7fba1ebc6bb.png

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

efb47aebd3e4db128ae2e54b58fe2f39.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值