python 序列

python序列

容器序列

list tuple collections.deque
以上序列可以存放不同类型的数据

扁平序列

str bytes bytearry 、memoryview、array.array

存放的是值不是引用,只能容纳一种类型

容器序列和扁平序列之间的区别

容器序列存放的是他们所包含的任意类型的对象的引用, 而扁平存放的是值不是引用。扁平序列其实存的是一段连续的内存空间。扁平序列更加的紧凑,但是里面只能存放诸如 字符,字节和数字这种基础类型

序列分为可不可以被修改来分类

  • 可变序列:list、bytearray、array.array、collections.deque 、memoryview.
  • 不可变对象:tuple 、str、 byte

开始学习列表

list 可变序列

  • 列表推倒式
  • 生成器推导式

1 列表推导式
首先下来看下将字符串编程unicode 码位的列表

str1 = "abcdef"
codes = []
for code in str1:
    codes.append(ord(code))
print(codes) # [97, 98, 99, 100, 101, 102]

使用列表推导式实现,比较易读

str1 = "abcdef"
codes = [ord(code) for code in str1]
print(codes) # [97, 98, 99, 100, 101, 102]

使用生成器生成

str1 = "abcdef"
codes = (ord(code) for code in str1)
print(list(codes)) #[97, 98, 99, 100, 101, 102]

列表推倒是生成器的区别就是,推导式直接就会分配一个列表长度的内存,如果列表非常大的话就会占用很大的内存。生成器就当执行到哪里才分配内存空间。不需要一开始就需要占用很大的内存空间。

注意: 列表推导式也不能被滥用,当推导的代码超过两行时候最好用for循环,这样可读性比较好。


2 列表推导式的使用

  • 可以用来简化代码
  • 可以用来代替python内置的filter map这些函数, 可读性比filter和map 要好

先来看看filter 和map 的使用
map: 参数通用一个函数并行使用
将列表中每个元素都增加100

def map_list(n):
    return n + 100
list1 = [1, 2, 3, 4, 5]
new_ist = map(map_list, list1)
print(list(map(map_list, list1))) #[101, 102, 103, 104, 105]

filter
筛选出 为偶数的数据

list1 = [1, 2, 3, 4, 5]
def filter_seq(n):
    return n % 2 == 0
print(list(filter(filter_seq, list1))) # [2, 4]
# 返回的是被过滤元素的本身而不是 计算过的数据

使用列表推导式代替map

list1 = [1, 2, 3, 4, 5]
list_new = [(n + 100) for n in list1]
print(list_new) # [101, 102, 103, 104, 105]

使用列表推导式代替filter

list1 = [1, 2, 3, 4, 5]
list_new = [n for n in list1 if n % 2 == 0]
print(list_new)# [2, 4]

使用列表推导式计算笛卡尔积

colors = ["black", "white"]
sizes = ["S", "M", "L"]
tshirts = [(color, size) for color in colors  for size in sizes]
print(tshirts)
# [('black', 'S'), ('black', 'M'), ('black', 'L'), ('white', 'S'), ('white', 'M'), ('white', 'L')]

# 这样就产生了一个好像元组列表的一样

列表推导的作用: 生成列表。

引出生成器

上面是列表推导式,用来生成列表。如果生成其他类型的序列,就用到生成器表达式。用来生成列表以外的序列类型。
下面来介绍如何生成列表以外的序列类型。

还是要先来比较一下 列表推导式和生成器表达式。
虽然也可以用列表推导式来初始化元组,数组或者其他的序列类型。但是生成器表达式是更好的选择。原因: 山城区表达式背后遵循了迭代器协议,可以逐个的产出元素,而不是先建立一个完整的列表,然后再把这个列表传递到某个构造函数。 生成器表达式更加的节省内存。

和列表推导式相比 把 [] 方括号换成了 ()圆括号

str1 = "abcdefg"
tuple1 = list(ord(s) for s in str1)
tuple2 = tuple(ord(s) for s in str1)
print(tuple1)
print(tuple2)
# [97, 98, 99, 100, 101, 102, 103]
# (97, 98, 99, 100, 101, 102, 103)

使用生成式表达式 计算笛卡尔积

colors = ["black", "white"]
sizes = ["M", "L"]
for tshirt in ('%s %s' % (c, s) for c in colors for s in sizes):
    print(tshirt)

# black M
# black L
# white M
# white L
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值