《Fluent Python》读书笔记-1.4 产生表达式

前面使用列表解释非常强大了,那么又为什么要引入产生表达式呢?如果仔细地看一下前面的解释表达式,它会把每一项值都计算出来,如果只是项数比较少时,或许是比较好的方式。如果需要访问的数据量有几万,几百万项,那么每一项计算出来是需要很多时间,同时也需要占用很多内存。毕竟内存是一台电脑有限的资源,如果数量用了,就不能再处理了。比如只有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
https://edu.csdn.net/course/detail/26616

 

发布了2059 篇原创文章 · 获赞 574 · 访问量 767万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览