【下载地址】 流畅的Python》一书致力于帮助Python开发人员挖掘这门语言及相关程序库的优秀特性,避免重复劳动,同时写出简洁、流畅、易读、易维护,并且具有地道Python风格的代码。...本书尤其深入探讨了Python语言的高级用法,涵盖数据结构、Python风格的对象、并行与并发,以及元编程等不同的方面。
流畅的python中有很多奇技淫巧,整本书都在强调如何最大限度地利用Python 标准库。...介绍了很多python的不常用的数据类型、操作、库等,对于入门python后想要提升对python的认识应该有帮助。...目前读一遍记录了一些有共鸣的操作: Python内置序列类型的主要分类: 按可存放的元素类型分为:容器序列和扁平序列 容器序列,就是什么都能作为元素往里放,包括另一个序列。...opcode Python dis 模块支持对Python代码进行反汇编, 生成字节码指令。...bytearray是可变(mutable)的字节序列,相对于Python2中的str,但str是不可变(immutable)的。
可变序列 list,生成器的表达式可以用来创建任何类型的序列,它本身没有容器结构,存粹实现了迭代的功能,这是它实现的内在....和列表表达式的区别是方括号变成圆括号 只用推导式去生成一个新的列表.超过两行的推导式就考虑重新写吧.有点复杂了.其内部使用的变量作用域Σ(っ °Д °;)っ就是其本身,所以看起来是相对封闭的环境,不会和外界的...元组拆包 这个可以应用带任何可以迭代的对象上面去。唯一的硬性要求是,被可迭代对象中的元素数量必须根接受这些元素的元组的空档数是一致的。其实可迭代的元素拆包这个说法也流行起来了。...最好的辨认方法就是平行赋值,也就是一个可迭代对象里的元素,一并赋值到对应的变量组成的元组中。...后者可以是由数个字符串组成的可迭代的对象,或者是由空格分隔开的字段名组成的字符串。
支持函数式编程的包 1. 函数对象 def factorial(n): ''' returns n!...n的阶乘 ''' return 1 if n < 2 else n * factorial(n - 1) print(factorial(42)) print(factorial....n的阶乘 print(type(factorial)) # fact = factorial print(fact) # print(tag('p', 'hello')) # hello print(tag('p', 'hello', 'world')) # 第一个参数后的任意个...支持函数式编程的包 operator from functools import reduce def fact(n): return reduce(lambda a, b: a * b,
流畅的python 对于发展迅速的组织来说,python可以极大地提高生产力。...初学者学Python,不但入门容易,而且将来深入下去,可以编写那些非常非常复杂的程序。 ? 那Python适合开发哪些类型的应用呢?...那些大公司的代码不愿意开放的更重要的原因是代码写得太烂了,一旦开源,就没人敢用他们的产品了。 瑕不掩瑜。python确实是简洁,可读性高。适用于大多数场景的语言。...总的来说,Python的哲学就是简单优雅,尽量写容易看明白的代码,尽量写少的代码。如果一个资深程序员向你炫耀他写的晦涩难懂、动不动就几万行的代码,你可以尽情地嘲笑他。...此外pip是python的第三方包管理工具。 数据类型 包括: 布尔型(True/False) 整型 浮点型(小数或科学计数法) 字符串 变量与命名 python是强类型语言。
对于字符串,我们接触得挺多的。而编码问题,也不时令人头疼的。...由于一开始接触的就是 Python3,所以一些在 Python2 上的编码上的坑我没遇到,甚至在 Python3 上都很少遇到编码问题,因为 Python3 默认的编码是 utf-8,而之前又从 Windows...使用下标获取字节的值时,返回的是整数。这个是没想到的。很多适用于 str 对象的方法也适用于 bytes 对象。 struct 模块提供了一些函数可把字节序列与其他不同的类型互相转换。...除了 utf-8 编码,Python 还内置了许多其他的编码器。不同编码器编码的相同的字符,最终的字节大小可能会不同。...NFC(Normalization Form C)使用最少的码位构成等价的字符串,而 NFD 把组合字符分解成基字符和单独的组合字符。
在 python 词汇表(https://docs.python.org/3/glossary.html#term-hashable)中,关于可散列类型的定义是这样的:如果一个对象是可散列的,那么在这个对象的生命周期中...my_dict.keys() 在 Python3 中返回值是一个 "视图","视图"就像是一个集合,而且和字典一样速度很快。但在 Python2中,my_dict.keys() 返回的是一个列表。...所以 k in my_dict.keys() 操作在 python3中速度很快,但在 python2 中,处理效率并不高。如果要自定义一个映射类型,合适的策略是继承类。...因为所有表元的大小一致,所以可以通过偏移量来读取某个表元。python 会设法保证大概有1/3 的表元是空的,所以在快要达到这个阈值的时候,原有的散列表会被复制到一个更大的空间。...5、往字典里添加新键可能会改变已有键的顺序 无论何时向字典中添加新的键,Python 解释器都可能做出为字典扩容的决定。
“Python是一门既容易上手又强大的编程语言。”这句话本身并无大碍,但需要注意的是,正因为它既好学又好用,所以很多Python程序员只用到了其强大功能的一小部分。...今天跟大家分享的就是一本Python开发者们翘首期盼的进阶图书,其中文版在豆瓣上评分为9.4,它是《流畅的Python》,这可能是目前评价最高的一本python书籍了! ?...,告诉你Python中不亲自动手实践就无法理解的语言陷阱成因和解决之道,教你写出风格地道的Python代码。...【主要内容】 本书致力于帮助Python开发人员挖掘这门语言及相关程序库的优秀特性,避免重复劳动,同时写出简洁、流畅、易读、易维护,并且具有地道Python风格的代码。...本书尤其深入探讨了Python语言的高级用法,涵盖数据结构、Python风格的对象、并行与并发,以及元编程等不同的方面。 本书适合初中高级Python软件开发人员阅读参考。 ?
协程的四个状态 使用inspect.getgeneratirstat()获取协程的状态 等待开始执行 GEN_CREATED 解释器正在执行 GEN_RUNNING 在yield表达式处暂停 GEN_SUPENDED...next(c) # 预激 print(c.send(10)) print(c.send(20)) print(c.send(30)) print(c.send(5)) 协程的终止与异常处理...10) d.send(11) d.throw(DemoException) print('1234') d.close() yield from Yield from 的主要功能是打开双向通道...,把最外层的调用方与最内层的子生成器连接起来,这样两者可以直接发送和产出值,还可以直接传出异常,而不用在位于中间的协程中添加大量处理异常的样板代码。...委派生成器 包含yield from 表达式的生成器函数 子生成器 从yield from 表达式中部分获取的生成器 调用方 指代委派生成器的客户端代码 例子 from
# 从pdf中读取文本 # 写pdf # 加密解密pdf # 和平pdf,加水印 # pip install PyPDF2 %cd D:\python全站\office import PyPDF2 D:...\python全站\office pdf_obj = open('coop.pdf', 'rb') pdf = PyPDF2.PdfFileReader(pdf_obj) pdf.numPages 3...,从上文打开的pdf找出第二页,新鞋一个pdf pdf_writer = PyPDF2.PdfFileWriter() page = pdf.getPage(1) pdf_writer.addPage(...page) with open('coop-1.pdf', 'wb') as f: pdf_writer.write(f) pdf_obj.close() # 加密pdf with open('...('hicoop') pdf.getPage(0) #取到解密后的数据才能正常操作 True # 合并多个pdf,加水印 with open('coop.pdf', 'rb') as f_in:
iter函数作用 任何Python序列都可迭代的原因是,它们都实现了__getitem__方法。...检查对象能否迭代 调用iter(x)函数,如果不可迭代,再处理TypeError异常 可迭代对象与迭代器 Python从可迭代的对象中获取迭代器 迭代器可以迭代,但是可迭代对象不是迭代器 s = 'ABC...Python语言会处理for循环和其他迭代器(列表推导、元组拆包等)上下文中的StopIteration 可迭代对象 使用iter内置函数可以获取迭代器的对象。...Python中的迭代器还实现了__iter__方法,因此迭代器也可以迭代 ⚠️可迭代的对象一定不能是自身的迭代器。...也就是 可迭代对象必须实现__iter__方法,但不能实现__next__方法 迭代器模式可以用来 访问一个聚合对象的内容而无需暴露它的内部表示 支持对聚合对象的多种遍历 为遍历不同的聚合结构提供一个统一的接口
在Python中,函数是一等对象。 一等对象 在运行时创建 能赋值给变量或数据结构中的元素 能作为参数传给函数 能作为函数的返回结果 第二点和第三点在实际编写代码的时候经常用到!...常见的高阶函数: map filter reduce 函数式语言通常会提供这三个高阶函数 在Python中可以使用列表推导式来替代实现 def fact(n): return 1 if n <...可调用对象 使用callable()方法查看对象是否是可调用对象 只要实现__call__方法,任何Python对象都可以调用 class A(): def __init__(self, a,...注解的最大作用是:为IDE和lint程序的静态检查功能提供额外的类型信息 itemgetter 返回一个根据索引提取元素的函数 from operator import itemgetter class...,我们把它其中的一个入参固定为3,这样我们只需要传入一个参数就可以计算了 不指定冻结的形参的话,默认是冻结左侧的形参,该函数中的a
并发用于制定方案,用来解决可能(但未必)并行的问题。...supervisor()) loop.close() print('Answer:', result) if __name__ == '__main__': main() ⚠️协程的优势...:协程是可以暂停和恢复的函数 回调地狱 如果一个操作需要依赖之前操作的结果,那就得嵌套回调。
猴子补丁 Python是动态语言,所以可以在运行时进行修正 class A: def f(self): pass def f(a): return 'Hello World...,转而关注对象有没有实现所需的方法、签名和语义。...在框架之外,鸭子类型通常比类型检查更简单,也更灵活 抽象基类 collections.abc中有很多有用的抽象类 Python的抽象基类可以使用register类方法在终端用户的代码中把某个类「声明」为一个抽象基类的...让解释器把调用分派给正确的方法,而不是if/elif/else块硬编码分派逻辑 抽象基类是用于封装框架引入的一般性概念和抽象。...基本上不需要自己编写新的抽象基类,只要正确使用现有的抽象基类就能获得99.9%的好处,而不用冒着设计不当导致的巨大风险。 ?
如下所示写在class 内的变量要通过self 来访问,否则会报找不到两个魔术方法的使用: __len__ 和__getitem__; 使用__getitem__ 可以实现切片索引/random choice...rank {2,3,4....K,A}花色{"♣️",“♥️”,“♦️”,“♠️”}可以将多个维度的值映射为唯一的数值。...常见的方法是使用线形组合或笛卡尔积,结合每个维度可能值的数量来保证每个组合的唯一性。可以简化多维度排序和比较的问题,使得多个属性的组合能够在一个维度上得到有效表示。...则将这k个维度的组合映射到一个唯一值的公式可以表示为:其中 v_i 是第i个维度|V_j| 是第j个维度可能值的数量\prod_{j=1}^{i-1}|V_j| 是所有在i之前的维度的可能值数的乘积,...特殊方法如何使用:重载运算符定义向量point 类,实现加法/乘法/取模操作对象的字符串表示形式__repr__对象的布尔值__bool__ : 若自定义class 中不显示的定义bool 函数, 则会自动调用类中的
运算符重载的作用是让用户定义的对象使用中缀运算符或一元运算符 中缀运算符 是一个通用的算术或逻辑公式表示方法, 操作符是以中缀形式处于操作数的中间(例:3 + 4),中缀表达式是人们常用的算术表示方法...Python对运算符重载的限制 不能重载内置类型的运算符 不能新建运算符,只能重载现有的 某些运算符不能重载:is、and、or和not 一元运算符处理方式 支持一元运算符,只需要实现相应的特殊方法。...不能修改self,要创建并返回合适类型的新实例。...other 比较运算符 正向和反向调用使用的是同一系列方法 对==和!...=来说,如果反向调用失败,python会比较对象的ID,而不抛出TypeError ? 比较运算符 增量赋值运算符 增量赋值运算符不会修改不可变目标,而是新建实例,然后重新绑定
============================= test session starts ============================== platform darwin -- Python...3.7.6, pytest-5.3.5, py-1.8.1, pluggy-0.13.1 -- /opt/anaconda3/bin/python cachedir: .pytest_cache hypothesis...profile 'default' -> database=DirectoryBasedExampleDatabase('/Users/zhongxin/PycharmProjects/流畅的Python.../第七章:函数装饰器和闭包/.hypothesis/examples') rootdir: /Users/zhongxin/PycharmProjects/流畅的Python/第七章:函数装饰器和闭包...functools.singledispatch PEP443-Single-dispatch generic functions:https://www.python.org/dev/peps/pep
序列类型 容器类型 能存放不同类型的数据 扁平序列 只能容纳一种类型 不可变序列 slots:限制class能添加的属性 @abstractmethod:含abstractmethod方法的类不能实例化...,继承了含abstractmethod方法的子类必须复写所有abstractmethod装饰的方法 class Sequence(Reversible, Collection): """All...」可以用来创建其他任何类型的序列 作用域 在python2中会出现变量泄漏的问题,在python3中不会出现 python2 x = 'abc' d = [x for x in 'ABC'] print...x # 'C' python3 x = 'abc' d = [x for x in 'ABC'] print x # 'abc' 多个for循环 colors = ['black', 'white...可选参数lo(默认0)和hi(默认a的长度),限定要搜索的a的切片。
这两个类实现的接口能分别在不同的线程或者进程中执行可调用的对象。 这两个类在内部维护着一个工作线程或进程池,以及要执行的任务队列。...,而确定某件事会发生的唯一方式是执行的时间已经排定 future封装待完成的操作,可以放入队列,完成的状态可以查询,得到结果(或抛出异常)后可以获取结果(或异常)。...阻塞型I/O和GIL GIL几乎对I/O密集型处理无害 Cpython解释器本身就不是线程安全的,因此有全局解释器锁「GIL」,一次只运行使用一个线程执行Python字节码。...因此,一个Python进程通常不能同时使用多个CPU核心。...标准库中所有执行阻塞性I/O操作的函数,在等待操作系统返回结果时都会释放GIL 使用ProcessPoolExecutor进行并行计算 ProcessPoolExecutor类把工作分配给多个Python
这就是迭代器的作用。本章展示了迭代器设计模式是如何内置到 Python 语言中的,因此您永远不需要手动编写它。 Python 中的每个标准集合都是可迭代的。...在 Python 中理解经典协程很令人困惑,因为它们实际上是以不同方式使用的生成器。因此,让我们退一步考虑 Python 中另一个可以以两种方式使用的特性。...随着 Python 3.5 中本地协程的出现,Python 核心开发人员正在逐渐淘汰asyncio中对经典协程的支持。但底层机制非常相似。...⁷ 在 Python 2 中,有一个名为coerce()的内置函数,但在 Python 3 中已经消失了。这被认为是不必要的,因为数值强制转换规则在算术运算符方法中是隐含的。...⁸ 流畅的 Python代码库中的17-it-generator/目录包含了文档测试和一个名为aritprog_runner.py的脚本,该脚本针对aritprog.py*脚本的所有变体运行测试。
领取专属 10元无门槛券
手把手带您无忧上云