python中序列类型和数组之间的区别_Python中序列构成的数组

本文主要讲的是Python中的list,str,bytes以及列表,元组,数组跟队列相关的内容。

python标准库用C实现了丰富的序列类型

容器序列: - list、tuple 和collections.deque这些序列能存放不同类型的数据。

扁平序列 - str,bytes,bytearray,memoryview和array.array,这类序列只能容纳一种类型。

容器序列存放的是它们所包含的任意类型的对象的引用。 扁平序列存放的是值而不是引用。换句话说,扁平序列其实是一段连续的内存空间。

可变序列: - list,bytearrary,array.array,collections.deque 和 memoryview

不可变序列: - tuple,str 和 bytes - 有一个问题frozenset是不是也是不可变序列?

list推导和生成器表达式

列表推导是构建list的快捷方式,而生成器表达式则可以用来创建其他任何类型的序列。

举个栗子:

x = 'abc'

dummy = [ord(x) for x in x] #列表推导

通常的原则:只用列表推导来创建新的列表,并且尽量保持简短。 列表推导可以帮助我们把一个序列或者是其他可迭代类型中的元素过滤或是加工,然后新建一个列表,filter和map函数组合也能达到这一个结果,相对的可读性较差。 比如:

# 使用列表推导

symbol = 'abcde'

beyond_ascii = [ord(s) for s in symbol if ord(s) > 99]

print(beyond_ascii) # [100,101]

# 使用map filter

beyond_ascii_1 = list(filter(lambda c: c > 99,map(ord,symbol)))

print(beyond_ascii_1) # [100,101]

笛卡尔积

用列表推导可以生成两个或以上的可迭代类型的笛卡尔积,笛卡尔积是一个列表。

colers = ['black', 'white', 'blue']

sizes = ['S', 'M', 'L', 'XL']

tshirts = [(coler, size) for coler in colers for size in sizes]

# [('black', 'S'), ('black', 'M'), ('black', 'L'), ('black', 'XL'), ('white', 'S'), ('white', 'M'),

# ('white', 'L'), ('white', 'XL'), ('blue', 'S'), ('blue', 'M'), ('blue', 'L'), ('blue', 'XL')]

tshirts_1 = [(size, coler) for coler in colers for size in sizes] # 调整从句的顺序可以调换位置

# [('S', 'black'), ('M', 'black'), ('L', 'black'), ('XL', 'black'), ('S', 'white'), ('M', 'white'), ('L', 'white'),

# ('XL', 'white'), ('S', 'blue'), ('M', 'blue'), ('L', 'blue'), ('XL', 'blue')]

生成器表达式

虽然也可以使用列表推导来初始化元组,数组或其他数据类型,但是生成器表达式是更好地选择。 因为生成器表达式背后遵守了迭代器协议,可以逐个的产出元素,而不是先建立一个完成的列表,然后再把逐个列表传递到某个构造函数里。明显生成器表达式更能够节省内存。

生成器表达式的语法跟列表差不多,只不过把方括号换成圆括号而已。

# 笛卡尔积

colers = ['black', 'white']

sizes = ['S', 'M', 'L', ]

for tshirt in ('%s%s' %(c,s) for c in colers for s in sizes):

print(tshirt)

生成器表达式会逐个产生元素,而不会一次性产出6个T恤样式列表

元组不仅仅是不可变的列表

元组冲了用作不可变的列表,它还可以用于没有字段名的记录。

元组和记录

元组其实是对数据的记录:元组中的每个元素都存放在记录中一个字段的数据,外加这个字段的位置。正是这个位置信息给数据赋予了意义。

元组拆包

a,b,*rest = range(5)

# a : 0

# b : 1

# rest : [2,3,4]

具名元组

collections.namedtuple是一个工厂函数,它可以用来构建一个带字段名的元组和一个有字段名字的类。

作为不可变列表的元组

元组除了跟增减元素相关的方法之外,元组支持列表的其他所有方法。

切片

为什么切片和区间会忽略最后一个元素?

首先这个习惯复合python,C和其他语言里以0作为其实下标的传统。这样子做可以带来以下的好处。 - 当只有最后一个位置信息时,我们也可以快速看出切片和区间里有几个元素:range(3)和my_list[3]都可以返回三个元素。 - 当起止位置信息都可见时,我们可以快速计算出切片和区间的长度,用最后一个数减去第一个下表即可。 - 这样做也让我们可以利用任意一个下表来吧序列分割成不重叠的两部分,只要写成my_list[:x]和my_list[x:]即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值