之前我们一起学习循环的时候介绍过,其中有几个语句可以跳出循环。第一个就是 break, break 的功能就是跳出当前的循环语句,你可以理解为就是当前的 forcover 都不执行了,直接就执行 forcover 后边的语句。第二是 continue, continue 意思你可以理解为直接这个 continue 后边的语句都不执行了,再重新跳到 four 和 well 的这个表达是判断那里开始执行下一次的循环。 此外呢,还有一个 s 语句,这个不是跳出,这个是表示当循环正常退出,就要去执行 ls, 如果你写了的话。此外还有一个 pass, pass 这个语句大家从字面上就可以理解,就是它里面其实什么都没有,就是个正位符, 你可以理解为这个程序我将来要写,但是呢,如果你现在留空的话,程序会报错,所以用 pass 来表示,以后我再去写这个程序。 老规矩,我们还是来看代码演示,这是一段简单的否语句,输出的是从一到九九个数字,后面还有在否语句之后的代码来进行参考。如果我们要求当 i 等于七的时候跳出不再执行这个否,那么可以在里面加入一副 i 等于七 break 异形的结果就是当爱等于七的时候,后面的八和九两个循环就不再执行了,就直接跳出了否语句。 如果我们希望 i 等于六的时候,在处于 i 等于六后边的代码都不再直行,那么就要使用 continue, 我这里插入 continue, 并且在 i 等于六后边加入一个 printer 啊,在执行的结果,因为前面的一二三四五都不会触发。二等于六,二等于七,那么当然那个 printer 循环题里面那个 protein 也会正常的执行。 所以我们在结果里面看到一二三四五后边都有一个 print 输出的 i t i 节的内容,那当 i 等于六的时候,那个 continue 就被触发了,这个时候因为我们说这个是转到前面那个负循环的循环头,那后边那个 print 就不会被触发进行运行了,这个是 continue 它的功能。 当然因为否语句后面那个 printer 始终是处在否语句之后的,他肯定不是不受否语句影响的。那 ls 会在什么情况下运行呢?在这种情况下,即使我们在否后面加了 ls, 他也是不会运行的。原因在于我们在 程序里面使用了 break, 人为的打断了他这个 for 语句的循环。如果把这个 for 语句的中的 break 注视掉,即使你用了 continue, 也表示这个 for 完全循环完成了,这个时候 as 就会执行,是处在我们 for 语句之后那个代码之前, 你会看到这个 print 添加完成了,这就是 brick, continue 和 else 三个语法的作用。
粉丝1.1万获赞15.0万

pyxon 零基础入门第三章三点时异常处理我们编写的代码如同一次精密的科学实验, python 解释器就像认真做实验的实验操作员,它会一行一行来运行我们代码。 每一行代码就像实验中的一个关键环节,如果某一行代码出现疏漏,例如,我们在 while 语句末尾遗漏了冒号,程序就会报告语法错误。 syntax error, 整个实验便会中断,剩下的代码都将无法继续执行。 为了避免我们辛苦写的代码无法运行,我们该如何找出问题并修正呢? python 为了应对程序运行中的异常,专门为我们提供了一个语句,叫做 try accept, 为我们捕捉异常。 我们可以把需要检查的语句放在 try 语句下方,如果这部分语句出现异常,就会转而执行 accept 语句中的内容。 但如果我们只是简单地提示程序异常,请修改。我们并不能知道具体应该修改哪里。因此,我们需要对异常进行分类,根据不同的 bug 修改代码,在 accept 后面写上异常类型,例如出现了语法错误,就提示语法错误,请修改。 那么常见的异常类型还有哪些呢?例如,在查找不存在的文档时,出现的是 file not found error, 我 们可以在 accept 后面写上这个异常类型, 一旦出现这个异常,就输出文件没有找到。在交互式环境中,如果用户输入的数据类型不符合预期,同样会导致程序报错,出现异常。 我们通过计算器的案例来演示这种情况下两个常见的异常类型。当用户输入除数为零时,由于除数是零,在数学上是不被允许的, 我们也无法计算,就会出现除零错误。我们使用 accept 语句捕捉 zero division error 除零错误,并提示用户除数不能为零。如果用户输入的不是数字,而是其他的字母,很明显也会报错。我们想要的是数值类型的数据,而用户给我们的是矩阵类型, 不能够做除法运算,那么就会触发值错误。 value error, 大家就会发现报错的原因有很多,有些异常并不常见,我们可能无法提前预料,不过没关系,可以使用 accept exception s e 语句来捕捉其他未预料到的异常。 这里的变量 e 也被赋值上了这个异常类型,我们可以输出这个变量 e, 你 就能够知道是什么异常啦。 tree accept 语句的执行顺序是从上往下的, 一旦某个异常被捕捉到,就会执行对应 accept 中的语句,而之后的代码就不会再执行。如果没有发生异常,那就可以使用 else 语句, 在 else 里面继续执行没有错误时需要进行的操作。最后我们还可以写上一个 finally, 当程序打开的时候,无论是正常还是异常,都会使用上一些资源, 就像我们打开文件和读文件,最后也会关闭文件一样。为了释放资源,我们就会写上 finally 作为结尾。 finally 里面的语句无论是异常或者没有异常都会执行。这个视频主要学习了处理异常的 try accept 语句怎么写,它包含四个关键字部分, tree 里面放上需要检测异常的语句 except, 后面接上我们预测可能发生的异常,捕捉到异常就执行,没有捕捉到就不执行。 else 里面放上没有异常时需要进行的后续操作,然后使用翻译释放资源。同时我们也学习了几种常见的异常类型,发现除零错误时就会出现 zero division error, 打开不存在的文件时就会报 file not found error, 如果不能转化成功正确的数据类型的话,就会报 value error 的 错误。这些你都学会了吗?现在是练习时间,让我们通过一个实际案例来练习巩固这些知识。 在 python 里面,我们同样是根据除法运算的代码进行异常处理。首先我们需要获得两个数做除法预算,第一个数 num 一 为除数,我们写上 float, 然后使用 input 的 函数 获得用户输入的被除数 number two, 请求用户输入除数,然后对这两个数进行除法运算,写上 result 等于 num 一, 除以 num 二, 得到了结果之后,我们就需要输出结果。在这段代码中,我们需要进行异常检测的是这三行代码,我们需要检测用户输入的数据类型是否正常,而且是否能正常进行除法计算。 我们把这三行代码放到 try 的 下面,如果没有出现异常就输出结果,那么输出结果就是后续操作,写在 else 里面。 现在我们来写我们预测的异常处理,首先 accept 除数不能为零,所以有 zero division error, 输出除数不能为零。然后第二个异常捕捉是 value error, 如果用户输入的内容不能够正常转化为浮点型的话,那么就会报 value error 的 错误,那么我们使用 print 语句提示输入的不是数字。 除此之外,我们还有一些自己无法预料到的错误,我们就使用上 accept exception s e 语句,发生了未知错误,然后输出这个错误。完成了这些之后,我们使用 finally 释放资源,提示程序已经结束了。 现在我们来运行一下这段代码,写上除数,如果我写的是字母,就会提示我输入的不是数字,并且还显示程序已经结束。那么我们再来运行一下这段代码,被除数为十二,除数为零的话,表示除数不能为零,也会提示我们。现在我们来验证一下,如果程序正常, 我们写上十二,然后写上二十一,它就会输出正常的结果。学习异常处理是为了让我们的程序遇见 bug, 能够继续执行下去,并且能够准确的提示用户和程序员为什么出现了 bug, 方便我们修改,你学会了吗?学会了要记得给我点赞哦,我们下个视频见。

