在python内置了很多序列容器,并且是采用C语言实现,如果按保存不同的数据类型来分,可以分为两类:
一类元素可以不同数据类型的容器:list,tuple, collection.deque
一类元素只能同一样数据类型的容器:str,bytes,bytearray,memoryview,array.array
如果按是否可以修改元素来分:
一类可修改的:list,byteaarray, array.array, collection.deque, memoryview
一类不可修改的:tuple, str, bytes
列表解释
为什么要使用列表解释?因为它提供了可读性,用下面两个例子来比较:
a = 'abcdefg'
c = []
for s in a:
c.append(ord(s))
print(c)
l = [ord(s) for s in a]
print(l)
在这里可以看到列表解释只用一行代码,而传统循环的方式需要三行代码,并且可读性更加好。并且列表解释的效率上比循环更加高效。
列表解释变量的区域化作用域
d = [ord(a) for a in a]
print(a, d)
在列表解释里,最后一个a是表示字符串'abcdefg',第一个a和第二个a是表示迭代变量。
列表解释与map和fiter比较
怎么样在这两者之间进行选择呢?因为两者都能做相同的事情。原来认为列表解释效率很慢,所以选择map和fiter实现,其实两者速度差不多,如下代码来测试:
#python 3.7.4,opencv4.1
#蔡军生 https://blog.csdn.net/caimouse/article/details/51749579
#[email protected]
#
import timeit
TIMES = 10000
SETUP = """
symbols = '$¢£¥€¤'
def non_ascii(c):
return c > 127
"""
def clock(label, cmd):
res = timeit.repeat(cmd, setup=SETUP, number=TIMES)
print(label, *('{:.3f}'.format(x) for x in res))
clock('listcomp :', '[ord(s) for s in symbols if ord(s) > 127]')
clock('listcomp + func :', '[ord(s) for s in symbols if non_ascii(ord(s))]')
clock('filter + lambda :', 'list(filter(lambda c: c > 127, map(ord, symbols)))')
clock('filter + func :', 'list(filter(non_ascii, map(ord, symbols)))')
玩转人工智能库-深入浅出OpenCV
https://edu.csdn.net/course/detail/26616