《Fluent Python》读书笔记-1.3 内置序列容器

在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

 

发布了2053 篇原创文章 · 获赞 565 · 访问量 762万+

猜你喜欢

转载自blog.csdn.net/caimouse/article/details/103402257