用拍照实现微信自动发信息,我们先这样这样,再这样,然后这个是对方的号,这个是内容和发送时间,我们随便敲两下代码就写完了,改一下发送时间,运行程序时间到了, 程序自动搜索微信,发送指定消息,然后关闭关注我,学习更多拍葬技能。

开放零基础开始学第三章六点三,自定义异常捕获如何定义业务异常?对了,我已经把自己亲测有效的拍脏全套学习资料整理成了精简资料包,无偿分享,有需要的可以找我领取。 好,那自定义这个异常的话呢,我们要知道啊,自定义异常的这个用途,那主要呢就是利用异常的这个机制来编写这个程序的中断逻辑,那编写的时候呢,咱们必须得继承现有的异常,再增加额外的功能。 好,那边咱们看啊,主要我把它划成了三个部分。那第一个的话,我们说了,你要写自定义异常,那一定是说我的 程序逻辑是希望他能够什么通过 try accept 的 这种方式进行中断的。那这边比如说我出现了错误,我想让用户继续往下执行,那其实用这个异常是不合适的。 那第二个的话呢,那咱们去编写的自定义异常定是不能从头去写的,他必须继承我们现有的异常,可以继承自 exception, 也可以继承自我们的其他的异常。 那继承完之后的话呢,那这一边主要继承了之后呢,是想要给现有的异常增加额外的这个功能啊,这是它的主要用途。 那异常怎么去继承,怎么去编辑呢?你看一下我的这个例子啊,那这边当我想要去, 呃,使用一个自己定义的这个异常叫 my exception, 那 我可以直接去继承 exception, 那这样的话呢,这个 my exception 就 变成了一个异常了,那这时候的话,这个 my exception 你 可以进行补货,那这边除了补货之外,你还可以什么?哎,这个去抛出这个异常,是吧?啊,那这样我就产生这样的特定异常,把它抛出啊,那边补货,那补货 except, 加上这个异常。 好,怎么抛出,怎么补货呢?那其实如果你需要自己抛出异常的话,我们使用的是这个叫做 race。 啊,抛出异常,那怎么来补货呢? accept, 我 就可以进行补货。 啊,那这个其实就是什么呢?这个 my exception 啊,其实就是我自己定义的一个异常信息。好呢,可以来看看,来去定义一个自己需要的异常。 好,那这里边的话,我们先仿照我们的这个 ppt 啊,写一个叫做 my 啊 exception。 好, 那它在这里呢?继承我们啊。啊, exception。 好,这样我们留一个空啊,什么都不写,一会儿我们再去 follow。 那 在这里我们如果产生这个异常啊,会是啥情况呢?咱们可以 raise my exception。 好,咱们看这是不是就产生了一个异常啊?但是产生的这个异常的名称叫什么呢?叫 my exception。 在 哪哈产生呢?就在我们的第一行。好,产生的这个异常的原因啊,就叫做 my exception。 好, 既然它有这个原因,我们是不是就可以捕获它呀?所以呢,咱们可以用 try。 好, 那 raise my 啊 exception, 那 咱们给它补货。 好,我捕获成 exception, 然后咱们输出这个 e。 好, 那捕获的时候呢?我发现什么?哎,这里边没有捕获啊,那这边是因为什么?我们这个异常其实什么都没做,是吧?好,所以呢,咱们在里边捕获的时候啊,我们把它改成什么呢?改成我们的 my exception。 好,这边我们发现啊,确实发出这个异常,捕获异常了,但是呢,因为什么都没有做,所以呢你输出的这个 e 呀,他的结果也是空的,看到了吧? 啊?那人不管用 exception 还是 my exception, 其实我们都没有办法发现捕获到的这个东西,我们给他去输出,所以呢,这时候我们怎么办呢?咱们要回到我们的这个最开始这个异常上,我们要给他什么呢?做点事情是吧?咱们来丰富他, 好,怎么来丰富它呢?那这边大家可以看一下,我们一般的异常会怎么产生呢?比如说像这个值错误,是吧? 那叫 value arrow。 好, 然后 value arrow 这后边的参数呢?咱们来去运行啊。哎, 好,你看他是可以直接运行的,那在这里呢,我们给他抛出这个异常, 咱们来看看。好,那抛出来之后的话呢,咱们看看,这就是产生了一种异常了,是吧?这个异常叫做值错误,那值错误的话呢,对应后边的这个参数啊,这些参数就会显示到值错误的这后边。 哎,这什么呢?这是当你去遇到这个 v 六 i, 这是系统定义的一个异常的时候,我们会这样去显示,那咱们在这里面定义的异常,其实我也想要实现这个功能,那这边怎么做呢?请你可以参考他来去重新编写我们的这个自己的这个异常,是吧?好,那咋做呢? class 啊,那咱们这个叫什么呢?咱们不叫 value arrow, 叫做 name arrow 啊,就当我的名字为什么的时候,我这时候就让它进行报错,是吧?那这个 name arrow 的 话呢?我们如果想要使用 value arrow 的 形式,你可以直接去继承它, 但是呢,遵照习惯,一般的情况下,我们直接去继承谁啊?继承我们的 exception。 好,那再一遍的话,大家要记得我们的 solo 的 原则其中有一条是什么,当我们如果能够成功调用子类的时候,那他的副类也一定能够成功使用,是吧?这是满足我们的 solo 的 原则。 好,所以呢,咱们来去验证我们系统写的这个程序有没有符合我们的这个原则,是吧?啊,那在里边习惯啊,我们要继承这个 excel。 好,那继承 exception 的 时候呢,我们说了,这个像 value io 一 样,我要读入一个参数,咱们要显示这个参数,是吧?哦,所以呢,我在这边 define iit, 是 吧? 初步函数,那它的第一个参数呢?叫 self。 好, 第二个呢?我们接收进来的啊,咱们叫啥?叫做 message 吧, 接收点消息进来啊,接收点消息进来之后呢,我们来去用 self 点 message, 等于啊 message。 好, 我这边去接收这个消息,然后呢,让他进行一个赋值是吧? 好,然后接下来话呢,我们说了,咱们得让这个东西进行一个输出,对吧?咱们看补货了之后,我再去输出这个 e, 咱们要让它进行输出,所以呢,怎么办呢?我们在这边再去把这个东西给它输出出去,是吧?好,输出出去的时候呢,我们其实不想直接把这个属性暴露给别人。 哎,不想别人直接去用这个 message 怎么办呢?咱们是不是可以把给它封装成一个函数啊?好,那这边 d f 啊,那这边我们就叫做 m s g 啊,叫做这样的一个函数。好,这个函数用来做什么呢?那这边它是用来返回的好一点。什么东西呢?我们返回一个 f strength 啊,名字不允许使用哪个呢? self 点 message, 那 在这里它的属性哎,我这边就这个花括号给它括起来,让它在 f strings 里边进行一个解析。 好,那别人再去调用这个 name arrow 的 这个,我调用这个函数了,是吧?觉得调用起来不方便,我希望呢,用它的时候就像用属性一样,是吧?好,那所以呢,我给它加一个属性的装饰器, 好 property。 那 这样的话呢,我们 message 虽然它写起来是函数啊,返回的时候是啊,一个 f string 是 吧?但是我这边调用它的时候呢,是可以直接把它当做属性来去调用的啊。 好,那这回的话呢,咱们就可以来去判断了,是吧?然后那这边当我们这个名字是谁呢啊?咱们看是用汤姆还是用杰瑞吧来。好,那这边 try。 哎,我这边, 呃揣的时候呢,咱们在上面给他使用一个啊,名字是吧?好,名字等于啊杰瑞。好,这样有一个变量,是吧?那如果我们的这个名字和我们的杰瑞要相等了 啊,这时候我就需要去捕获它了,是吧?然后呢,这种情况下我们就抛出谁呢?我们就抛出一个叫做 name arrow 的 这个异常。 那 name arrow 的 这个异常的时候抛出来之后呢,我们希望什么呢?把我们的这个 name 给它传进去啊,那这样的话呢,我们就抛出了一个带参数的这个异常了,是吧?哦,那捕获的时候我们可以怎么捕获呢?我也可以捕获一个 name arrow, 是 吧?然后这边把它叫什么?叫做 n e, 嗯,之前叫 e 是 吧?我这回改了,改叫 n e。 好, 输出的时候呢,咱们知道这个地方有个 message 属性是吧?所以我就直接输入 n e 点 啊, m s g。 好, 虽然它是函数,但是我用装饰器把它改了是吧?改成属性了,所以我在输出的时候也可以是属性。 好,那这回的话呢,我们就可以看一下,那当你的名字是杰瑞的时候,那我这边就会抛出这个异常,那这边如果不是就不抛出是吧?那咱们先换回 tom 来去正常执行一下,好,没有问题是吧?什么都不显示,那这回我给它改成杰瑞 啊,你看这边显示了啊,你不能叫做杰瑞,为啥呢?因为当他是杰瑞的时候,我在捕获异常的这个语句块当中就把这个名字读进去了,判断相等,那这时候我就抛出一个我自己定义的一个异常,这个异常名字叫做内麦 iro 啊,你看本来他的逻辑是没有问题的是吧?也没有语法错误,但这就是我定义的业务上的一个异常啊。那抛出的时候呢,我们这边不但是抛出了这个异常,而且把抛出异常的这个原因有这个名字我放进去。 好,放进去之后,那这边我们的这个 name arrow 这个类啊,其实是可以啊,继承 exception 的, 所以呢,它可以作为我们的异常去抛出。那这边接收的信息呢?作为 message 参数,并且复制给我们的实力化的 self message, 那 复制给我们的这个 self message, 当它捕获这个 name 这个异常的时候呢,我把这个 name arrow 啊,给它命名为 n e, 那这边它其中就有一个用函数通过装饰器变成了一个属性 m s, g, 是 吧?啊?那这边我们就返回了啊,这样的一串信息啊,那这边你看这个就是我们去自己定义的一个异常,那这边它其实 比较有用的什么呢?其实就是我可以把函数变成一个属性来去直接使用。 ok, 咱们看一下这样的一个例子。 好,那回来这个是什么呢?是我们怎么来去自己定义这个异常,是吧?咱们可以通过 race 来去抛出,然后 accept, 再去把这个东西再去接住, 是吧?那抛出的时候咱们说可以带参数啊,那这个参数其实就是 my accept 啊,继承字 exception, 然后通过 i i t 参数,那这边通过我们的类里边的这个方法对它进行处理,处理完之后呢,让它进行输出,好输出的时候呢?我们这边相当于把它实化 好,实力化的话我们可以带属性带方法,对吧?你看这边就是把我们的整个的逻辑用异常处理的这个方式给它中断,我们用其他形式去处理了。 那其实我们有的时候再去用的时候,发现在系统当中也带了类似的这个用法,那他其实会更简单,这叫啥?叫做位子语句,那咱们记得 open 打开文件是吧?好,打开的时候我们可能会遇到各种各样的这个错误,比如说打开文件的时候文件路径不对 啊,文件名称不对,文件不存在,打开时候文件权限不对等等,这一系列的这个操作其实都会涉及到什么?打开的时候什么时候关闭? 好,所以这里我们引入一个位子语句,在打开的时候如果出现问题,那在里面只要离开了位子语句,我们就自动关闭掉,是吧?比如说打开的时候出现异常,那这边离开了位子语句,我就自动关闭掉啊,那这边当你打开文件时候,这个, 呃,我们的这个文件名错误,那,那这边也是可以做这个事情的,那我们说如果你想要去实现这个位子语句的话,我们也可以拿我们自定义的这个类来实现。 好,那他实现的这个方式是什么呢?是这样的那位子语句啊,其实主要使用了双下划线 enter 和双下划线 exit 这样的两个方法 啊,那这边咱们又想起了什么?鸭子类型是吧?就是说他长得像鸭子啊,走路像鸭子,或者叫起来像鸭子,我就认为他是鸭子。好,那这边比如说我们定一个叫做 my class 啊,那这边当我们使用位子语句这个对象,只要被调用,那这边我们就执行这个 enter 啊,这个方法里边的这个所有的这些语句,是吧?那这边之后的话, at 后边的话呢,会把我们的这个类给进行一个实体化, 那这边当你去定义什么呢?这个类里边的 exit 这样的一个方法的时候,就是离开了位子一块这部分就会自动执行了, 那这边当你定义好了这个 my class 之后,那咱们就可以使用什么 with my class, as mc, 对 吧?然后呢去使用实力化的这些方法,那这边当你去调用这句的时候,它就自动执行了 enter, 那当你离开了这个位子的这个语句块的时候,它就自动执行了双下巴 c exit 啊,那这个就是什么?就是我们的位子语句和我们怎么来去自己定义的这个类啊,去进行一个结合。比如说我们像现在打开文件是不是使用位子啊? 那那这个除了这个呢,我们还能想到什么使用位子呢?打开网页是吧?然后位子,然后打开一个网页,读取网页里边的内容。好,那咱们使用这样的这个位子,然后 s max 啊,这样的一个方法,就可以去实现我们自定义一类的一个位子的用法了。 好了,最后呢我来给你去总结一下,这个关于自定义常,必须要让它 去继承你现有的异常,不能是直接继承 object 啊,因为在我们的这个 exception 啊,这些异常里边会有提前编辑好的异常处理的这个逻辑啊,这部分我们必须要继承 啊,那这边我们去继承的时候呢,你可以从这个 exception 继承,也可以从其他的这个子类继承,但是我们会发现什么从子类和从 exception 继承呢?就是结果是一样的,是吧?那因为我们都要重新编写异常的这个逻辑,所以呢在这边还是推荐大家使用 exception。 那 另一个的话呢,我说编辑好自己的异常,怎么来引发异常呢?咱们要使用 race 这样的一个关键字可以引发异常,那补货的时候呢,也可以补货我们当前的这个异常, 那捕获了之后的话呢,我们可以通过 as 这个关键字把你的异常啊实力化,并且调用你的自定义异常里边的这些属性和方法。 那同时的话呢,还为大家去讲解了关于 with 这个语句它的一个用法,那这边和我们的这个异常处理一样,它是可以呢去通过我们的 enter 啊这个魔术方法去进入到我们的这个位子的语块当中,然后通过 exit 来去离开语块进行一个自动执行了。好,那以上呢就是我们怎么来去使用自定义异常来去处理我们系统当中这些问题。

