Day02_丰富的序列

内置序列概览

1. 根据序列中存放的数据进行分类
    (1)容器序列: 可存放不同类型的项,例如 list tuple collections.deque
    (2)扁平序列: 可存放一种简单类型的项,例如 str、bytes、array.array
    容器序列存放的是各项对象的引用,对象可以是任意类型,扁平序列是在自己内存中存储的值;
2. 补充:
    任何Python对象在内存中都有一个包含元数据的标头,最简单的Python对象,例如一个float,内存标头中有一个值字段和两个元数据字段。
    ob_refcnt: 对象的引用计数
    ob_type: 指向对象类型的指针
    ob_fval: 一个C语言的double类型值,存放float的值
3. 根据序列的可变性进行分类
    (1)可变序列: list、bytearray、array.array、collections.deque
    (2)不可变序列: tuple、str、bytes

一、 列表推导式

# listcomps: 列表推导式 ; genexps: 生成器表达式
# 使用for循环创建一个100以内的奇数列表
print("for循环创建")
# 需要先创建一个空列表
lis = []
# range 包前不包后, 从1开始 100结束
for i in range(1,101):
    # % 求余数
    if i % 2 != 0:
        lis.append(i)
print(lis)
print('------------------------')
# 将for循环改变为列表推导式
print("列表推导式创建创建")
lis1 = [i for i in range(1,101) if i % 2 != 0]
print(lis1)
# 列表推导式的作用并不是做到循环做不到的事情,而是让代码变得更简洁,执行速度也会有极小的提升

1.1 列表推导式的局部作用域

# 设置一个变量x, 初始值为100
x = 100
print("x的初始值是:", x)
lis = []
for y in range(10):
    # 这里主要是为了修改外部x的值,而多做的操作
    x = y + 5
    lis.append(x)
print(lis)
# 此时x的值将会发生改变
print("创建完列表后x的值是:", x)
print('--------------------------')
z = 100
print("z的初始值是:", z)
lis1 = [z + 5 for z in range(10)]
print(lis1)
print("创建完列表后z的值是:", z)
# 这里的作用是,使用列表推导式可以避免在创建序列的时候,中间变量与代码中的某些全局变量一样,导致出现异常BUG
print('--------------------------')
u = [p for p in range(10)]
print(u)
# print(p)  # 此时会报错,因为列表推导式执行完以后,中间变量就会被自动删除掉

1.2 map与filter

print("map函数的使用")
lis = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# lambda表达式 : 前面是函数的参数,后面是返回值,适用于一些比较简单的函数
add = lambda num : num + 5
# map 对可迭代序列中的每个元素执行一次add函数,返回一个生成器
lis1 = map(add, lis)
print('-----------------------')
print("filter函数的使用")
# filter 对可迭代序列中的每个元素执行一次函数,判断结果是否为True,保留所有判断结果为True的元素,返回一个生成器
lis2 = filter(lambda num: num > 10, lis1)
for i in lis2:
    print(i)

二、 生成器表达式

# 生成器表达式和列表推导式形式一样,不同点在于列表用[],生成器用()
# 列表推导式是生成后在使用,生成器表达式则是在使用时逐个生成,更节省内存和时间
# 列表推导式生成的序列可以重复遍历使用,生成器则是只能遍历一次
tup = (x for x in range(100))
print("第一次遍历tup")
for i in tup:
    print(i)
print("第二次遍历tup")
for i in tup:
    print(i)
lis = [x for x in range(10)]
print("第一次遍历lis")
for i in lis:
    print(i)
print("第二次遍历lis")
for i in lis:
    print(i)

三、 序列模式匹配

# 1. 匹配对象是序列
# 2. 匹配对象和模式的项数相等
# 3. 对应的项相互匹配,包括嵌套的
def find(message):
    match message:
        # 匹配第一项是hello, 第二项任意内容,同时将该内容赋值给name变量
        case ['hello', name]:
            print("你好", name)
        # 要求序列第二项是bad, 序列只能有三项, 第一和第三项任意
        case [name, 'bad', gender]:
            print(name, "你是一个坏", gender)
        case [name, 'bad', gender, age]:
            print(name, "你是一个", age , "岁的坏", gender)
        case [name, 'hello', (user, age)]:
            print("你好", name, "你的账号名是", user, "你的年龄是:", age)
        # 一般在末尾加入一个通配符,防止没有任何匹配情况的发生
        case _:
            print("没有匹配到内容")
find(['hello', '世界'])
find(("童话", 'bad', '男孩'))
find(("童话", 'bad', '男孩', 18))
find(['what'])
find("hello tonghua".split(' '))
find("hello tonghua")
find(["tonghua", "hello", ("tonghua12344", 18)])
find(["tonghua", "hello", "tonghua12344", 18])
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值