python
文章平均质量分 63
python
大学要有梦想
求offer鸭
QQ:1257960165
展开
-
Design Patterns - Template Method
Template Method(模板方法) — 类行为型模式定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。TemplateMethod 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。适用场景一次性实现一个算法的不变部分,并将可变的行为留给子类来实现。各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。也就是重分解以一般化。首先识别现有代码中的不同之处,并且将不同之处分离为新的操作。最后,用一个调用新的操作的模板方法来替换不同的代码。UML 图效果原创 2021-01-16 03:18:25 · 294 阅读 · 0 评论 -
Fluent Python - Part21类元编程
(元类) 是深奥的知识,99% 的用户都无需关注。如果你想知道是否需要使用元类,我告诉你,不需要 (真正需要使用元类的人确信他们需要,无需解释原因)。 --- Timsort 算法的发明者,活跃的 Python 贡献者 类元编程是指在运行时创建或定制类的技艺。在 Python 中,类是一等对象,因此任何时候都可以使用函数新建类,而无需使用 class 关键字。类装饰器也是函数,不过能够审查,修改,甚至把被装饰的类替换成其他类。最后,元类是类元编程最高级的工具:使用元类可以创建具有某种特质的全新类种,例.原创 2020-11-17 10:38:44 · 212 阅读 · 0 评论 -
Fluent Python - Part19 动态属性和特性
特性至关重要的地方在于,特性的存在使得开发者可以非常安全并且确定可行地将公共数据属性作为类的公共接口的一部分开放出来。 --- Alex Martelli(Python 贡献者和图书作者) 在 Python 中,数据的属性和处理数据的方法统称属性(attribute)。其实,方法只是可调用的属性。除了这二者之外,我们还可以创建特性(property),在不改变类接口的前提下,使用存取方法(即读值方法和设值方法)修改数据属性。除了特性,Python 还提供了丰富的 API,用于控制属性的访问权限,以.原创 2020-11-16 11:14:26 · 256 阅读 · 1 评论 -
Fluent Python - Part20 属性描述符
学会描述符之后,不仅有更多的工具集可用,还会对 Python 的运作方式有更深入的理解,并由衷赞叹 Python 设计的优雅 --- Raymond Hettinger(Python 核心开发者和专家) 描述符是对多个属性运用相同存取逻辑的一种方式。例如,Django ORM 和 SQL Alchemy等ORM中的字段类型是描述符,把数据库记录中字段里的数据与 Python 对象的属性对应起来。描述符是实现了特定协议的类,这个协议包括 __get__, __set__ 和 __delete__ 方法.原创 2020-11-11 23:08:47 · 238 阅读 · 0 评论 -
Fluent Python - Part18 使用 asyncio 包处理并 发
前几章讨论的是并行,即一次做多件事,对应的就是多线程或多进程。而本章讨论的内容是并发,即一次处理多件事,也就是协程。本章介绍 asyncio 包,这个包使用事件循环驱动的协程实现并发。主要话题有:对比一个简单的多线程程序和对应的 asyncio 版,说明多线程和异步任务之间的关系asyncio.Future 类与 concurrent.futures.Future 类之间的区别。下载国旗那些示例的异步版。摒弃线程或进程,如何使用异步编程管理网络应用中的高并发。在异步编程中,与回调相比,协程显著原创 2020-11-09 22:23:51 · 719 阅读 · 0 评论 -
Fluent Python - Part13 正确重载运算符
运算符重载的作用是让用户定义的对象使用中缀运算符(如 + 和 |) 或一元运算符(如 - 和 ~)。说的宽泛一些,在 Python 中,函数调用(()),属性访问(.)和元素访问/切片([]) 也是运算符,不过本章只讨论一元运算符和中缀运算符。在接下来的几节,我们将讨论:Python 如何处理中缀运算符中不同类型的操作数使用鸭子类型或显式类型检查处理不同类型的操作数中缀运算符如何表明自己无法处理操作数众多比较运算符(如 ==, >, <=, 等等) 的特殊行为增量赋值运算符(如 +原创 2020-11-04 12:24:51 · 145 阅读 · 0 评论 -
Fluent Python - Part17使用期物处理并发
本章主要讨论两点Python3.2 引入的 concurrent.futures 模块期物(future)的概念。期物指一种对象,表示异步执行的操作。这个概念的作用很大,是 concurrent.futures 模块和 asyncio 包的基础。示例:网络下载的三种风格为了高效处理网络I/O,需要使用并发,因为网络有很高的延迟,所以为了不浪费 CPU 周期去等待,最好在收到网络响应之前做些其他的事。为了通过代码说明这一点,我写了三个示例程序,从网上下载 20 个国家的国旗图像。第一个示例程序原创 2020-10-28 22:02:38 · 198 阅读 · 0 评论 -
Fluent Python - Part16 协程
本章涵盖一下话题:生成器作为协程使用时的行为和状态使用装饰器自动预激协程调用方如何使用生成器的 .close() 和 .throw(...) 方法控制协程协程终止时如何返回值yield from 新句法的用途和语义使用案例 — 使用协程管理仿真系统中的并发活动生成器如何进化成协程协程的底层架构在”PEP 342—Coroutines via Enhanced Generators”(https://www.python.org/dev/peps/pep-0342/“) 中定义,并在 P原创 2020-10-27 00:03:14 · 181 阅读 · 0 评论 -
Fluent Python - Part14 可迭代的对象、迭代器 和生成器
迭代是数据处理的基石。扫描内存中放不下的数据集时,我们要找到一个惰性获取数据项的方式,即按需一次获取一个数据项。这就是迭代器模式。在Python语言内部,迭代器用于支持:for 循环构建和扩展集合类型逐行遍历文本文件列表推导,字典推导和集合推导元祖拆包调用函数时,使用 * 拆包实参本章涵盖以下话题:语言内部使用 iter(...) 内置函数处理可迭代对象的方式如何使用 Python 实现经典的迭代器模式详细说明生成器函数的工作原理如何使用生成器函数或生成器表达式代替经典的迭代器原创 2020-10-27 00:00:55 · 285 阅读 · 0 评论 -
Fluent Python - Part15上下文管理器和 else 块
本章要讨论的内容有:with 语句和上下文管理器for, while, try 语句的 else 子句先做这个,再做那个:if 语句之外的else块else 子句不仅能在 if 语句中使用,还能在for,while,try 语句中使用。else 子句的行为如下:for:仅当 for 循环运行完毕时(即 for 循环没有被 break 语句中止)while: 仅当 while 循环因为条件为假值而退出时(即 while 循环没有被 break 语句中止) 才运行 else 块。try:仅原创 2020-10-21 22:58:50 · 220 阅读 · 0 评论 -
Fluent Python - Part11 接口:从协议到抽象基类
抽象类表示接口 --- Bjarne Stroustrup (C++ 之父) 本章讨论的话题是接口:从鸭子类型的代表特征动态协议, 到使接口更明确,能验证实现是否符合规定的抽象基类(Abstract Base Class, ABC)我们将实现一个新抽象基类,看看它的运作方式。但是,作者不建议你自己编写抽象基类,因为很容易过度设计。Python 文化中的接口和协议关于接口,这里有个实用的补充定义:对象公开方法的子集,让对象在系统中扮演特定的角色。Python 文档中的“文件类对象”或“可迭代对象.原创 2020-10-16 11:15:23 · 269 阅读 · 0 评论 -
Fluent Python - Part12 继承的优缺点
本章主要讨论两个内容:子类化内置类型的缺点多重继承和方法解析顺序子类化内置类型很麻烦在 Python2.2 之前,内置类型(如list 或 dict) 不能子类化。在 Python2.2 之后,内置类型可以子类化了,但是有个重要的注意事项:内置类型(使用C语言编写)不会调用用户定义的类覆盖的特殊方法。至于内置类型的子类覆盖的方法会不会隐式调用,CPython 没有指定官方规则。基本上,内置类型的方法不会调用子类覆盖的方法。例如,dict 的子类覆盖的 __getitem__() 方法不会被内置原创 2020-10-16 11:13:28 · 189 阅读 · 0 评论 -
Fluent Python - Part10 序列的修改,散列和切片
本章以第9章定义的二维向量Vector2d类为基础,定义表示多维向量的Vector类。这个类的行为与Python中标准的不可变扁平序列一样。Vector 实例中的元素是浮点数,本章结束后 Vector 类将支持下述功能:基本的序列协议 ----- __len__ 和 __getitem__正确表述拥有很多元素的实例适当的切片支持,用于生成新的 Vector 实例综合各个元素的值计算散列值自定义的格式语言扩展此外,我们还将通过 __getattr__ 方法实现属性的动态存取,以此取代 Vect原创 2020-10-13 18:03:40 · 274 阅读 · 0 评论 -
Python 问题贴
用type()动态生成的类,他的.__func,到底在dict里面的key是咋样的。class demo1(object): def __f(self): print("__f") def f2(self): self.__f() print("f2")d = demo1()print dir(d)demo2 = type("demo2", demo1.__bases__, demo1.__dict__.copy())d2 = d.原创 2020-10-13 10:56:05 · 90 阅读 · 0 评论 -
Fluent Python - Part9 符合Python风格的对象
这一章的内容和第一章类似,主要说明如何实现很多Python类型中常见的特殊方法。本章包含以下话题:支持用于生成对象其他表现形式的内置函数(如 repr(), bytes(), 等等)使用一个类方法实现备选构造方法扩展内置的 format() 函数和 str.format() 方法使用的格式微语言。实现只读属性把对象变为可散列的,以便在集合中及作为 dict 的键使用利用 __slots__ 节省内存我们还会讨论两个概念:如何以及何时使用 @classmethod 和 staticmeth原创 2020-10-12 22:13:54 · 195 阅读 · 0 评论 -
Fluent Python - Part7 函数装饰器和闭包
装饰器基础知识装饰器是一个可调用对象,其参数是另一个函数装饰器可能会处理被装饰的函数,然后把它返回,或者将其替换成另一个函数或者可调用对象。一个例子def deco(func): def inner(): print("running inner()") return inner@decodef target(): print("running target()")target()print(target)"""output:runni原创 2020-10-12 22:11:25 · 205 阅读 · 0 评论 -
Fluent Python - Part8 对象引用,可变性和垃圾回收
先介绍一下本章的内容吧。本章的主题是对象和对象名称之间的区别。名称不是对象,而是单独的东西。Python的变量是标注,而不是盒子。如果你不知道引用式变量是什么,可以像这样对别人解释别名。然后本章讨论对象标识,值和别名等概念。随后,本章会揭露元组的一个神奇特性:元组是不可变的,但是其中的值可以改变,之后就引申到浅复制和深复制。接下来的话题是引用和函数参数:可变的参数默认值导致的问题,以及如何安全地处理函数的调用者传入的可变参数。本章最后一节讨论垃圾回收,del 命令,以及如何使用弱引用“记住”对象,而无需原创 2020-10-11 15:26:31 · 207 阅读 · 0 评论 -
Fluent Python - Part6 使用一等函数实现设计模式
符合模式并不表示做得对 --- Ralph Johnson 虽然设计模式与语言无关,但这并不意味着每一个模式都能在每一门语言中使用。案例分析: 重构“策略”模式《设计模式:可服用面向对象软件的基础》一书是这样概述“策略模式”的:定义一系列算法,把他们一一封装起来,并且使它们可以相互替换。本模式使得算法可以独立于使用它的客户而变化。一个例子假如一个网店制定了下述折扣规则。有 1000 或以上积分的顾客,每个订单享 5% 折扣。同一订单中,单个商品的数量达到 20 个或以上,享 10% .原创 2020-10-11 15:25:43 · 138 阅读 · 0 评论 -
Fluent Python - Part5 一等函数
在 Python 中,函数是一等对象。那什么是“一等对象”呢?“一等对象”的定义如下:在运行时创建能赋值给变量或数据结构中的元素能作为参数传给函数能作为函数的返回结果高阶函数能接受函数为参数,或者把函数作为结果返回的函数是高阶函数(higher-order function).匿名函数lambda 关键字在 Python 表达式内创建匿名函数。一个例子>>> fruits = ['strawberry', 'fig', 'apple', 'cherry', 'ras原创 2020-10-11 15:24:49 · 201 阅读 · 0 评论 -
Fluent Python - Part4 文本和字节序列
人类使用文本,计算机使用字节序列 --- Esther Nam 和 Travis Fischer 本章内容基本没啥用,平常也基本接触不到多编码类型的文本处理。所以这一章会写得有点简陋hhh。字符问题把码位转换成字节序列的过程叫编码;把字节序列转换成码位的过程叫解码。换句话说,把人类看得懂的字符串转换成机器看得懂的序列的过程叫编码;反之叫解码。了解编解码的问题当编解码出现问题时,几乎都会指明具体的异常:UnicodeEncodeError(把字符串转换成二进制序列时)或 UnicodeDe.原创 2020-10-11 15:22:35 · 146 阅读 · 0 评论 -
Fluent Python - Part3 字典和集合
字典这个数据结构活跃在所有 Python 程序的背后,即便你的源码里并没有直接用到它。--- A.M.Kuchling什么是可散列的数据类型如果一个对象是可散列的,那么在这个对象的生命周期中,它的散列值是不变的,而且这个对象需要实现__hash__() 方法。另外可散列的对象还要有__qe__() 方法,这样才能跟其他键做比较。如果两个可散列的对象是相等的,那么它们的散列值一定是一样的。原子不可变数据类型(str, bytes 和数值类型) 都是可散列类型,frozenset 也是可散列的。元.原创 2020-10-11 15:22:04 · 159 阅读 · 0 评论 -
Fluent Python - Part2 序列构成的数组
序列Python 使用统一的风格去处理序列数据,不管是哪种数据结构,它们都共用一套丰富的操作:迭代,切片,排序和拼接。通过了解 Python 不同的序列类型以及它们的使用,能够让我们避免重复发明轮子,而且 Python 的 API 能够帮助我们把自己定义的结构设计得跟原生序列一样。序列类型根据是否能放不同类型的数据分类容器序列:能存放不同类型的数据,存放的是对象的引用。其中包括:list,tuple,collections.deque等。扁平序列:仅能存放基础类型的对象,如字符,字节,数值。原创 2020-10-11 15:21:23 · 545 阅读 · 0 评论 -
Fluent Python - Part1 序幕
Python 风格Python 最好的品质之一就是一致性。它通过某种方式制定了一系列规范,我们可以使用这些规范去写出最地道的Python风格的代码。而这一套规范具体体现在哪里呢? 答案是Magic Function。Magic Function(魔术方法)一撂Python风格的纸牌import collectionsCard = collections.namedtuple('Card', ['rank', 'suit'])class FrenchDeck: ranks = [s原创 2020-10-11 15:20:29 · 170 阅读 · 0 评论