使用三行代码就可以发送邮件,试一下。好,发送成功,这里已经收到这个邮件了,又要二十了。 再来发送一个复杂一点的,有 pdf, 有 图片,有压缩包, 实际上也就有三个单了,这里是他的那个邮件对象。呃,简单看一下吧。首先发送人是谁?发给谁,这里可以群发,然后的话,这是主题,这是内容,这个内容无所谓,这是附件,这是 pdf 附件,图片附件, 压缩包附件所。所以拿到这个私立的话,直接改一下内容,就可以直接发送,然后创建一个客户端,然后发送。我知道,我现在发送一下 这个,由于有附件,所以可能会稍微等一会。 ok, 发送成功了。好,我们打开,你先看看。 好的,刚才发的邮件已经没了,我们可以开附件看一个图片,一个是 pdf, 一个是压缩包,已经正常发过来了,所以,好,现在具体看一下那个实现过程吧。首先要登录这个 music。 呃,在这里要创建一个 cd, 等命 先看完,然后再直接操作吧。然后进入这个夺命,进入 p n s 解析,你就把它极功能解析。呃,复制到你的域名服务器里,进行 name 解析,解析好之后,这里就会提示 very high, 然后可以获取 api。 可以 啊,申请 api token, 获取一个 api, 通过 api 就 可以接收。刚才代码就可以直接发送了,因为这是基本的发送,就是邮件题, 然后各各接这个类,然后发送就完事了。学工脚本也准备好了。呃,读取 pdf, 读取文本,读取压缩包,创建邮件对象,然后后面就发送 收到的格式,类似这样子,这样的话,群发什么的都会很方便了。然后如果你接集成到你自己的服务器上,呃,有什么事情出发了,就可以用邮件来提醒用户, 是很很好用的。下面的话就是 smtp 协议的话,就不详细展开介绍了,刚才是基于 a p r 发送的,也可以基于 smtp 协议发送的,但这个协议相对复杂,不太建议使用。 下面也有那个对比说明,想要这个文档的可以在视频下方呃,评论区留言邮箱,到时候会把这个 pdf 教程发给你们。 呃,最后的话看一下这个网,网站也我们看一下吧,这个三点夺命,这里一个夺命, 然后这里的话就是 d n 的 解, d n s 解析,把这解析复制到玉米服务器解析一下啊,就 ok 了。然后到三停的时候获取一个 a p r 头腾, a p r 头腾就可以使用刚才代码进行发送了。

