读书笔记"/>
《Fluent Python》读书笔记
前面使用列表解释非常强大了,那么又为什么要引入产生表达式呢?如果仔细地看一下前面的解释表达式,它会把每一项值都计算出来,如果只是项数比较少时,或许是比较好的方式。如果需要访问的数据量有几万,几百万项,那么每一项计算出来是需要很多时间,同时也需要占用很多内存。毕竟内存是一台电脑有限的资源,如果数量用了,就不能再处理了。比如只有4G内存,那么最大也只能处理4G数据。为了突破这两个限制,需要另外一种语法,就是产生表达式。
产生表达式的语法跟列表解释是一样的,只不过它是在外面包含一对圆括号,而不方括号。可以使用下面的代码来比较两者的区别:
s = 'abcde'
t = tuple(ord(x) for x in s)
print(t)
n = ['1','2','3']
l = [(x,y) for x in s for y in n]
print(l)
ge = ((x,y) for x in s for y in n)
print(ge)
for g in ge:
print(g)
列表解释是[(x,y) for x in s for y in n],产生式表达式是((x,y) for x in s for y in n)。
元组分解
当一个元组里的元素要取出来时,叫做元组分解。第一种方法是并行赋值的方式:
a, b = (1, 2)
这样在左边是逗号表达式,右边是元组,就可以并行赋值获得元组对应位置的值,如果不想要的值,可以采用下划线_的占位符:
_, b = (1, 3)
用*收集元组多余项
在定义函数参数时,可以使用*arg的方式来收集多个参数为列表的形式,这种方式在并行赋值里也可以使用:
a, b, *rest = range(5)
print(a,b,rest)
结果如下:
0 1 [2, 3, 4]
由此可见,*rest部分收集所有剩余部分的元素。
a,*rest, b = range(5)
print(a,b,rest)
可以放在不同的位置上,结果输出:0 4 [1, 2, 3]。
嵌套元组分解
l = [('a','b',(1,2)),('a','b',(3,4))]
for a, b, (c,d) in l:
print(a,b,c,d)
在这里由于('a','b',(1,2))是元组嵌套,所在采用a, b, (c,d)方式来分解。
命名元组提供元素按名称分解,方便调试和使用。
Card = collections.namedtuple('Card', ['rank', 'suit'])
切片
所有序列性的容器都支持切片,list,tuple,str等等。
切片重点:最后元素不包含,因为python是以0索引开始。
列表的排序sort函数和内置函数sorted排序的区别
a1 = ['a','b','z','o','d']
print(sorted(a1))
print(a1)
a1 = ['a','b','z','o','d']
print(a1.sort())
print(a1)
从上面例子可见,列表排序是在原列表里修改位置,而内置函数是产生一个新列表返回,原来列表不改变。
玩转人工智能库-深入浅出OpenCV
更多推荐
《Fluent Python》读书笔记
发布评论