oeasy教python108 列表_加法_增强赋值_加等于_extend_扩展列表

回忆

  • 列表 赋值运算 两种形式

    1. 将列表 直接 赋值

      • 造成两个列表指向同一个对象

      • 一改全改

    2. 将 列表副本 赋给 变量

      • 这两个列表变量指向不同的对象

      • 互不影响

clist1 = list("oeasy")
clist2 = clist1
clist2 = clist1.copy()

图片描述

  • 列表 能相加 吗?🤔

lst1 + lst2

回忆字符串

  • 字符串可以进行

    • 加法

    • 乘法

"动词打次" + "东东打次"
"动词打次" * 3 + "东东打次"
("动词打次" * 3 + "东东打次") * 4
  • 字符串加法

    • 有啥应用 吗?

四大名著大乱炖

图片描述

import random

# 从四大名著中分别提取角色和事迹
# 《西游记》
journey_to_the_west_characters = ["孙悟空", "唐僧", "沙僧"]
journey_to_the_west_stories = ["大闹天宫", "三打白骨精", "真假美猴王"]

# 《红楼梦》
dream_of_the_red_chamber_characters = ["林黛玉", "贾宝玉", "薛宝钗"]
dream_of_the_red_chamber_stories = ["黛玉葬花", "宝玉挨打", "宝钗扑蝶"]

# 《三国演义》
romance_of_the_three_kingdoms_characters = ["刘备", "关羽", "诸葛亮"]
romance_of_the_three_kingdoms_stories = ["桃园结义", "草船借箭", "空城计"]

# 《水浒传》
water_margin_characters = ["宋江", "武松", "鲁智深"]
water_margin_stories = ["怒杀阎婆惜", "景阳冈打虎", "倒拔垂杨柳"]

# 汇总角色列表
all_characters = journey_to_the_west_characters + \
                 dream_of_the_red_chamber_characters + \
                 romance_of_the_three_kingdoms_characters + \
                 water_margin_characters

# 汇总事迹列表
all_stories = journey_to_the_west_stories + \
              dream_of_the_red_chamber_stories + \
              romance_of_the_three_kingdoms_stories + \
              water_margin_stories

# 随机搭配角色和事迹
random_character = random.choice(all_characters)
random_story = random.choice(all_stories)

print(f"{random_character}——{random_story}")

结果

图片描述

  • 代码中的反斜杠 是

    • 续航符

    • line-continuation character

# 汇总角色列表
all_characters = journey_to_the_west_characters + \
                 dream_of_the_red_chamber_characters + \
                 romance_of_the_three_kingdoms_characters + \
                 water_margin_characters
  • 可以避免 横向滚动

列表加法

lst1 = list(range(3))
print("lst1:", lst1)
lst2 = [3, 4, 5]
print("lst2:", lst2)
print("lst1 + lst2:", lst1 + lst2)
  • 数字列表

    • 可以相加

图片描述

  • 字符串列表

    • 可以 相加 吗?

加法运算

  • 字符串列表

    • 也是可以相加的

lst1 = list("oeasy")
lst2 = list("o2z")
print(lst1 + lst2) 
  • 但是 相加的结果

    • 没赋给 任何变量

    • 直接 就

图片描述

  • 想 不让他

    • 咋办呢?

加完了赋值

  • 把加完的结果赋给 lst3

lst1 = list("oeasy")
lst2 = list("o2z")
lst3 = lst1 + lst2 
  • 相加结果 有 变量名引用

    • 就不会 被 垃圾回收

图片描述

  • 什么是垃圾回收呢?

垃圾回收

  • c语言

    • 手动 分配和释放内存

  • 内存空间

    • 分配容易

      • 但 容易 忘记释放

    • 结果

      • 占用内存 越来愈多

      • 造成泄漏、崩溃

图片描述

  • python 等现代语言 解释器

    • 定期观察 已经分配的 内存空间

      • 是否 还有变量 在引用

      • getrefcount

    • 没有引用的话

      • 就垃圾回收

      • garage collection