拍档的 request 库让我们可以通过拍档代码去构建和发送 http 请求。首先呢,由于这个库是第三方库,并不是拍档自带的,我们要先安装它。 打开编辑器,在终端输入 pip install requests。 如果是 mac os 系统的话,可能要输入 pip 三 install requests。 如果执行后有一行显示 successfully installed request, 说明已经安装成功了。如果显示 requirement already satisfied request 已某某路径,说明你之前安装过 request, 也无需再安装了。 但如果显示找不到配,说明你的电脑上还没有配不这个拍档包管理工具,你可以去到这个网页,按照针对不同操作系统的指引进行安装,然后再用配 安装 request。 安装成功以后,咱们就可以在拍档程序里引用和使用这个库了。引用就用 input 语句,使用的方法非常简单,我们想发送 get 请求,就是 request 点 get 这个函数参数传入 u r l。 需要注意的是,我们平时在浏览器地址栏输入网址时,前面的协议名比如 h t t p 或 h t t p s, 不需要我们手动打进去,浏览器会我们自动加上。 但在代码里作为参数传入时,我们需要手动包含前面的协议名,才能构成一个完整的 url。 如果你把 get 返回的东西 print 出来,可以发现它是一个 response 类的实力,代表着服务器发回给我们的响应。响应实力包含的属性有, status code、 g、 http 状态码。如果状态码等于二百,说明请求成功。如果是四零四,你就得检查一下传入的 ul 是不是有问题,因为状态码表示资源不存在,我们在请求成功时,相应题里面才是我们想要的信息,所以需要根据状态码判断到底成没成功。 但相比用状态码一个个范围去判断,更简单的方法是,我们可以用 response 类的 ok 属性,如果 ok 属性为处,说明请求成功,否则说明失败,代码会简洁很多。那如果请求成功,我们想查看响应题里面服务器返回的内容。 response 类的 tax 属性会以字符创储存响应内容,所以我们可以直接通过它获取。你可以用 h d t p books there to script 点 com 这个 u i 我自己试试。这是一个专给练习爬虫的网站,请求成功的话, respons 实力的 tax 属性打印出来会长这样。你可能说,什么玩意,这都是,这些都是网页的圆满。下个视频我们会了解 h t m l 结构,到时你就能看懂这些乱七八糟的东西了。 总之呢,通过这短短几行代码,我们已经成功获取到网页的内容,完成爬城流程里的第一步了,鼓掌! 这里再说一些关于 request 的补充内容,上回书说到 h d d p 请求的请求头会包含一些给服务器的信息,我们用 request 库的函数发送请求时,这些信息会自动被生成,不需要我们手动传入。但如果我们想指定某些信息进行更改的话, 可以额外传入一个叫 hades 的参数,它的数据类型是字典里面的各个兼职队,就对应了我们要传入的各个信息。这在什么情况下有用呢?一个例子是可以帮我们把爬出程序伪装成正常浏览器, 咱们正常用浏览器浏览网页的时候,浏览器会发送 get 请求,并且请求头的 user agent 会自动带有浏览器类型及版本,还有电脑操作系统等。 用代码发送请求的话,就不会带有这些浏览器相关信息。服务器可以通过这点判断进来的请求是来自浏览器还是程序。 有些网站只想服务于真正的用户,所以会根据 user agent 拒绝来自程序的请求。这种时候可以通过篡改 head as the user agent 的属性,把大 码发送的请求伪装成浏览器请求,你学会了吗?下个视频里我们会一起实践。通过发送盖的请求拿到豆瓣电影 top 二百五十网页的原码,我们稍后见。

