# 流畅的Python
本书致力于帮助Python开发人员挖掘这门语言及相关程序库的优秀特性，避免重复劳动，同时写出简洁、流畅、易读、易维护，并且具有地道Python风格的代码。本书尤其深入探讨了Python语言的高级用法，涵盖数据结构、Python风格的对象、并行与并发，以及元编程等不同的方面。.

2024年10月14日8分钟阅读

- Personal/Book
- Read/计算机-编程设计

## 简介

- 书名：《流畅的Python》
- 作者： 【巴】卢西亚诺·拉马略
- 分类： 计算机-编程设计
- ISBN：9787115454157
- 出版社：人民邮电出版社

## 概述

本书致力于帮助Python开发人员挖掘这门语言及相关程序库的优秀特性，避免重复劳动，同时写出简洁、流畅、易读、易维护，并且具有地道Python风格的代码。本书尤其深入探讨了Python语言的高级用法，涵盖数据结构、Python风格的对象、并行与并发，以及元编程等不同的方面。

## 划线

> Python官方教程的开头是这样写的：“Python是一门既容易上手又强大的编程语言。”这句话本身并无大碍，但需要注意的是，正因为它既好学又好用，所以很多Python程序员只用到了其强大功能的一小部分。

> 不成熟的抽象和过早的优化一样，都会坏事。

> 数据模型其实是对Python框架的描述，它规范了这门语言自身构建模块的接口

> 序列类型还能按照能否被修改来分类。可变序列list、bytearray、array.array、collections.deque和memoryview。不可变序列tuple、str和bytes。

> list是一个可变序列，并且能同时存放不同类型的元素

> 在Python中，函数用*args来获取不确定数量的参数算是一种经典写法了。

> seq[start:stop:step]进行求值的时候，Python会调用seq.getitem(slice(start, stop, step))。

> 如果在a * n这个语句中，序列a里的元素是对其他可变对象的引用的话，你就需要格外注意了，因为这个式子的结果可能会出乎意料。比如，你想用my_list= * 3来初始化一个由列表组成的列表，但是你得到的列表里包含的3个元素其实是3个引用，而且这3个引用指向的都是同一个列表。这可能不是你想要的效果。

> Python Tutor是一个对Python运行原理进行可视化分析的工具

> 不要把可变对象放在元组里面。增量赋值不是一个原子操作。我们刚才也看到了，它虽然抛出了异常，但还是完成了操作。查看Python的字节码并不难，而且它对我们了解代码背后的运行机制很有帮助。

> Python序列类型最常见的分类就是可变和不可变序列。但另外一种分类方式也很有用，那就是把它们分为扁平序列和容器序列。

> 散列表则是字典类型性能出众的根本原因

> 集合的本质是许多唯一对象的聚集。

> 不要忘了，如果要创建一个空集，你必须用不带任何参数的构造方法set（　）。如果只是写成{}的形式，跟以前一样，你创建的其实是个空字典。

> dict的实现是典型的空间换时间：字典类型有着巨大的内存开销，但它们提供了无视数据量大小的快速访问——只要字典能被装在内存里。

> Python 3明确区分了人类可读的文本字符串和原始的字节序列。

> 我指的是b’\xff\xfe’。这是BOM，即字节序标记（byte-order mark），指明编码时使用Intel CPU的小字节序。

> __doc__属性用于生成对象的帮助文本。

> map函数返回一个可迭代对象，里面的元素是把第一个参数（一个函数）应用到第二个参数（一个可迭代对象，这里是range(11)）中各个元素上得到的结果。

> 接受函数为参数，或者把函数作为结果返回的函数是高阶函数（higher-order function）

> all(iterable)如果iterable的每个元素都是真值，返回True；all([])返回True。any(iterable)只要iterable中有元素是真值，就返回True；any([])返回False。

> Python简单的句法限制了lambda函数的定义体只能使用纯表达式。换句话说，lambda函数的定义体中不能赋值，也不能使用while和try等Python语句。

> lambda句法只是语法糖：与def语句一样，lambda表达式会创建函数对象。这是Python中几种可调用对象的一种。下一节会说明所有可调用对象。

> 不仅Python函数是真正的对象，任何Python对象都可以表现得像函数。为此，只需实现实例方法__call__。

> 与用户定义的常规类一样，函数使用__dict__属性存储赋予它的用户属性。

> Python最好的特性之一是提供了极为灵活的参数处理机制，而且Python 3进一步提供了仅限关键字参数（keyword-only argument）。

> 函数装饰器用于在源码中“标记”函数，以某种方式增强函数的行为。

> Python不要求声明变量，但是假定在函数定义体中赋值的变量是局部变量。

> Python内置了三个用于装饰方法的函数：property、classmethod和staticmethod。

> 因为lru_cache使用字典存储结果，而且键根据调用时传入的定位参数和关键字参数创建，所以被lru_cache装饰的函数，它的所有参数都必须是可散列的。

> 首先，我们要抛弃变量是存储数据的盒子这一错误观念

> Python变量类似于Java中的引用式变量，因此最好把它们理解为附加在对象上的标注。

## 笔记

> 在运行时创建 能赋值给变量或数据结构中的元素 能作为参数传给函数 能作为函数的返回结果

💭 感觉这个一等函数好抽象或者是翻译的问题……

## 书评

## 点评