每天一点Python小知识
文章平均质量分 71
Python小知识的讲解,侧重于语言本身的小知识点,不涉及开发框架,适用于python的初中级使用者
__空无一人__
通过我的文章认识我!
展开
-
python中什么样的数据类型是可散列的?
像其他的可变collection类型,如列表、集合和字典都是不可散列的,因为这些对象它们的内部状态是不稳定的,它们容纳的数据元素的数目是可动态变化的,哪怕它的数据元素都是可散列的,如果根据它们的数据元素来计算它们的hash值,不同状态下,它们的散列值可能是不同的,我们希望一个对象它在的整个生命周期内它的散列值是不变的。如果一个对象是可散列的,那么这个对象在它的生命周期内,它的散列值是不变的 ,而且这个对象需要实现__hash__方法,另外还要有__eq__方法,这样才能跟其他键比较。原创 2024-04-28 16:01:10 · 407 阅读 · 1 评论 -
python中的元类
上面说了类是类的实例的模板,所以你看类的__new__被定义为一个绑定的类方法,类本身是作为方法的第一个参数,一般命名为cls,一般情况下,__new__不需要其他的参数,__new__根据cls来产生一个实例,__new__返回产生的实例,也有tuple等少数例外__new__需要额外的参数,绝大多数情况是不需要的。正如类是类的实例的工厂,元类则是类的工厂。不过这两种关系还是有所不同,类是类的实例的模版,但元类不是类的模版,元类更像一个纯粹的类的组装工厂。原创 2024-04-25 18:15:23 · 949 阅读 · 1 评论 -
python中的抽象类
抽象类是抽象层次上的对象类型的一个定义,该对象类型往往是由许多具体的对象类型提取共性而得到的一个概念,它预定义了一些属性和方法(状态和行为),其中一些方法没有给出实现(抽象方法),而必须由子类来实现,这样的类就是抽象类。python2.x里没有语法特性意义上的抽象类,也就是没有抽象方法,也不存在类不能被实例化,但逻辑意义上的抽象类很普遍,比如我们定义一个类,里面有几个方法没有给出具体实现(你直接实例化它什么也干不了),然后需要定义子类对其进行实现,这个类其实就是抽象类。python中的抽象类。原创 2024-04-25 09:41:58 · 610 阅读 · 1 评论 -
python中一个类是另一个类的子类的三种情形
注册一个类为另一个类的虚拟子类,通过调用另一个类的register方法,check的时候issubclass调用另一个类的__subclasscheck__,里面的逻辑一目了然,有兴趣的读者可以自行阅读。指定一个类是另一个类的虚拟子类,通过调用另一个类的类方法register,这个方法在类的元类ABCMeta里面定义,也就是要求另一个类必须指定它的元类是ABCMeta才行。举例来说明,类Sized实现了一个特殊方法__len__,我们定义一个类B,它也实现了__len__,那么类B是类Sized的子类。原创 2024-04-24 17:32:16 · 1161 阅读 · 1 评论 -
python的对象层次结构的树图展示
基类attrs用来记录树的一个结点的一些特征,它的name属性将被打印到树的图形中,它代表树的一个结点,它的firstchld属性表示自己是否是父结点的第一个孩子,它的lastchld属性表示自己是否是父结点的最后一个孩子,它的allchlddrawed属性表示自己的孩子结点是否已经全部绘制完毕。这里修改了一下,实现了一个基类,实现了一个子类用以打印类的继承关系图,供大家参考。要实现其他的树对象的打印,只需要同样实现基类treemap和attrs的子类,对上面的代码稍做修改就可以。原创 2024-04-18 12:52:26 · 743 阅读 · 1 评论 -
python中的异常和traceback
python里的异常是一个对象,和其他的对象一样,没有什么特殊之处,不过异常对象是用来表示程序中的错误的,所以它往往带有一些表示程序的错误信息,python中的异常,有的是解释器在执行指令的时候检查出来而抛出的,有的是程序里异常流程raise出来的,还有是语言语句本身抛出来的,像生成器终止时候抛出来一个StopIteration异常,程序里可以使用try/except/finally语句来捕获处理。traceback对象从何处获得呢?调用sys.exc_info()可得,下面给出一个简单的例子。原创 2024-04-17 17:18:37 · 984 阅读 · 0 评论 -
彻底理解异步生成器
python 3.5之后,以async def定义的函数是协程函数,调用它生成的协程被称之为native coroutine,在之前都是把生成器函数装饰一下得到一个协程函数,调用它生成的协程是旧式协程,当然生成器、旧式协程和native coroutine本质都一样,但是当我们说到生成器和协程的时候,侧重的是它们的使用场景的不同,生成器侧重的是迭代式得产出一个个值,生成器就像个producer,调用生成器的是consumer,而协程是作为一个轻量级的线程来使用在异步编程领域,所以有必要把它们区分开来。原创 2024-04-17 15:38:39 · 1025 阅读 · 0 评论 -
关于yield from的深度剖析二
谈一下yield from递归,它看起来不像普通函数递归那么直观,如果我们把调用过程用一棵树来表示,得到一棵调用树,yield from调用作为中间结点(非叶结点),yield语句是访问结点的动作,执行生成器yield from语句就是由一个结点下降它的一个子结点上,执行生成器的return语句或者后根遍历执行完yield语句,就是由一个结点回溯到它的父结点,所以基于yield from实现树的遍历就很方便了。下面给出一个基于yield from实现的遍历访问UserList类型树的算法。原创 2024-04-16 11:00:26 · 277 阅读 · 0 评论 -
关于yield from的深度剖析一
yield from并不是被设计用来充当一个数据的流动通道,那只是它的表征而非实质,以我的理解yield from设计初衷是用于把一些基础的功能(生成器代码)组合起来以实现更复杂的功能(生成器代码),yield from表达式的内部逻辑是以一个循环来调用尽子生成器,以捕获一个StopIteration异常为结束,并以StopIteration的value属性为表达式的结果。2)可以实现一个委托生成器(带yield from的生成器),委托生成器在它的调用者和子生成器之间充当一个管道/桥梁。原创 2024-04-15 15:21:48 · 505 阅读 · 1 评论 -
谈谈python里的协程
任意的两个协程coroutine a和coroutine b,如果coroutine a不是由coroutine b交换而来,它可能是第一个执行的coroutine,也可能是由另一个coroutine c交换而来,我们把coroutine a交换到coroutine b定义为ENTER,如果coroutine a是由coroutine b交换而来,那么coroutine a再交换到coroutine b,我们把它定义为YIELD。普遍上的定义是说协程是用户空间的线程,也叫纤程,轻量级的线程。原创 2024-04-14 18:10:33 · 380 阅读 · 2 评论 -
关于装饰器、生成器的一些心得
执行的结果是”call f”被多次打印了,原本我的预期是只打印一次,为什么会打印多次呢,按照fib的定义,它递归调用它自己,可是被装饰之后,它递归调用的不再是它自己了,而是inner,因为装饰之后fib被绑定到inner上了。使用装饰器,记住上面的两句话,就足矣,记住,解释器用装饰器装饰一个对象就做了两件事情,首先调用装饰器,作用于它要装饰器的对象,然后把它装饰的对象被绑定的名字绑定到装饰器返回的对象上,就这点事情,没有其他。2)throw一个异常进去,生成器没有捕获异常,生成器终止,异常被抛回来。原创 2024-04-12 19:54:11 · 732 阅读 · 0 评论 -
你有多了解python里的函数?
如果是一个整数,得先得从函数的code object的co_varnames/co_names/co_freevars中以这个整数为index去取得变量名,然后再到对应的namespace中取得对象,如果参数直接是变量名,不是省了一步吗,问题在哪呢,问题在于变量名是个字符串,它的长度是任意的,如果opcode的参数可以是字符串,那么字节码的长度是不固定的,不同opcode的字节码长度可能不同,相同opcode的字节码,因为参数的长度它们的长度也可能不同,解释器拿到一个字节码序列的时候如何去划分指令的边界?原创 2024-04-11 18:41:45 · 1490 阅读 · 0 评论 -
python中的可执行/调用对象有哪些?
看类x的code object里的字节码,它的逻辑也就是把类的__module__、__qualname__、__init__、f等属性对象装入到一个namespace中,可见执行一个类,生成一个类对象,它首先就是在做一个打包工作,把类体里面定义的各个对象打包到一个字典里面,了解元编程的朋友知道,后续python解释器会把它作为参数传入元类的构造函数里,元类调用之后返回那个类对象。大家首先想到的是函数/方法,但除了函数/方法之外,还有其他的对象是可执行/调用的,大家都了解吗?本文将揭开它们的面纱。原创 2024-04-03 13:50:47 · 598 阅读 · 1 评论 -
python中何时使用闭包?
作为一个pythoner,闭包大家都很熟悉,但何时使用闭包?原创 2024-04-02 16:29:19 · 801 阅读 · 1 评论 -
打印目录树
来说一下这个程序的设计思路,要打印目录树,必然离不了对目录树的遍历操作,这里采用后根遍历来访问目录树,一边访问各级目录,一边进行目录树的绘制,绘制图形的时候按行进行绘制。程序的难点在于按行进行绘制,如上图所见,图的一行里除了有目录名称和表示树的分支的--和|-之外,还有大量的空白和单一的|以及换行,为了完成工作,我们需要记住由根目录(树的根结点)到当前访问到的目录(树的结点)的路径,依次访问路径上的结点,进行图的行的绘制。作者是参考进程树的输出样式来设计的目录树的输出样式。原创 2024-04-02 12:49:54 · 535 阅读 · 2 评论