开放零基础开始学第三章六点一,异常的产生与分类,对了,我已经把自己亲测有效的拍脏全套学习资料整理成了精简资料包, 无偿分享,有需要的可以找我领取。那什么是异常呢?好,那这边其实我程序再去运行的过程当中产生的那些报错,是吧?其实就把它称作是异常。 好,那这边我们说程序一旦报错了,那是不是这个程序就不可解决了?或者说我们就要去回到这个代码去编辑程序呢?其实不是的,那这样我们当程序遇到异常的时候呢,咱们还是可以对异常进行补货,并且进行处理的。 那这里边呢,我们要想去补货啊,咱们就要了解异常这个东西。那咱们先来看啊,什么是异常?那异常呢?有哪些分类? 那什么是异常呢?其实对于 python 来讲,异常是指 python 在 解释 过程当中啊,有时候我们执行程序的这个时候,那出现错误的一种管理机制啊,你看它叫管理机制是吧?那其实就说明啊,它已经知道会产生这样的问题了。那,那知道这样的问题的时候呢,我们其实就可以对它进行相应的处理。 好,那当你错误的被监听到的时候,那这边他会引发异常。好,那引发异常的时候呢,我们的代码就会中断掉了,这边也就是我之前给大家演示的,那咱们再去编写循环的时候,一旦遇到, 咱们当时叫做错误,是吧?好,一旦遇到错误,那这个代码就会终止了,那错误后边的程序呢?也不会被执行。好,那现在呢,我们就知道他有一个更专业的名词叫做异常, 那这时候的话呢,我们说出现了异常,他到底能不能继续向下执行呢?就在于你对他的一个管理机制上面,是吧?好,那异常我怎么来去理解他呢?那他是不是一种现象呢?其实不是的,对于 python 来讲也是一种对象, 那我们知道在面向对象编程里边啊,只要他是一个对象,我们其实就可以对他进行相应的处理了,是吧? 好,那在这里面的话,我们说了,是不是所有的这个异常都能处理呢?来,在这里面告诉大家,有一个异常是处理不了的,这叫什么呢?叫做 system exit。 好, 其实通过他的名字你也就知道了。那这个异常是什么?是我们的程序退出是吧? 啊?那这边程序已经退出了,那这边你就没有办法通过异常来去阻止它,那这除了它之外的话呢?那这边异常没有被完全处理的时候,那其实都会打印这个信息啊,那现在我们对错误又有了一个更深层的认识,是吧? 啊?那所有产生的这些错误,我们能够看到的,那其实都叫做异常。那在这里呢,有一场是没有办法让我们直接去处理的,那就 system exit。 那其他的这个异常的话呢?那在里面如果能够处理的话呢,其实是可以不去打印这信息的,那只有在你没有进行处理的时候,或者没有完全处理的时候,他才会把这个信息报给我们的软件的开发人员。 那这里边比如说像一除以零啊,除零这个异常是吧?好,他会怎么写呢?他会告诉你啊,我们这个异常发生在什么样的位置? 那咱们这个发生在什么?在我们的交互式的输入位置,那如果是我们的一个代码文件的话呢,会显示他会发生在哪一行,在什么样的这个模块里发生的这个位置啊?那这边通过这个异常的时候,你就知道哦,我的程序在第几行什么样的模块里面出现了一些什么样的错, 那这边出现了这个具体的错误的原因啊,我们这边还可以看到,是吧?他叫做除零错误啊,那边给你去解释一下,什么叫做除零错误呢?就是我们在计算的时候,哎, 除数是零了,对吧?那其实你通过这个异常的这个回溯的信息啊,你可以知道哦,这边是出现了一个什么样具体的错误,这具体错误是出在哪里? 那异常有没有分类呢?哎,其实也是有分类的,那咱们说了异常也是一种类,是吧?那既然它是一种类,我们就知道了,它其实啊也是有什么有父类和子类的, 那所有的内置的这个异常都会有一个基础的类,这个类呢叫做 base exception, 那这个类的话呢,往往是用来作为什么呢?作为我们的一个继承关系的,就是它变成一个树形的这个结构啊,咱们是有树根是吧?有树枝,有树叶,那这个 base ex 啊, exception 就是 我们的树根。 好,那在这个树根上长出来的这些其实就是什么呢?就是我们的这个各种各样的异常,所以这个鸡类我们一般都不直接使用它, 那我们如果想要去什么呢?去使用这个异常的时候,那这边我们可以啊自己定义一些异常,是吧?那这个自己定义的异常就是一般都是从什么呢?鸡类上面的这个 exception, 通过这个类啊,我们来去做的一个集成。好,那这边要注意所有内置的非系统退出类的异常都会派生在这这个类上面, 比如说虽然上边这个是树根,但是我们都不从上边的来去实际使用啊,这是最基本的一个类,是吧?哦,那往往都是把什么呢?把我们的这个 exception 作为我们的副类,那甚至你自己去定义的一个异常,比如说你编写一个什么除以五异常。好,那这个异常呢, 继承的时候也应该从这个一 seven 去继承。好,那这边我们的这个异常的积累其实还有其他的,那这些积累的话呢,我们也是不建议大家去直接继承的。好,这边关于他们的话呢,你可以去详细阅读,同时呢我给你去提供一个 基于异常的这样的一个官方网站的这个网址,你可以打开它呢,来去看一下我们怎么来去定义的这些异常的这些积累。 那这些鸡类的话呢?都指什么样的这个功能?那了解了鸡类之后,我们就说了,那当你想要去定义类似的这些异常的时候,我们其实就可以什么呢?一个是从一个 section 来去继承,另一个呢我们可以去继承它们来去完成一些比较简单的这些基础的这些异常判断。 好,那在这呢,我给你去看一下异常的这个层次结构图啊,那其实异常的这个树根就是它 啊 base exception 来积累,那这边在它下面有一个最关键的叫做 exception, 是 吧?这个类,然后呢?咱们去自己编写的这些类啊,往往去什么的都使用的是这个 exception。 好, 那这边除了去继承之外,我们说了咱们去补货这个异常,哎,就我们发现这个异常之后,我们想补货。好,那这边我们其实也可以什么来使用这个 exception 来去进行补货。

