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

2023-10-22 21:10

本文主要是介绍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

这篇关于python 功能键ord_Python常忘的进阶知识(下)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/263591

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

sqlite3 相关知识

WAL 模式 VS 回滚模式 特性WAL 模式回滚模式(Rollback Journal)定义使用写前日志来记录变更。使用回滚日志来记录事务的所有修改。特点更高的并发性和性能;支持多读者和单写者。支持安全的事务回滚,但并发性较低。性能写入性能更好,尤其是读多写少的场景。写操作会造成较大的性能开销,尤其是在事务开始时。写入流程数据首先写入 WAL 文件,然后才从 WAL 刷新到主数据库。数据在开始

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

[MySQL表的增删改查-进阶]

🌈个人主页:努力学编程’ ⛅个人推荐: c语言从初阶到进阶 JavaEE详解 数据结构 ⚡学好数据结构,刷题刻不容缓:点击一起刷题 🌙心灵鸡汤:总有人要赢,为什么不能是我呢 💻💻💻数据库约束 🔭🔭🔭约束类型 not null: 指示某列不能存储 NULL 值unique: 保证某列的每行必须有唯一的值default: 规定没有给列赋值时的默认值.primary key:

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识