《Python基础教程,第3版》 by Magnus Lie H
除非必须使用from版的import命令,否则应坚持使用常规版import命令。
e.g., from cmath import sqrt
这样就无法使用math中的sqrt了。
PS:cmath是处理复数的模块
__future__模块
==用来检查两个对象是否相等,is用来检查两个对象是否为同一个(id是否相同);不要将id用于数字和字符串等不可变的基本值,结果是未定义的。
e.g.,
>>> x = y = [1, 2]
>>> z = [1, 2]
>>> x == z # True
>>> x is z # False
from module import * 不会导入以下划线打头的名称,e.g.,如果定义了__all__公有接口,from copy import *导入的只有copy.__all__中的Error,copy和deepcopy,其他的模块如PyStringMap需要显式导入和使用。
源码路径
模块的__file__指向代码所在(python实现的才有)
>>> import copy
>>> print(copy.__file__) # 打印出来的路径即copy代码文件所在
子类构造函数与super()
子类重写构造函数时,需要调用超类的构造函数,以确保初始化基类所有的属性。有两种方法:调用未关联的超类构造函数;使用super函数,后者更推荐,因为即使有多个超类也只要调用一次super就可以了。
class Bird:
def __init__(self):
self.hungry = True
class SongBird(Bird):
def __init__(self):
Bird.__init__(self) # 方法一
super().__init__() # 方法二,推荐
self.sound = 'Squawk!'
property类
class Rectangle:
def __init__(self):
self.width = 0
self.height = 0
def get_size(self):
retun self.width, self.height
def set_size(self, size):
self.width, self.height = size
size = property(get_size, set_size)
# 上一行创建了一个特性,并将名称size关联到这个特性。
>>> r = Rectangle()
>>> r.width = 10
>>> r.height = 5
>>> r.size # 看起来就像普通属性一样
>>> r.size = 150, 100
pprint—比print打印效果可阅读行强
>>> import sys, pprint
>>> pprint.pprint(sys.path)
推荐模块放在site-packages目录下。
告诉解释器到哪里去查找模块,办法之一是直接修改sys.path,更标准的做法是将模块所在目录包含在环境变量PYTHONPATH中,如linux中在.bashrc中加入:
export PYTHONPATH=$PYTHONPATH:自定义目录
包package
包含__init__.py和各个模块文件(可以包含其他包)。
堆特征
堆中元素排列不是严格排序的,但:位置i处的位置总是大于位置i // 2处的元素。heappop弹出最小的元素始终是索引为0的元素,并确保剩余元素中最小的那个位于索引0处(保持堆特征)。
把普通列表变成heap使用heapify函数。
双端队列
deque.rotate(n) 默认n为1,既执行一次把最左边的元素移到右边,n>1则重复操作n次(并不是一次移动n个元素);n<0执行方向变为从右边移动左边。
shelve
将数据存储到文件中,可以像字典一样操作(key必须是字符串)。
存储陷阱:
>>> s = sheve.open("test.dat")
>>> s['x'] = ['a', 'b', 'c']
>>> s['x'].append('d') # 操作和返回的都是副本,所以'd'并未存储到s['x']中。
解决方法:将副本赋给一个临时list变量,修改临时变量后再次存储。
>>> tmp = s['x']
>>> tmp.append('d')
>>> s['x'] = tmp