lst3 = lst1 + lst2 
  • 把求和结果 赋给lst3

    • 就能存的住了

  • 如果 把 求和结果

    • 直接 赋给 lst1 呢?

将列表之和赋回给lst1

lst1 = list("oeasy")
lst2 = list("o2z")
lst1 = lst1 + lst2 
  • 赋值成功

图片描述

  • 能用 增强赋值 吗?

增强赋值

增强赋值

是一种 赋值

在赋值之外 还有增强

  • += 就是 增强赋值运算

    • augmented assignment

lst1 = list("oeasy")
lst2 = list("o2z")
lst1 += lst2 
  • lst1 += lst2

    • 相当于 lst1 = lst1 + lst2

图片描述

  • 这俩完全一样吗?

增强赋值运算

  • 从求和结果来看

    • 两者一致

lst1 = list("oeasy")
print("lst1:", id(lst1))
lst2 = list("o2z")
print("lst2:", id(lst2))
lst1 += lst2 
print("lst1:", id(lst1))
  • 增强赋值中 lst1 的 地址没有变

图片描述

  • 先求和 再赋值呢?

观察

lst1 = list("oeasy")
print("lst1:", id(lst1))
lst2 = list("o2z")
print("lst2:", id(lst2))
lst1 = lst1 + lst2 
print("lst1:", id(lst1))
  • 从引用地址 来看

    • l1 使用 l1 + l2 的新地址

    • += 则会保留 l1 原来引用的地址

图片描述

  • 有啥区别吗?

效率

效果 相同 - 但效率不同!

  • 加法运算 效率低

    • 过程是 新建一个列表

    • 然后把 lst1 的列表项都拿过来

    • 再把 lst2 的列表项都拿过来

    • 最后把相加结果 赋给lst1

  • 效率 不如

    • 增强赋值

图片描述

  • 增强赋值 就是

    • 用列表 扩充(extend)列表

extend

  • 列表还真有个成员方法

    • 就叫做 extend

lst1 = list("oeasy")
lst2 = list("o2z")
lst1.extend(lst2)
  • 确实能够扩列

    • 扩展列表

图片描述

  • 这个extend怎么用?

查询帮助

help(list.extend)
  • extend

    • 把参数里面的列表

    • 循环地放到extend方法的主体后面

图片描述

  • 将列表相加

    • lst1 = lst1 + lst2

    • 可以得到列表在 新地址

  • 有 2种方式 可以 扩充列表

    1. lst1 += lst2

    2. lst1.extend(l2)

  • extend(扩列) 和 append(追加)

    • 有什么区别呢?

区别

num_list = [1, 2, 3]
print(num_list)
num_list.append([4, 5])
print(num_list)
num_list.remove([4, 5])
print(num_list)
num_list.extend([4, 5])
print(num_list)
  • 效果不同

图片描述

对比

  • append

    • 添加是 列表项

    • 把列表作为元素 放到最后

  • extend

    • 扩展 原始列表

    • 把 新列表 对接到 原列表 尾巴上

    • 对应 加法赋值

图片描述

对比项appendextend
描述添加的是列表项扩展原始列表
特点将元素作为整体添加到列表末尾把新列表对接到原列表尾巴上,合并两个列表

总结

  • 这次我们了解 列表加法

    1. 对 相加结果 赋值

      - lst1 = lst1 + lst2 
      - 加法的本质 是  将两个列表 拼接
      - 并将 结果位置 赋给帧(frame)上的变量 来引用
    2. 对列表 进行扩充 - 3种做法

      1. lst1 += lst2

      2. lst1[-1:] = lst2

      3. lst1.extend(lst2)

  • 上述 2类方法 结果相同

    • 但是稍有区别

      1. 结果地址

        • 会改变l1地址

        • 后三种不改变地址

      2. 效率不同

        • 后三种效率高

        • 直接扩展列表

图片描述

  • 既然 有 列表加法

    • 那有 列表乘法 吗?🤔

  • 下次再说 👋

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值