Pythonic
列表切割
list[start:end:step]
如果从列表开头开始切割,那么忽略 start 位的 0,例如list[:4]
如果从列表开头开始切割,那么忽略 start 位的 0,例如list[:4]
如果一直切到列表尾部,则忽略 end 位的 0,例如list[3:]
切割列表时,即便 start 或者 end 索引跨界也不会有问题
列表切片不会改变原列表。索引都留空时,会生成一份原列表的拷贝
b = a[:]
assert b == a and b is not a # true
列表推导式
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
squares = map(lambda x: x ** 2, a)
squares = [x ** 2 for x in a]
squares = [x ** 2 for x in a if x % 2 == 0]
一些函数
# 有一个嵌套的列表,现在要把它里面的所有元素扁平化输出
list = [[
[1, 2, 3],
[4, 5, 6]
]]
# 使用列表推导式
flat_list = [x for list0 in list for list1 in list0 for x in list1]
# [1, 2, 3, 4, 5, 6]
# 可读性太差,易出错。这种时候更建议使用普通的循环
flat_list = []
for list0 in list:
for list1 in list0:
flat_list.extend(list1)
# 在列表推导式的推导过程中,对于输入序列的每个值来说,都可能要创建仅含一项元素的全新列表。因此数据量大时很耗性能。
# 使用生成器表达式
list = (x ** 2 for x in range(0, 1000000000))
# 生成器表达式返回的迭代器,只有在每次调用时才生成值,从而避免了内存占用
迭代
list = ['a', 'b', 'c', 'd']
for index, value in enumerate(list):
print(index)
for index, value in enumerate(list, 2):
print(index)
list_a = ['a', 'b', 'c', 'd']
list_b = [1, 2, 3]
for letter, number in zip(list_a, list_b):
print(letter, number)
a = [1, 2, 3]
b = ['w', 'x', 'y', 'z']
for i in zip(a,b):
print(i)
关于for和while循环后的else块
循环正常结束之后会调用else内的代码
循环里通过break跳出循环,则不会执行else
要遍历的序列为空时,立即执行else
反向迭代
对于普通的序列(列表),我们可以通过内置的reversed( )函数进行反向迭代:
list_example = [i for i in range(5)]
iter_example = (i for i in range(5))
set_example = {i for i in range(5)}
for i in reversed(list_example):
print(i)
reversed(iter_example)
除此以外,还可以通过实现类里的__reversed__方法,将类进行反向迭代:
class Countdown:
def __init__(self, start):
self.start = start
def __iter__(self):
n = self.start
while n