Python3进阶:高级特性二

Python

本文上上一篇文章的补充内容。

__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

defaultdictdict类型不同,你不需要检查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

返回一个列表,包含对象所拥有的属性和方法。

typeid

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]

其他另种和列表推导式类似。

参考