python11迭代器与生成器

    科技2025-07-20  7

    python笔记10迭代器与生成器

    先声明一下 各位大佬,这是我的笔记。 如有错误,恳请指正。 另外,感谢您的观看,谢谢啦!

    (1).迭代器

    迭代器是一种迭代取值的工具

    我们先来看什么是可迭代对象,

    str,list,tuple,dict,set,以及生成器

    判断是否为一个可迭代对象的两种方法

    看函数的说明是否有,_iter_____

    用isinstance函数

    from collections import Iterable int1 = 9 str1 = 'sfda' list1 = [1,2,3,4,5,'d','f'] tuple1 = (1,2,3,'f',2) dict1 = {'one':1,'two':2,'three':3} set1 = {1,2,3,1,4,'fo'} print(isinstance(int1,Iterable)) print(isinstance(str1,Iterable)) print(isinstance(list1,Iterable)) print(isinstance(tuple1,Iterable)) print(isinstance(dict1,Iterable)) print(isinstance(set1,Iterable)) False True True True True True

    这下谁是谁不是清楚了吧

    可迭代对象和迭代器的工作原理

    可迭代对象调用了自身的__iter__()变成了迭代器,而迭代器就可以用__next__方法

    把可迭代对象变成迭代器的代码块

    li1 = [1,2,3,4] lis_iter = li1.__iter__() str1_iter = str1.__iter__() print(isinstance(str1_iter,Iterator)) '''可以用最后一句检验它是不是迭代器''' str1_iter2 = iter(str1) print(isinstance(str1_iter2,Iterator))

    这两种方法的结果都是True

    接下来打印迭代器的内容

    str1 = 'sfda' #str1_iter = str1.__iter__() str1_iter2 = iter(str1) print(isinstance(str1_iter2,Iterator)) print(str1_iter2.__next__()) print(str1_iter2.__next__()) print(next(str1_iter2)) print(next(str1_iter2)) print(next(str1_iter2)) s f d a StopIteration

    上面展示了两种方法

    没超限之前是可以正常打印的,一旦超限就会报错了

    (2).生成器

    在做爬虫,数据分析时,经常会遇到大量的数据,而这些数据往往使用一次就没有价值了,所以不能让他们白白占用存储空间还没用,所以生成器起作用了,生成器实际上是一种一边循环,一边运算的机制。这样就能有效的节省空间,节省资源。

    我们先来看看”元组推导式“

    tu = (i for i in range(1,6)) print(next(tu)) print(next(tu)) print(next(tu)) print(next(tu)) print(next(tu)) 1 2 3 4 5

    实际上没有‘元组推导式’,是因为被用来当作生成器了

    我们再编写一个生成器函数

    def test(num): n = 0 li = [] while n<num: li.append(n) yield n n+=1 res = test(2000000) print(next(res)) print(next(res))

    这个函数中有几个要点

    yield实际上是一种return,不过return是会结束整个函数,而yield会完成返回值的工作后会继续程序每输入一个print(next(res))就会新生成一个,这就是生成器,即使test(2000000)也不会占用太多资源 def test(): a = yield "1111" print('--1--') yield a res = test() print(next(res)) print(res.send("2222")) 1111 2222

    send是发送函数会发送数值给yield返回值

    Processed: 0.010, SQL: 8