logo头像

更好的代码风格

Pythonic!!!

解包

列表或者元组,可以将其解包并为它的元素取名。

1
2
for index, item in enumerate(some_list):
# 使用index和item做一些工作

嵌套解包

1
a, (b, c) = 1, (2, 3)

Python 3中,扩展解包的新方法:

1
2
3
4
a, *rest = [1, 2, 3]
# a = 1, rest = [2, 3]
a, *middle, c = [1, 2, 3, 4]
# a = 1, middle = [2, 3], c = 4

解包并丢弃变量,使用__

1
2
filename = 'foobar.txt'
basename, __, ext = filename.rpartition('.')

创建包含N个list的list

1
2
3
4
5
6
7
8
9
10
11
# 列表是可变的,所以 * 操作符(如上)将会创建一个包含N个且指向同一个列表的列表
first_lists = [['a', 'b']] * 4
print(first_lists)
for item in first_lists:
print(id(item)) # 指向同一个内存块的4个list

# 使用range(python3),xrange(python2.7)
b = [['a', 'b'] for __ in range(4)]
print(b)
for item in b:
print(id(item)) # 指向不同的内存块的4个list

输出:

1
2
3
4
5
6
7
8
9
10
[['a', 'b'], ['a', 'b'], ['a', 'b'], ['a', 'b']]
63088880
63088880
63088880
63088880
[['a', 'b'], ['a', 'b'], ['a', 'b'], ['a', 'b']]
63089520
63087120
63089120
63089560

在集合中查找一个项

每种数据结构上的多种常见操作的花费时间的详细内容,请见

以下情况建议使用集合或者字典而不是列表

  1. 集合体中包含大量的项
  2. 您将在集合体中重复地查找项
  3. 您没有重复的项

对于小的集合体,或者不频繁查找的集合体,建立哈希带来的额外时间和内存的开销经常会大过改进搜索速度所节省的时间。

python之禅

列表与迭代器

创建新列表需要更多工作,并使用更多内存。如果您只是要遍历列表,请考虑使用迭代器。

1
2
3
4
5
6
7
8
9
10
11
# 推导创建了一个新的列表对象
filtered_values = [value for value in sequence if value != x]
# 或者 (2.x)
filtered_values = filter(lambda i: i != x, sequence)

# 生成器不会创建新的列表
filtered_values = (value for value in sequence if value != x)
# 或者 (3.x)
filtered_values = filter(lambda i: i != x, sequence)
# 或者 (2.x)
filtered_values = itertools.ifilter(lambda i: i != x, sequence)

注意:python3中迭代器filter返回的是一个对象,使用[]可将其转化为列表