Skip to content

Latest commit

 

History

History
69 lines (47 loc) · 2.27 KB

迭代器和生成器.md

File metadata and controls

69 lines (47 loc) · 2.27 KB

迭代器和生成器

容器、可迭代对象和迭代器

  • Python中一切皆对象,对象的抽象就是类,对象的集合就是容器,列表,元组,字典,集合都是容器

  • 所有的容器,字符串都是可迭代的

  • 容器是可迭代对象,调用iter()函数返回一个迭代器,迭代器提供了一个next()方法,调用这个方法,得到容器的下一个对象,实现遍历

生成器Generator

  • 生成器是懒人版本的迭代器
  • 初始化一个生成器:(i for i in range(1000))
  • 迭代器:[i for i in range(1000)]
  • 迭代器是一个有限集合,生成器则可以成为一个无限集,调用next(),根据运算生成新的元素作为返回值
  • 对于一个有限元素的生成器,迭代完成后,继续调用next()会出错
  • 生成器只能遍历一次

举例:

  1. 给定一个list和一个指定数字,求这个数字在list中的位置
def index_normal(L, target):
    result = []
    for i, num in enumerate(L):
        if num == target:
            result.append(i)
    return result

print(index_normal([1, 6, 2, 4, 5, 2, 8, 6, 3, 2], 2))

# 使用迭代器
def index_generator(L, target):
    for i, num in enumerate(L):
        if num == target:
            yield i
# index_generator会返回一个生成器对象,需要使用list转换为列表后,才能print输出
print(list(index_generator([1, 6, 2, 4, 5, 2, 8, 6, 3, 2], 2)))

########## 输出 ##########

[2, 5, 9]
  1. 给定两个序列,判定第一个是不是第二个的子序列

    解析:序列就是列表,子序列指的是一个列表的元素在第二个列表中都按顺序出现,但是并不必挨在一起

def is_subsequence(a, b): 
    b = iter(b) # 把列表b转化成一个迭代器
    # (i for i in a),将列表a初始化为一个生成器,可以遍历对象a
    # i in b,判断生成器next()函数遍历a的指是否在迭代器b调用next()得到的对象中
    # all函数,判断一个迭代器的元素是否全部为True
    return all(i in b for i in a) 

print(is_subsequence([1, 3, 5], [1, 2, 3, 4, 5]))
print(is_subsequence([1, 4, 3], [1, 2, 3, 4, 5]))

########## 输出 ##########

True
False