本文上上一篇文章的补充内容。
__slots__
魔法
Python中,每个类的实力属性。默认情况下Python用一个字典来保存一个对象。这非常有用,允许我们在运行时去设置任意的新属性。
但是,有时存在一个问题,比如已知的属性的类来说,字典会浪费很多内存,当类很多时将大量消耗内存。
🌰:
1 2 3 4 5 6 7
| class Myclass(object): __slots__ = ['name', 'identifier'] def __init__(self, name, identifier): self.name = name self.identifier = identifier self.set_up() #...
|
使用__slots__
减少内存消耗。
容器(collections)
Python附带一个模块,它包含许多容器数据类型。
例如:
- defaultdict
- counter
- deque
- namedtuple
- enum.Enum(Python3.4以上)
defaultdict
defaultdict
与dict
类型不同,你不需要检查key是否存在。另一个问题,可以绕过键值不存在的keyError
异常。
1 2 3 4 5 6 7 8 9
| import collections import json tree = lambda: collections.defaultdict(tree) some_dict = tree() some_dict['colours']['favourite'] = 'yellow' # 这里不会发生异常
print(json.dumps(some_dict))
# Output: {"colours": {"favourite": "yellow"}}
|
counter
counter是计数器,可以针对某一项数据进行技术。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| from collections import Counter colours = (
('1', 'sadafa'), ('2', 'aaaa'), ('3', 'aaaa'), ('4', 'aaaa'), ('2', 'bbbbb'), )
favs = Counter(name for name, colour in colours) print(favs)
# Output: Counter({'2': 2, '1': 1, '3': 1, '4': 1})
|
另外,还可以使用它统计文件。
deque
deque提供了一个双端队列,可以从头/尾两端添加或删除元素。它的用法就像list
,提供了类似的方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| from collections import deque d = deque() # 定义
d.append(1) # 添加数据 d.append(2) d.append(3)
print(len(d))
# 输出 d.popleft() # 左侧输出
d.pop() # 右侧输出
# 限制大小,超出后另一端会被挤出。
d = deque(maxlen = 5)
# 扩展数据
d.extendleft([0])
d.extend([5,6,7])
|
namedtuple
命名元组是把元组编程一个针对简单任务的容器。你不必使用整数索引来访问一个namedtuples
的数据。可以像字典样访问,但是它是不可变的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| from collections import namedtuple Animal = namedtuple('Animal', 'name age type') perry = Animal(name = 'perry', age = 31, type = 'cat')
print(perry) print(perry.name)
# Output: # Animal(name='perry', age=31, type='cat') # perry
# 将命名元组转为字典 print(perry._asdict())
# OrderedDict([('name', 'perry'), ('age', 31), ('type', 'cat')])
|
enum.Enum(Python3.4+)
在enum模块枚举对象。 Enums基本上是一种组织各种东西的额方式。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| from collections import namedtuple from enum import Enum
class Species(Enum): cat = 1 dog = 2 horse = 3 aardvark = 4 butterfly = 5
kitten = 1
Animal = namedtuple('Animal', 'name age type') perry = Animal(name = 'perry', age = 32, type = Species.cat)
|
枚举
枚举(enumerate)是Python的内置函数。它允许我们遍历数据并自动技术。
1 2 3 4 5 6 7 8
| for counter, value in enumerate(range(10)): print(counter, value)
# 设置从哪个索引开始枚举 my_list = ['apple', 'banana', 'graps', 'pear'] for c, value in enumerate(my_list, 1): print(c, value)
|
对象自省
dir
返回一个列表,包含对象所拥有的属性和方法。
type 和 id
type
函数返回对象的类型。
id
函数返回任意不同种类对象的ID
inspect
提供了很多有用的函数,获取活跃对象的信息。
推导式
推导式(又称解析式)是Python的一种独有的特性。
- 列表(list)推导式
- 字典(dict) 推导式
- 集合(set)推导式
列表推导式
直接看例子:
1 2 3 4 5 6 7 8 9 10
| multiples = [i for i in range(30) if i % 3 is 0] print(multiples)
# Output: [0, 3, 6, 9, 12, 15, 18, 21, 24, 27]
squared = [x ** 2 for x in range(10)] print(squared) # Output: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
|
其他另种和列表推导式类似。
参考