《流畅的python》学习笔
文章平均质量分 70
白日梦想猿
一只会做白日梦的猿!
展开
-
使用__slots__和__dict__来节省空间(简直就是质的飞越,LeetCode亲测有效)
__slots__类属性的作用是指定当前类的实例所有包含的所有属性,注意是所有,就是只能是__slots__所指定的属性,不能包含其他以外的属性,也不能新建属性。在运行的时候,它存在的意义就在于告诉解释器:这个类中的所有实例属性都在这儿了!...原创 2022-07-15 18:04:15 · 228 阅读 · 0 评论 -
python中__init__真的会在__new__完成后执行吗?
大家可能都知道,在python中创建一个对象的流程是:首先调用__new__方法创建一个实例,然后再调用__init__方法初始化这个实例对象。这个是常规的思路,也没有什么问题。原创 2022-07-15 14:49:53 · 510 阅读 · 0 评论 -
python中的property,以及属性和特性之间的优先权
直观的看,特性的目的好像是把方法“属性化”,但这样做一点意义也没有,如果我可以定义一个属性,何必再额外定义一个方法,然后将其转化成属性呢?所以,更重要的目的就是应对一些特定场景。 从特性表现出来的性质和行为来看,它其实就是一种特定的“属性”。只不过特性的权利提升了一点点,就好像你可以去修改这个属性,但是能不能修改成功,就看你的上一级允不允许你修改(有没有给你这个属性添加限定条件),而特性的权利就扩展到了这个“上一级”。......原创 2022-07-14 17:50:05 · 606 阅读 · 3 评论 -
以爬虫为例,单线程,协程,线程,进程之间性能的比较,原来协程可以这么快?
前言因为刚刚学习到了协程,然后之前也对爬虫有一定的了解,所以打算结合之前学的线程和进程,和协程进行对比,看看它的性能到底有多高,在测试完成后,结果还是不错的!下面就直接上代码了,因为代码逻辑都比较简单,我就不一一解释了,重点是看测试结果,真的很让人兴奋!!!案例我这里以爬取一个网站上的所有国家的旗帜为例。(下图为爬取结果,共192张)分别利用了单线程,协程,多线程,多进程进行爬取测试。线程的效率真的已经很高了,但是协程居然比它还高!!!定位旗帜的url我这里使用的xpath对原创 2022-05-01 21:20:04 · 737 阅读 · 0 评论 -
上下文管理器和with块
文章目录前言 一、上下文管理器是什么? 二、使用步骤 1.上下文管理器的实现方案一 2.上下文管理器的实现方案二 总结前言相信很多小伙伴在对文件操作,或者锁的操作时会经常用到with语句,因为使用它给我们带来了极大的便利,比如在文件操作中,使用它,你再也不用担心你的文件在使用完成后没有关闭;在锁的操作,你也再也不用担心开了一把锁而忘记关闭造成死锁等现象...总之,它会给你做好一切“善后”的事情哈哈哈哈(这个比喻可能不是那么恰当)提示:以下是本篇文章正文内容,下面案原创 2022-04-23 16:53:17 · 489 阅读 · 0 评论 -
else用法的一个小细节
前言在python中,大多数情况下,else都是配合if语句使用的,逻辑很简单,如果if的条件满足就执行if中的子句,否者(else)执行else中的。但是偶然也看到配合循环语句使用的else比如下面这两个栗子:# 循环只有正常结束才会执行elsefor i in range(10): print(i)else: print('循环正常结束!')i = 0while True: print(i) i += 1 if i > 2原创 2022-04-23 16:20:14 · 723 阅读 · 0 评论 -
python中iter()的高阶用法
前言众所周知,在python中,iter()函数的功能是:接受一个可迭代对象,将其转换成一个迭代器。举个栗子:a=[1,2,3]a_iter=iter(a)print(a_iter)print(next(a_iter))print(next(a_iter))上面就是iter()的一般用法。iter()的高阶用法但是,iter()还有一个更好玩的用法!简单做一下描述:传入两个参数:使用常规的函数或者任何可调用的对象创建迭代器。这样使用时,第一个参数必须是可调用的对象原创 2022-04-18 10:33:50 · 5883 阅读 · 0 评论 -
python中可迭代的归约函数,功能这么强,你能不爱? ? ?
相信学习python的小伙伴都用过这些函数,但是它们的功能真的太强了,还是忍不住把它们总结记录一下!!!import functoolsimport itertools# 归约函数:接受一个可迭代对象,然后返回单个结果的函数。# all(it)# it中的所有元素都为真时返回True,否者返回Falseprint(all(range(10))) # 因为出现了0,所以返回False# any(it)# 只有有一个元素是True就返回True,否者返回Falseprint(any原创 2022-04-18 10:16:33 · 227 阅读 · 0 评论 -
python3.3中出现的新语法:yield from,有点强?
前言我们知道,一个函数中,如果出现了yield关键字,那么它一定是一个生成器函数!那yield from又是个啥?不知道小伙伴有没有看过我上一篇的:标准库中的生成器函数,其中就讲到过一个生成器函数:itertools.chain(),它的功能就是将多个可迭代对象无缝连接在一起!功能看上去不是很复杂,要不我们自己实现一下试试?# 例:自己实现chaindef my_chain(*iterable): for it in iterable: for i i原创 2022-04-18 10:07:47 · 282 阅读 · 0 评论 -
python标准库中的24个生成器函数,个个都超级厉害,你用过几个?
前言标准库提供了很多生成器,有些是内置的,有些在itertools和functools模块中,下面我们就按照它们的功能进行分组来看看它们吧!用于过滤的生成器函数import itertools# itertools.compress(it,selector_it)# 并行处理两个可迭代对象,如果selector_it中的元素是真值,产出it中对应的元素print([i for i in itertools.compress(range(10), [0, 0, 1, 1])])#原创 2022-04-18 09:45:18 · 900 阅读 · 0 评论 -
《流畅的python》学习笔记之可迭代的对象,迭代器和生成器
前言可迭代对象,迭代器,生成器,不知道大家第一眼看到这几个名词的时候,有没有一种很熟悉的感觉,然后在脑子里飞速找寻这几个词之间的差异,但是找了半天,似乎没有找到,并且让原本清晰的概念变得模糊了。反正我一开始有这种感觉,不过现在看完这一章的内容,好像还是有点晕哈哈哈,不过还是乘热打铁,在复习巩固一边,应该会清晰一点!首先我们来看一下各自的定义,这里我会参考书上的内容然后结合自己的理解来定义这三者。可迭代对象首先我们可以问这样一个问题:什么是可迭代对象?这个可能比较抽象不好理原创 2022-04-18 09:28:23 · 383 阅读 · 0 评论 -
《流畅的python》学习笔记之多继承下同名方法的调用顺序
python的多继承有一个天坑你知道吗???都知道python是支持多继承的,既然支持多继承就会有一个问题,如果继承的多个父类中含有同名的方法这么办?作为第一门实现多继承的流行语言c++是使用类名限定方法调用来避免这种歧义的。在《浅谈c++》一文中有记载:那么在Python中也是不是可以采取这种方式呢?来举个栗子看看吧!# 在多重继承的情况下,如果继承的父类中有同名的方法,在子类中调用时,会根据__mro__中的调用顺序原创 2022-04-07 18:37:06 · 2089 阅读 · 0 评论 -
《流畅的python》学习笔记之python是什么类型的语言?
讨论类型时,最好考虑两条不同的坐标线!强类型和弱类型如果一门语言很少隐式转换类型,说明它是强类型语言。如果经常这么做,说明它是弱类型语言。其中,java,c++和python是强类型语言,php,JavaScript和Perl是弱类型语言。弱类型JavaScript会进行隐式的类型转换: console.log(''=='0'); console.log(0==''); //true console.log(0=='0'); //ture强类型python在相同的比较中则不原创 2022-04-03 16:33:34 · 1000 阅读 · 2 评论 -
《流畅的python》学习笔记之偏心的python?
一些"蹊跷"的对象不知道大家有没有想过为什么有的对象可以使用for循环进行迭代,可以使用in判断它是否包含某个元素,可是使用索引进行取值.....没错,答案就是这些对象实现了支持这些操作的特殊方法!比如,实现了__iter__方法,就可以对该对象进行迭代操作。class MyList: def __init__(self, *args, **kwargs): self.li = list(args)if __name__ == '__main__':..原创 2022-04-02 12:28:36 · 774 阅读 · 0 评论 -
《流畅的python》学习笔记之对象引用,可变性和垃圾回收
引用式变量不知道大家对python中的变量是怎么理解的?假设有如下代码,怎么理解a和b的关系?a=1b=a没错,正确的理解为第二种,在python中定义一个变量时,并给它“赋值”,其实你并没有真正的把值给它,而是在这个值上贴了一个标签而已,以后看到这个标签就知道是这个值啦!我们通过id()来验证这一点:因此,说python中的变量是引用式变量再确切不过了!在==和is之间选择==运算符比较的是两个对象的值,而is比较对象的标识。下面的这个例子很好的说明了..原创 2022-03-24 21:34:20 · 771 阅读 · 0 评论 -
《流畅的python》学习笔记之函数装饰器和闭包
定义首先来看一下它们各自的定义闭包: 闭包 指延伸了作用域的函数,其中包含函数定义体中引用,不在定义体中定义的非全局变量。函数是不是匿名的没有关系,关键是它能访问定义体以外的非全局变量。个人理解:在例:利用闭包实现一个动态求平均值的功能# 闭包指延伸了作用域的函数,其中包含函数定义体中引用,同时包含不在定义体中定义的非全局变量。# 关键是它能访问定义体之外定义的非全局变量!!!# 利用闭包实现avg(num):计算不断增加系列值的均值def make_avager():原创 2022-03-22 18:58:17 · 1245 阅读 · 4 评论 -
《流畅的python》学习笔记之为什么高手在做增量操作时,不选择tuple,而选择list?tuple就已经输在了起跑线上?
tuple输在了哪里?平时在用list和tuple做增量操作时,仿佛也察觉不到有啥区别,但是,当数据量变大时?差距是不是就出来?先看一下测试代码:from time import timea = [i for i in range(3*10**7)]b = tuple(a)print(f'增量操作前a的id={id(a)},b的id={id(b)}')start=time()a *= 2mid=time()b *= 2end=time()print(f'增量操作后a的id={原创 2022-02-14 14:32:08 · 558 阅读 · 2 评论 -
《流畅的python》学习笔记之我们常用的列表list和元组tuple还有这个秘密?
不知道大家在学习python中数据类型的时候,在学到tuple和list的区别时,是不是想到的第一句话就是list是可变数据类型,tuple是不可变数据类型,我就猜到了,你想到的肯定是这个嘿嘿,但其实还有一个你不知道的不为人知的秘密!!!!原创 2022-02-13 22:09:41 · 638 阅读 · 2 评论 -
《流畅的python》学习笔记之__repr__和__str__之间的区别,len()方法有个不可告人的秘密你知道吗?
关于len()方法你不知道的秘密?在使用len(x)方法获取x的长度时,如果x是python的内置类型(比例list,tuple等),那么len(x)的速度会非常快!背后的原因是Cpyhon会直接从一个C结构体里读取对象的长度,而不是调用__len__方法!所以说,len()方法为python的内置类型开了一个”后门“。原创 2022-02-12 21:02:33 · 531 阅读 · 6 评论