2023-11-10 10:46:38 +08:00
|
|
|
|
---
|
|
|
|
|
title: 流畅的Python
|
|
|
|
|
description: 本书致力于帮助Python开发人员挖掘这门语言及相关程序库的优秀特性,避免重复劳动,同时写出简洁、流畅、易读、易维护,并且具有地道Python风格的代码。本书尤其深入探讨了Python语言的高级用法,涵盖数据结构、Python风格的对象、并行与并发,以及元
|
|
|
|
|
keywords:
|
|
|
|
|
- 流畅的Python
|
|
|
|
|
- 计算机
|
|
|
|
|
tags:
|
|
|
|
|
- 阅读/计算机
|
|
|
|
|
author: 7Wate
|
|
|
|
|
date: 2023-07-17
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## 简介
|
|
|
|
|
|
|
|
|
|
- **书名**:《流畅的Python》
|
|
|
|
|
- **作者**: 卢西亚诺·拉马略
|
|
|
|
|
- **分类**: 计算机-编程设计
|
|
|
|
|
- **ISBN**:9787115454157
|
|
|
|
|
- **出版社**:人民邮电出版社
|
|
|
|
|
|
|
|
|
|
## 概述
|
|
|
|
|
|
|
|
|
|
本书致力于帮助Python开发人员挖掘这门语言及相关程序库的优秀特性,避免重复劳动,同时写出简洁、流畅、易读、易维护,并且具有地道Python风格的代码。本书尤其深入探讨了Python语言的高级用法,涵盖数据结构、Python风格的对象、并行与并发,以及元编程等不同的方面。
|
|
|
|
|
|
|
|
|
|
## 划线
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
> Python官方教程的开头是这样写的:“Python是一门既容易上手又强大的编程语言。”这句话本身并无大碍,但需要注意的是,正因为它既好学又好用,所以很多Python程序员只用到了其强大功能的一小部分。
|
|
|
|
|
|
|
|
|
|
> 不成熟的抽象和过早的优化一样,都会坏事。
|
|
|
|
|
|
|
|
|
|
> 数据模型其实是对Python框架的描述,它规范了这门语言自身构建模块的接口
|
|
|
|
|
|
|
|
|
|
> 序列类型还能按照能否被修改来分类。可变序列list、bytearray、array.array、collections.deque和memoryview。不可变序列tuple、str和bytes。
|
|
|
|
|
|
|
|
|
|
> list是一个可变序列,并且能同时存放不同类型的元素
|
|
|
|
|
|
|
|
|
|
> 在Python中,函数用*args来获取不确定数量的参数算是一种经典写法了。
|
|
|
|
|
|
2024-01-10 16:40:48 +08:00
|
|
|
|
> `seq[start:stop:step]`进行求值的时候,Python会调用`seq.__getitem__(slice(start, stop, step))`。
|
2023-11-10 10:46:38 +08:00
|
|
|
|
|
2024-01-10 16:40:48 +08:00
|
|
|
|
> 如果在a * n这个语句中,序列a里的元素是对其他可变对象的引用的话,你就需要格外注意了,因为这个式子的结果可能会出乎意料。比如,你想用`my_list=[[]] * 3`来初始化一个由列表组成的列表,但是你得到的列表里包含的3个元素其实是3个引用,而且这3个引用指向的都是同一个列表。这可能不是你想要的效果。
|
2023-11-10 10:46:38 +08:00
|
|
|
|
|
|
|
|
|
> 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)
|
|
|
|
|
|
2024-01-10 16:40:48 +08:00
|
|
|
|
> all(iterable)如果iterable的每个元素都是真值,返回True;`all([])`返回True。any(iterable)只要iterable中有元素是真值,就返回True;`any([])`返回False。
|
2023-11-10 10:46:38 +08:00
|
|
|
|
|
|
|
|
|
> 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中的引用式变量,因此最好把它们理解为附加在对象上的标注。
|
|
|
|
|
|
|
|
|
|
## 笔记
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
> 在运行时创建
|
|
|
|
|
能赋值给变量或数据结构中的元素
|
|
|
|
|
能作为参数传给函数
|
|
|
|
|
能作为函数的返回结果
|
|
|
|
|
|
|
|
|
|
💭 感觉这个一等函数好抽象或者是翻译的问题……
|
|
|
|
|
|
|
|
|
|
## 书评
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 点评
|