我接手了个好几手交接的项目,要做一款游戏按键红工具。客户需求看着简单,实则超有挑战,不仅得在目标游戏里稳定跑起来,还得精准模拟真实物理按键的发送。不过难点很明确,这款游戏的反自动化限制特别严格。 哼,听同行说,常规模拟输入方案全试过了,全失效了,而且客户明确禁止修改程序和内存,这就有点考验技术选型了。 所以我的第一步是先把这些未知限制摸透。特意做了套测试方案,用拍访 c、 十二 c 夹夹和 a、 h、 k 四种主流工具各搭一个极简黑盒。测试程序不深,爬内部实现核心,就验证能不能在游戏里成功,发一个基础按键指令。 要是这轮测试全翻车,那用户态模拟肯定行不通了。嗯,得转向驱动或内核系方案才行。现在四款测试代码程序都准备就绪了,马上进入实战验证阶段。 我们先从开嗓开始测试。我用拍嗓调用了好几种发送方案,先在记事本里测试了一下。嗯,可以看到这些方案都能正常发送按键呢。而且刚才也看到 e、 v、 c 提权动作正常工作了。目前在记事本环境下, 这些派方方案和提权功能都是没问题的。接下来就该看看他们在游戏里的表现了。 好啦,我已经切换到游戏界面啦,先调整下按键设置,让它和我们预设的随机按键区间匹配好。 接下来先试试手动按键的触发效果,确认下如果发送成功,游戏会有什么反馈, 准备开始测试了。 测试完啦,结果有点小遗憾呢, 测试发送期间,游戏完全没有任何反馈。嗯,看来这些拍丧方法都被游戏限制了, 不过没关系,嗯,我们再换其他方案继续测试。好,接下来是大名鼎鼎的 a h k, 它可是很多红工具的鼻祖呢,现在即使奔离试试水,嗯,还是一如既往的给力,按键发送稳稳的。不过嘛,有了拍丧的前车之鉴, 我对他在游戏里的表现先不力发给,直接上游戏。 果然,游戏画面纹丝不动,看来也被房子动画系统盯上了。 没关系,我们还有新事儿,作为文档学生支持的正统语言,说不定能带来惊喜。 我这里已经准备好了翻译好的 e x c 程序,双击启动记事本,测试环节 完美通过。好了,终极考验来了,切换到游戏。 唉,游戏角色还是一动不动,这结果也太让人心痛了吧,现在只剩下最后的希望,习家家了。唉,这可是我们压箱底的方案,能不能偷懒成功就看它了。 我得深吸一口气,起动, 现在记事本里跑一下。 哇, postmessage 方案居然在记事本里都完全发不出案件啊,这也太搞了吧。还好,其他几个习家家方案在记事本里表现正常,这可是第一个连记事本都搞不定的方案。嗯, 太离谱了。嗯,突然有种不祥的预感,算了,还是进游戏实测吧。 唉,果然游戏里还是完全没反应。 不行,我得换个思路试试游戏里的输入框。嗯,看看光标闪烁的情况 啊,等等,这是什么情况?居然可以在聊天输入框里正常输入, 但是游戏角色的操作还是完全没反应。原来如此,看来这款游戏的操作系统和聊天系统用的不是同一个输入接口,这限制系统也做的太过分了吧啊, 看来用户他的模拟是彻底行不通了。嘿,偷懒失败啊,可恶啊,只能上驱动或者内核机的方案了。

