《Effective Python》总结
第一章 培养Pythonic思维第1条 查询自己使用的Python版本1$ python3 --version
不要使用Python2!
推荐3.8左右的版本(写于2023-04),初学者不要用太新的版本,很多库不支持最新版。
第2条 遵循PEP8风格指南PEP8全称Python Enhancement Proposal #8,是针对Python代码格式编订的风格指南。不符合PEP8的做法一般编译器(如Pycharm)会自动检查标黄提醒。以下是一些重点规范:
用4个空格表示缩进,而不是制表符
下划线变量命名。
表达式一行写不下,可以用括号括起来,不要用 \ 续行。
import语句放在开头,总是使用绝对名称,按顺序划为三部分:标准库、第三方、自己的模块。
第3条 了解bytes与str区别bytes包含的是原始数据,即8位无符号值
1a = b'h\x65llo'
str包含的是Unicode码点
1a = 'a\u0300 propos'
第4条 用支持插值的f-string取代C风格的格式字符串与str.format方法1 ...
爬虫逆向技术
逆向介绍爬虫,就是在网络上自动抓取自己所需要的内容。很多人认为,爬虫技术主要是要学怎么去爬取内容,但其实,单纯的爬取网页内容(针对不设防的网站)非常简单,用Python几十行即可搞定。但理想很丰满,现实很骨感。实际上,不设防的网站少之又少,大部分信息重要程度很高的网站都有很难突破的加密与保护措施,比如常见的各种验证码。所以,学习爬虫更重要的是如何绕过网站/APP内的反爬虫措施,从而顺利得到我们想要的数据。这个过程就是逆向。
另外,提到爬虫,很多人都会问:“写这玩意是不是容易坐牢?”。确实,爬虫这种东西本身就带了一种“不太道德”的色彩,很多网站也是深受其扰。但对于个人开发者而言,只要做的不太过分,适当的爬取内容,一般公司也不会针对个人发起诉讼。“不谈剂量谈毒性就是耍流氓”。大家掌握好一个度就可以了。
Python爬虫常用工具在线工具
链接
简介
https://spidertools.cn
爬虫工具库
https://www.json.cn
Json解析网站
https://base64.us
Base64编码解码
https://www.runoob.c ...
Illustrator——一款非常好用的科研绘图软件
Illustrator?是个什么东西?提起Illustrator,你可能不知道它是个什么东西。再说到它的公司——Adobe,可能还是会有很多人一头雾水。但是,如果我说PS,大多数人应该就或多或少都听说过了。没错,PS,全称Photoshop,是一款功能强大的图片编辑软件,在中国以”修图“功能闻名于世。Illustrator和Photoshop一样,也是图片编辑软件,但是,它们存在一个很重要的区别:Photoshop主要用来处理位图,而Illustrator主要用来处理矢量图。
位图与矢量图简介位图也称为点阵图像或栅格图像,是由称作像素(图片元素)的单个点组成的。这些点可以进行不同的排列和染色以构成图样。当放大位图时,可以看见赖以构成整个图像的无数单个方块。大家相机或者手机拍的照片都属于位图。位图的存储方式是将图片的每一个像素点的颜色保存起来。
矢量图也称为面向对象的图像或绘图图像,在数学上定义为一系列由点连接的线。矢量文件中的图形元素称为对象。每个对象都是一个自成一体的实体,它具有颜色、形状、轮廓、大小和屏幕位置等属性。多见于软件设计时的图标,方便放大或缩小时不失真。矢量图使用一系列数 ...
Pycharm使用技巧
介绍Pycharm是Jetbrain旗下的集成开发环境(IDE,Integrated Development Environment)。笔者认为它是适用于Python语言的最强IDE。Pycharm分为专业版和社区版,其中专业版需要收费,社区版免费。但社区版的功能已经足够覆盖绝大多数使用场景。专业版有教育计划,如果是在校大学生可以申请免费使用,强烈推荐在校生们都下载体验一下。
下载官网地址:https://www.jetbrains.com/pycharm
大家根据情况下载即可。如果需要申请教育免费版,请前往:https://www.jetbrains.com/shop/eform/students
或者如果之前验证过GitHub的学生身份,也可以直接用GitHub进行学生认证。
常用快捷键
Ctrl + 方向 —— 跳过整个单词
home —— 跳到行首
end —— 跳到行尾
Ctrl + home —— 跳到整个文件开头
Ctrl + end —— 跳到整个文件结尾
Ctrl + D —— 向下复制一行
Shift + 回车 —— 光标在任意位置都可以直接从下方新建一行
Ct ...
RDKit基础操作 (一)
RDKit对象分子对象分子对象是RDKit里最重要的一种对象,大部分的操作都围绕它展开。得到分子对象的方式通常是由SMILES字符串转换而来。比如我们想要得到苯的分子对象:
123from rdkit import Chemmol = Chem.MolFromSmiles('c1ccccc1')
SMILES以及分子对象中一般不显式写出氢原子,而是通过化学规则推断。如果要显示出显式氢,可以使用:
1mol = Chem.AddHs(mol)
同理,去掉显式氢则使用:
1mol = Chem.RemoveHs(mol)
获取分子的原子数和化学键数
12mol.GetNumAtoms()mol.GetNumBonds()
获取分子中的原子:
12345GetAtoms()atoms = mol.GetAtoms()for atom in atoms: ...
获取分子中的键:
12345GetBonds()bonds = mol.GetBonds()for bond in bonds: ...
根据原子编号获取原子:
1GetAtomWithIdx()
...
Python里的那些“魔术方法”
什么是魔术方法?在Python中,所有以双下划线__包起来的方法,统称为Magic Method(魔术方法),它是一种的特殊方法,普通方法需要调用,而魔术方法不需要调用就可以自动执行。或许在之前,你不知道这个概念,但我保证,只要你用过Python,那你一定在不经意间用过魔术方法。例如:对于两个字符串,你可能会用“+”号把他们连起来,得到一个合起来之后的字符串:
1234567a = 'Hello, 'b = 'World!'c = a + bprint(c)>>>Hello, World!
但是,按理说,“+”只能对于数使用,字符串之间是不能相加的,那为什么上面那段程序还能够运行呢?这就是魔术方法的功劳了。事实上,因为str类实现了__add__魔术方法,进而实现了运算符重载,所以我们可以通过“+”来实现字符串的拼接。
魔术方法在类或对象的某些事件触发后会自动执行,让类具有神奇的“魔力”。如果希望根据自己的程序定制自己特殊功能的类,那么就需要对这些方法进行重写。例如,如果我们想要实现一个自己的字符串类,在两个长度相等的全是字母 ...
树状数组+线段树
问题分析树状数组和线段树是两种非常常用的数据结构,那么他们分别是用于什么问题呢?这里借用一位力扣大佬的总结:
数组不变,求区间和:「前缀和」、「树状数组」、「线段树」
多次修改某个数(单点),求区间和:「树状数组」、「线段树」
多次修改某个区间,输出最终结果:「差分」
多次修改某个区间,求区间和:「线段树」、「树状数组」(看修改区间范围大小)
多次将某个区间变成同一个数,求区间和:「线段树」、「树状数组」(看修改区间范围大小)
这样看来,「线段树」能解决的问题是最多的,那我们是不是无论什么情况都写「线段树」呢?
答案并不是,而且恰好相反,只有在我们遇到的问题,不得不写「线段树」的时候,我们才考虑线段树。
因为「线段树」代码很长,而且常数很大,实际表现不算很好。我们只有在不得不用的时候才考虑「线段树」。
总结一下,我们应该按这样的优先级进行考虑:
简单求区间和,用「前缀和」
只要求最终结果,用「差分」
多次将某个区间变成同一个数,用「线段树」
其他情况,用「树状数组」
(作者:AC_OIer,链接:https://leetcode-cn.com/problems/range-su ...
如何下载网页上的直播视频
前言昨天接到了一个任务,给一个会议录屏。由于笔者的失误,导致环境声音也被录了进去。不过幸好有回放。但是下一个问题又来了。这个回放依然是直播形式的。也就是说,这个视频是由许多个长度只有几秒的小视频组合而成,并不能直接下载。
解决方法笔者找到了一种可以下载这种视频的方法,亲测有效。其实思路非常简单直接,就是将所有的这些小片段全部下载下来再拼到一起。好,现在思路有了,具体如何实现呢?可以分下面几个步骤。每个步骤的解决方法和实现可能有多种形式,笔者只介绍自己这次用的。
1. 抓取m3u8文件首先,我们需要先找到这场直播的网页中的m3u8格式的文件。这个文件会首先被发送过来。如果把接下来服务器端传过来的几百上千个ts文件(也就是视频文件)比作书的每一章节,那么这个m3u8文件就是这本书的目录,指示每一章节的位置以及页数。
使用记事本打开后,这个文件的内部结构如下(链接的中间部分已打码):
1234567891011121314151617#EXTM3U#EXT-X-VERSION:3#EXT-X-ALLOW-CACHE:NO#EXT-X-TARGETDURATION:5#EXT-X-MEDIA- ...
最大为 N 的数字组合
题目简介902. 最大为 N 的数字组合难度:困难
给定一个按 非递减顺序 排列的数字数组 digits 。你可以用任意次数 digits[i] 来写的数字。例如,如果 digits = [‘1’,’3’,’5’],我们可以写数字,如 ‘13’, ‘551’, 和 ‘1351315’。
返回 可以生成的小于或等于给定整数 n 的正整数的个数 。
示例 1:12345输入:digits = ["1","3","5","7"], n = 100输出:20解释:可写出的 20 个数字是:1, 3, 5, 7, 11, 13, 15, 17, 31, 33, 35, 37, 51, 53, 55, 57, 71, 73, 75, 77.
示例 2:1234567输入:digits = ["1","4","9"], n = 1000000000输出:29523解释:我们可以写 3 个一位数字,9 个两位数字,27 个三位数字,81 个四位数字,2 ...
最多可达成的换楼请求数目
题目简介1601. 最多可达成的换楼请求数目难度:困难
我们有 n 栋楼,编号从 0 到 n - 1 。每栋楼有若干员工。由于现在是换楼的季节,部分员工想要换一栋楼居住。
给你一个数组 requests ,其中 requests[i] = [fromi, toi] ,表示一个员工请求从编号为 fromi 的楼搬到编号为 toi 的楼。
一开始所有楼都是满的,所以从请求列表中选出的若干个请求是可行的需要满足 每栋楼员工净变化为 0 。意思是每栋楼 离开 的员工数目 等于 该楼 搬入 的员工数数目。比方说 n = 3 且两个员工要离开楼 0 ,一个员工要离开楼 1 ,一个员工要离开楼 2 ,如果该请求列表可行,应该要有两个员工搬入楼 0 ,一个员工搬入楼 1 ,一个员工搬入楼 2 。
请你从原请求列表中选出若干个请求,使得它们是一个可行的请求列表,并返回所有可行列表中最大请求数目。
示例1:
1234567891011输入:n = 5, requests = [[0,1],[1,0],[0,1],[1,2],[2,0],[3,4]]输出:5解释:请求列表如下:从楼 0 离开的员工为 x 和 ...