Skip to content

Latest commit

 

History

History
177 lines (118 loc) · 4.23 KB

177-234326-缝编号_enumerate.sy.md

File metadata and controls

177 lines (118 loc) · 4.23 KB
show version enable_checker
step
1.0
true

enumerate 编号

回忆

  • 上次研究了 zip
  • zip 是一个老裁缝
  • 几列可迭代对象可以用 zip 缝合为 zip 对象
  • zip 对象是可迭代的
  • zip 缝合的对象也可以解组为独立的几组元组
  • 其实还有一个 enumerate 函数好像也是编组
  • 有什么区别么?🤔

先查手册

图片描述

  • 看起来是给一个可迭代对象缝上编号
  • 动手试试

enumerate

图片描述

  • 这很简单啊
  • 就是缝上编号啊

图片描述

  • 如果用 zip 应该怎么做呢?

zip 方法

图片描述

  • 如果我想从 1 开始呢?
  • 需要控制 range 的范围

控制开头

图片描述

  • 使用 enumerate 可以控制起始数字么?

起始数字

图片描述

图片描述

  • 构造函数中的参数有个 start
  • start 指的是开始数字
  • 默认是从 0 开始
  • 不过不能设置步长
  • 如果想设置步长怎么办?

回忆步长

图片描述

  • 这样就可以把特定编号缝合到 iterable 的对象上去了
  • 这样可以优化循环么?

优化循环

图片描述

  • 原来是这么写的

图片描述

  • 尝试优化

优化

图片描述

图片描述

  • 这优化了么?

构造

import time
t0 = time.time()
l =[-1, 1, -2, 2]
for i in range(len(l)):
    if l[i] < 0:
        l[i] = 0
print(l)


t1 = time.time()

l = [-1, 1, -2, 2]
for index,num in enumerate(l):
    if num < 0:
        l[index] = 0
print(l)
t2 = time.time()


print((t1-t0)/(t2-t1))

图片描述

  • 提速不少

  • 如果我再遍历 iterable对象 的时候修改了 iterable对象

  • 会如何呢?

循环中改变可迭代对象

图片描述

  • 这只能发生在可变的可迭代对象上
    • 比如说列表
  • 有一个计数器 counter 盯着当前的 target
  • 每次循环 counter 就递增
  • 直到到达了整个可迭代对象的边界
  • 如果删除元素可能会引起跳过某些元素
  • 我们来做一个试试

循环中删除

图片描述

  • 第三轮符合 if 条件
  • 删除
  • 删除之后 len(a)也从 5 到了 4
  • 所以 4 次之后就结束了
  • 循环中是否可以添加呢?

循环中添加

图片描述

  • 添加时可以的
  • 会增大循环次数
  • 甚至实现死循环的效果
  • 除了 append 在结尾添加之外
  • 可以 insert 在开头添加么?

在开头添加

图片描述

  • 在开头添加也是可以的
  • 不过要注意要把 if 的触发条件满足的那一项修改一下
  • 否则的话
  • 会形成无限次在开头插入的效果

总结

  • 这次研究了 enumerate()
    • enumerate()是个特殊的 zip 函数
    • enumerate()把列表和编号缝在一起
    • 还可以设置起始值 start
  • 几列可迭代对象可以缝合成 zip 对象
    • enumerate 可以给缝合好的 zip 对象缝上编号
    • 这样可以把 zip 组转化为为有编号的 zip 组
  • 遍历过程iterable的过程中还可以
    • 增删改iterable
  • 可迭代的可迭代对象
    • 就是列表的嵌套
    • 得到个二维列表
    • 如何遍历二维列表呢??🤔
  • 下次再说 👋