那么好啊,今天演示一下嵌入式的中断处理。嵌入式系统内核通常在执行一个无限循环的主程序, 假如外部我们进行操作,硬件产生一个中断请求,发送给中断控制器, cpu 检测到中断,立即暂停当前的主程序执行, cpu 自动将当前的寄存器状态向下纹保存到占内存中, 这样 cpu 以后才能记得回到哪里继续工作。 cpu 读取中断向量表,找到对应的中断服务程序地址。现在 cpu 开始执行高优先级的中断服务程序,紧急任务处理完毕, is 二执行结束, cpu 从站中取回之前的上下文,上下文恢复如初, cpu 回到主程序被打断的地方,主程序继续运行,仿佛什么都没发生过。这就是嵌入室内核的中断处理机制。

智能融合这个概念有点抽象了,它具体是怎么实现的?靠不靠谱啊?问得很专业啊。 jelly wave 的 智能就体现在这三项核心的神迹上。第一,智能聚合与调度。 他能同时使用你的多条网络,像智能分配任务一样发送数据,实现贷款一加一大于二的叠加效果。最关键的是,其中一条万一中断,另一条也在毫秒其无缝的顶上,业务上其实完全无感。第二,前向纠错。 面对卫星或移动网络这种容易丢包的场景,他会主动多发一份荣誉的信息接收端呢,即使丢了包也能自己算回来,无需等待重传,从而从根治卡顿和高延迟。第三,全站可观测, 所有列录的实施质量优化效果都在面板上一目了然。运维从盲人摸象变成一目了然。排障呢,再也不用抓瞎了。这三班舞下去,再弱的网络组合也能变得非常的抗打。

早上自动生成昨天的 excel 销售报表,中午批量下载表格中的图片链接,下午定时发送工作小节邮件,晚上收到一份意外交易的结果签单。无论是 excel 表格处理还是日常的办公操作,都可以通过拍摄实现自动化。 你可以把每天的店铺销售数据使用 passin 写好自动化分析流程,这样就可以实现从数据下载到最终发布数据分析报告的全自动操作,同时还支持定时任务。如果每天凌晨两点让程序自动给老板发送隐私药表,奋斗青年就是你啊! 热门拍摄自动化办公实战课采用图文和音频讲解,包含零基础拍摄办公操作手册、三十个自动化办公提效案例和一套实用的办公效率方法论。你准备把什么工作自动化?评论区来聊一聊,你学会了吗?


