python 迭代器的切片、排列组合、索引、多迭代、链式迭代、生成器

特点

  1. 访问集合元素的一种方式。
  2. 迭代器是一个可以记住遍历的位置的对象。
  3. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
  4. 迭代器有两个基本的方法:iter() 和 next()。
  5. 列表(list),元组(tuple),字典(dict),集合(set),字符串(str)都可用于创建迭代器列表
  6. 文件也是一个迭代器,可以使用next方法逐行读取
  7. 迭代到结尾会抛出 StopIteration异常

iter()、next()

使用iter方法创建迭代器对象,使用next由前向后访问元素

def ex1():
    lst = [1, 2, 3, 4]
    iterList = iter(lst)
    print(next(iterList))   # 1
    print(next(iterList))   # 2
    print(next(iterList))   # 3
# ex1()

用法

for循环

def ex2():
    lst = [1, 2, 3, 4]
    iterList = iter(lst)
    print(next(iterList))   # 1
    for i in iterList:
        print("now", i)  #会接着上个迭代器进行访问
    # print(next(iterList))  # 抛出异常
    # 相当于
    # for i in range(4):
    #     print("now", next(iterList))

创建迭代器

类迭代器

需要实现self.__iter__方法和self.__next__方法,从而使类成为一个迭代器,能够调用iter()和next()方法

class MyIter:
    def __init__(self, value):
        self.num = value
        self.value = 0
    # 设置初始值\状态
    def __iter__(self):
        self.value = self.num
        return self
    def __next__(self):
        temp = self.value
        self.value += 1
        return temp
def testMyIter():
    iter_test = MyIter(4)
    iterator = iter(iter_test)
    print(next(iterator))
    print(next(iterator))
    print(next(iterator))
# testMyIter()

反向迭代

  1. 列表、元组、字典等,可reversed函数可以进行反向迭代
  2. 类迭代器需要实现__reversed__方法才能反向迭代
  3. 也可以将数据填充到一个列表然后反向迭代
def reversedTest():
    lst = [1, 2, 3, 4]
    for i in lst:
        print(i)
    print("=="*20)
    for i in reversed(lst):
        print(i)
 # reversedTest()

生成器

使用yield表示生成的对象

def countFrom(d):
    print("开始从%d计数"%d)
    while d > 0:
        yield d
        d -= 1
    print("计数完成!")
def testCountFrom():
    generator = countFrom(10)
    for i in generator:
        print(i)
    # next(generator)   #抛出StopIteration异常
    print(generator)    # 生成器类型
# testCountFrom()

切片

特点

  1. 需要import itertools中的islice()
  2. islice() 会消耗掉传入的迭代器中的数据,
    如果islice消耗完全部数据后再next后者islice相同元素会报错
  3. islice(iterator, start, None) = iterator[start:]
    islice(iterator, None, end) = iterator[:end]
  4. islice(iterator, start, end) = iterator[start:end]
from itertools import  islice
def ex5():
    d = 0
    while d < 20:
        yield d
        d += 1
def test_1Ex5():
    generator = ex5()
    test_generator = generator
    # 报错 TypeError: 'generator' object is not subscriptable
    # test_generator = generator[1:5] 
    # test_generator = islice(generator, 1, 5) # 1, 2, 3, 4
    for i in test_generator:
        print(i)
    next(test_generator) #报错
# test_1Ex5()

排列、组合

  1. from itertools import permutations
  2. 用法
from itertools import permutations
from itertools import combinations
from itertools import combinations_with_replacement
def ex6():
    items = ['a', 'b', 'c', 'd']
    length = 2
    print("="*20 + "排列" + "="*20)
    for sequence in permutations(items, length):
        print(sequence)
    print("=" * 20 + "组合" + "=" * 20)
    for sequence in combinations(items, length):
        print(sequence)
    print("=" * 20 + "同一元素可以被使用多次" + "=" * 20)
    for sequence in combinations_with_replacement(items, length):
        print(sequence)
# ex6()

索引迭代

  1. 内置的enumerate
  2. 用法:list、 dict、 tuple、 set
  3. 使用start指定开始索引号,这种情况在遍历文件时想在错误消息中使用行号定位时候非常有用
def ex7():
    lst = [1, 2, 3, 4]
    start = 1
    for index, val in enumerate(lst, start):
        print("index:{}, val:{}".format(index, val))
# ex7()

多迭代

  1. 使用zip函数
  2. 可以使用dict(zip())打包生成字典
def ex8():
    # 长度相同
    x_val = [1, 2, 3, 4]
    y_val = ['a', 'b', 'c', 'd']
    # 长度不同时按最短结束迭代
    x_val = [1, 2, 3]
    y_val = ['a', 'b', 'c', 'd']
    # 如果按长的进行终止迭代
    # 使用zip_longest(x_val, y_val, fill_value="None")
    for num, char in zip(x_val, y_val):
        print(num, char)
# ex8()

链式迭代

from itertools import chain
def ex9():
    x_val = [1, 2, 3, 4]
    y_val = ['a', 'b', 'c', 'd']
    for item in chain(x_val, y_val):
        print(item)
# ex9()

参考书籍:python cookbook第三版

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中的迭代器生成器是一种基于惰性计算的概念,它们可以有效地处理大量的数据或者无限序列。下面我将分别介绍迭代器生成器迭代器(Iterator)是一个实现了迭代协议(Iterator Protocol)的对象。通过调用内置函数 `iter()` 可以将可迭代对象转换为迭代器迭代器对象可以使用内置函数 `next()` 来逐个访问数据元素,直到没有更多的元素可供访问时,会引发 `StopIteration` 异常。例如,可以使用迭代器来遍历列表、元组、集合等容器类型的数据。 生成器(Generator)则是一种特殊的迭代器。它不需要显式地实现迭代协议,而是通过函数中的 `yield` 关键字来实现惰性计算。生成器函数在每次调用时返回一个值,并在下一次调用时从上一次离开的位置继续执行。这样可以节省大量的内存空间,并且提高程序的效率。生成器函数定义时使用 `def` 关键字,并包含至少一个 `yield` 关键字。 下面是一个简单的示例代码,演示了如何使用迭代器生成器: ```python # 使用迭代器遍历列表 my_list = [1, 2, 3, 4, 5] my_iter = iter(my_list) while True: try: item = next(my_iter) print(item) except StopIteration: break # 使用生成器生成斐波那契数列 def fibonacci(): a, b = 0, 1 while True: yield a a, b = b, a + b fib = fibonacci() for i in range(10): print(next(fib)) ``` 希望以上解释能够帮助你理解迭代器生成器的概念。如果有任何进一步的问题,请随时提问!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值