当前位置: 首页 > 科技观察

Python骚操作从列表推导和生成器表达式开始

时间:2023-03-15 16:14:46 科技观察

Python操作从列表理解和生成器表达式开始转载本文请联系PythonMind公众号。序列是指一组数据,按存储类型可分为容器序列和平面序列,按是否可修改可分为不可变序列和可变序列。容器序列和平序列容器序列存储对象引用,包括列表、元组、collections.deque。flatsequence存储对象的值,包括str、bytes、bytearray、memoryview和array.array。扁平序列的值是基本类型char、byte和numeric。不可变序列和可变序列不可变序列,包括tuple、str、bytes。可变序列,包括list、bytearray、array.array、collection.deque、memoryview。下图左边是父类,右边是子类。可见,可变序列继承自不可变序列,扩展了可变方法:列表推导。出来,比如我们要将字符串“abc”转换成一个新的列表[“a”,“b”,“c”],常规写法:symbols="abc"codes=[]forsymbolinsymbols:codes.append(symbol)print(codes)#["a","b","c"]使用for循环和列表追加方法。其实可以直接使用append方法:symbols="abc"codes=[symbolforsymbolinsymbols]这个叫列表推导,是比较Python化的写法。无论是书写效率还是可读性,listcomprehension都更好,可以说是构建列表的捷径。但它不能被滥用。总的原则是如果列表推导的代码超过两行,就应该考虑使用append。这不是规定,完全由你自己选择。笛卡尔积是指多个序列中元素的所有组合。我们使用列表理解来实现笛卡尔积:colors=["black","white"]sizes=["S","M","L"]tshirts=[(color,size)forcolorincolorsforsizeinsizes]一行代码是完毕!人生苦短,使用Python,列表理解很精彩,令人惊叹。注意这行代码有两个for循环,相当于:forcolorincolors:forsizeinsizes:运行结果为:[('black','S'),('black','M'),('black','L'),('white','S'),('white','M'),('white','L')]如果改变顺序:[(color,size)forcolorincolorsforsizeinsizes]等价于:forsizeinsizes:forcolorincolors:运算结果不同,观察第二个元素:[('black','S'),('white','S'),('black','M'),('white','M'),('black','L'),('white','L')]生成器表达式在接触生成器时一般会使用yield关键字,这似乎有点复杂。然而,它非常简单。生成器就像一个列表推导,但它用于生成其他类型的序列,例如元组:[]加上括号()就可以了。语法相似,但本质上有很大区别。让我们尝试用生成器表达式实现笛卡尔积,看看有什么变化:colors=["black","white"]sizes=["S","M","L"]tshirts=((color,size)forcolorincolorsforsizeinsizes)运行结果为:at0x000001FD57D2DB30>generatorobject,结果为生成器对象。因为生成器表达式每次迭代只会一个一个地产生元素,所以这里的结果不是一个已经创建好的元组。列表推导一次生成新列表的所有元素。通过迭代输出生成器表达式的结果:fortshirtintshirts:print(tshirt)('black','S')('white','S')('black','M')('white','M')('black','L')('white','L')生成器表达式可以提高程序性能,例如计算两个列表的笛卡尔积,每个列表有1000个元素,生成器表达式可以帮助节省开销运行for循环,即包含100万个元素的列表。yield的作用和return类似,后面会讲到。Tips本节内容是我第一次看时记录的知识点:Python标准库在C中实现了丰富的序列类型,列表推导是指a=[xforxinsomething]的写法.生成器表达式用于生成列表以外的其他类型的序列。它们与列表理解之间的唯一区别是方括号被圆括号代替,例如b=tuple(xforxinsomething)。array.array('I',xforxinsomething),数组构造函数的第一个参数指定数组中的数字如何存储。对于ts??hirtin[c,sforcincolorsforsinsizes],listcomprehension会一次性生成这个list,存入内存,占用资源。对于tshirtin('%s%s'forcincolorsforsinsizes),生成器表达式在循环中只一个一个地产生元素,避免了额外的内存使用并节省了运行for循环的开销。小结本文首先介绍了序列的概念,然后演示了Python的套路操作——列表推导,最后引出了生成器表达式看似复杂但语法简单。列表是可变的,并且有一个不可变的双胞胎,元组。