你有没有想过一个问题,就是我们每天刷的那些手机 app, 逛的那些网站,他们背后那些海量的数据到底是从哪来的?又是怎么做到实时更新的呢? 好,要回答这个问题啊,咱们得先来揭开一个秘密,一个藏在所有这些现代应用背后的架构秘密。 其实现在开发软件啊,都流行一种叫前后端分离的模式,你看我们手机上、电脑上能看到的这些精美的界面,这叫前端,他的主要任务就是负责展示漂不漂亮,好不好用。但他自己呢,其实不存储,也不处理复杂的数据。 那数据在哪呢?就在后端,也就是一台台的服务器里,前端需要数据的时候,就会通过一个统一的接口,也就是 api 去向,后端要后端只管提供纯粹的数据,根本不操心前端长什么样。 哎,这个 api 是 什么呢?我给你打个比方,它就像是餐厅里的服务员,咱们用户操作的前端就是顾客,而存着数据的后端服务器就是厨房。 那 api 呢?就是这位服务员,顾客前端想点菜,就把需求告诉服务员 api, 服务员再把菜单传给厨房,后端厨房把菜做好之后,再由服务员给端上来。这个过程里的服务员就是 api, 而它用来沟通的地址,通常就是一个我们很熟悉的网址,也就是 url。 那 么问题来了,这个服务员在前端和后端之间来回跑,它说的是什么话呢?它总得有一种大家都能听懂的通用语言吧? 咱们来看看互联网世界里的这门通用语。这门通用语啊,就叫 http 超文本传输协议, 你完全可以把它理解成整个互联网世界的普通话,不管你是浏览器还是 app, 也不管服务器是什么系统,只要大家说的都是 http, 就 能毫无障碍地沟通。 整个交流过程其实很简单。你看这张图,左边的客户端,比如说你的浏览器,它想看个东西,就会用 http 协议向一个 url 地址发出一个请求, 右边的服务器收到了,处理完之后,同样用 http 协议把内容打包成一个响应,再发挥给客户端,一来一回,一个完整的交互就结束了。 如果我们把这个请求和响应拆开来看,就更有意思了。不管是请求还是响应,它里面都分成几个部分,最上面是请求行或者状态行,告诉对方你要干嘛,或者事情办得怎么样了。 中间呢,是一堆头姓习,就好像是快递单上的备注,写着一些额外的信息。最重要的是下面的主体部分,这里面装的才是咱们真正要传输的数据。在所有这些 http 球球里头啊,有两种,最最常见的,一个叫 get, 一个叫 post, 怎么区分呢?很简单, get 请求就像是你记一张明信片儿,想说的话直接写在明信片儿上,地址栏后面都能看见,而且能写的地方也有限。 而 post 的 请求呢,更像是一个快递包裹,你可以把很多很多东西都安全地打包在箱子里,外面只贴个地址就行了,别人也看不到里面是什么。 好了,有了前面这些铺垫,了解了 api 和 http 这些基本概念之后,咱们今天真正的主角终于可以闪亮登场了,它就是专门用来打造我们刚刚说的那些 api 的 一个现代化神器。 没错,它就是 fast api。 简单来说,它是一个用 python 语言写的性能超高的 web 框架, 它的使命只有一个,就是让你能够又快又好地构建出 api。 如果你想用 python 来创建我们刚才说的那个餐厅服务员,那 fast api 绝对是目前最顶尖的选择之一。 为什么大家现在都这么喜欢用它呢?首先,它快,性能快的能跟 node js 甚至够语言掰手腕。其次呢,它让你写代码也变得特别快,代码量少,还不容易写重复。 最关键的是,它特别智能,你在写代码的时候,它能给你各种提示,帮你检查错误,这一下子就能减少很多人为的失误,让你的程序更稳定,更可靠。 听起来是不是很厉害?那 fast api 这些超能力到底有多强呢?咱们别光说不练,直接上数据,看看它背后的技术到底牛在哪儿? 你没看错,就是这么快!章,按照官方的说法,用发 cpi, 你 的开发速度最高能提升三倍,为什么能这么快?因为它会自动帮你生成交互式的 api 文档,还会给你非常棒的代码提示,你再也不用花大把时间去查资料和调试了。 这个数字也同样惊人, fast api 强制你使用 pi 的 类型提示,这意味着很多潜在的 bug 在 你写代码的时候,编辑器就会直接给你标出来, 这样一来,由人搞出来的错误就能减少将近一半,这对任何一个项目来说,都意味着质量的巨大提升。 那么, fast api 的 这些超能力是哪来的?它可不是凭空变出来的,它聪明就聪明在它是站在了两个巨人的肩膀上,它把 starlight 和 padenta 这两个顶级的库完美地结合了在一起。 其中 starlight 负责所有跟网络通信相关的事,保证了它的高性能。而 padenta 呢,则负责所有跟数据校验相关的事,保证了数据的准确无误。 那么 fast api 是 怎么把这些强大的能力组织起来,让我们能写出特别清晰好懂的 api 呢? 这就要说到一种非常流行的设计风格了,它就像是一张通用的 api 设计蓝图,这种设计风格啊,就叫做 rest。 rest 的 核心思想其实很简单,就是把后端的所有东西都看作是一个个的资源,比如一个学上一篇文章,一个商品,这些都是资源, api 的 url 地址就应该直接指向这个资源。那我们到底要对这个资源做什么操作呢?是想新增、删除、修改,还是查询?这个就由咱们前面说的 get post 这些 http 方法来决定。 你看这张表,一下子就明白了,我们操作的资源始终是学生,也就是 url 里的杠 student 杠。想创建一个新学生,好,那就用 post 的 方法。 想看看所有学生的列表,那就用 get。 如果想操作某个特令的学生,比如一号学生, url 就 变成了杠 student 杠一,然后不管是想看他的信息还是修改,甚至是删除他,都用这个 url, 只是换一下前面的 http 方法就行了, 你感觉一下这个结构是不是特别清晰,特别有条理。所以你看咱们从最底层的 http 协议,到上层的 restful 设计风格,再到 fast api 这个具体的工具,其实它们的目标都是一致的,就是为了让数据的交换变得更简单、更高效、更规范。 而 fast api 呢,就是把所有这些最好的实践都给你打包好了,让你能够用最快的速度、最可靠的 api。 那么当构建一个强大后端服务的门槛被像 fast tpi 这样的工具大把降低之后,我们每个人都应该问问自己,有了这么好的锤子,你想去创造一个什么样的世界呢?你的下一个绝妙点子会是什么?