首页 > 其他分享 >迭代器与生成器

迭代器与生成器

时间:2023-06-10 16:26:04浏览次数:32  
标签:__ 迭代 生成器 iter next test print

迭代器


  • 迭代器可以记住元素的位置
  • 只会往前不能往后
  • 可以用 iter()创建迭代器对象
  • 用 next()打印出来,可以看到第一个 next()的值只会打印第一个
  • 可以用 for 循环遍历出来,for 循环是一个特殊的迭代器
list1 = [1, 2, 3, 4]

# 创建迭代器对象
a = iter(list1)
print(next(a))
print(next(a))
print(next(a))

# 用for循环遍历出来
for i in a:
    print(i)

用 class 创建迭代器


  • __iter__() 方法返回的是一个迭代器对象
  • __next__() 方法会返回下一个迭代器对象
# 创建迭代器
class Test:
    def __iter__(self):
        self.a = 1
        return self

    def __next__(self):
        x = self.a
        self.a += 1
        return x
    
test = Test()
test_iter = iter(test)
print('-------------------------')
print(next(test))
# 1
# print(next(test))
# print(next(test))
print(test)
# <__main__.Test object at 0x00000219CD42A0A0>
# print(test_iter)
# <__main__.Test object at 0x00000219CD42A0A0>
print(type(test))
# print(type(test_iter))

image.png

  • 无论打印 test 对象还是打印 test_iter 对象,它们都是 Test()类的实例对象,都会,返回同样的字符串形式

image.png

  • 或者在 print (next (test.__iter__())) 也会正常输出,是因为调用了 Test 类中的 __iter__方法

StopIteration


StopIteration 用于标识迭代完成,防止出现无限循环的情况,在 __next__() 方法中可以设置在完成指定循环次数后触发 StopIteration 异常来结束迭代

  • 例子在迭代 20 次后停下迭代
12345678910111213141516171819Traceback (most recent call last):
  File "d:\桌面\python基础\14.迭代器StopIteration.py", line 31, in <module>
    print(next(test_iter), end='')
  File "d:\桌面\python基础\14.迭代器StopIteration.py", line 24, in __next__
    raise StopIteration('超过了')
StopIteration: 超过了

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "d:\桌面\python基础\14.迭代器StopIteration.py", line 32, in <module>
    except StopIteration('超过20 了'):
TypeError: catching classes that do not inherit from BaseException is not allowed

生成器


  • 使用了 yield 函数被称作是生成器
  • 生成器就是一种特殊的迭代器
  • 调用生成器函数返回的是一个迭代器对象
  • 在调用 yield 函数生成,在每次执行到 yield 函数时会暂停保存当前运行的所有信息,并在下一次执行 next()方法时从当前位置执行

案例

# 调用生成器实现斐波那契数列
# 两数之和等于第三个数,用第三个数加下一个数

import sys

def generate(n):
    a,b, counter = 0, 1, 0
    while True:
        if counter>n:
            return
        yield a
        a, b = b, a+b                
        counter += 1

g = generate(20)

while True:
    try:
        print(next(g), end='')
    except StopIteration:
        sys.exit()

标签:__,迭代,生成器,iter,next,test,print
From: https://www.cnblogs.com/yuzai-xin/p/17471433.html

相关文章

  • 微课--Python生成器函数定义与使用(19分钟)
    8.5 生成器函数定义与使用(书稿节选)如果函数中包含yield语句,那么调用这个函数得到的返回值不是单个值,而是一个包含若干值的生成器对象,这样的函数也称生成器函数。代码每次执行到yield语句时,返回一个值,然后暂停执行,当通过内置函数next()、for循环遍历生成器对象元素或其他方式显式......
  • 详解Python生成器函数和生成器对象的原理和用法
    包含yield语句的函数可以用来创建生成器对象,这样的函数也称生成器函数。yield语句与return语句的作用相似,都是用来从函数中返回值。与return语句不同的是,return语句一旦执行会立刻结束函数的运行,而每次执行到yield语句并返回一个值之后会暂停后面代码的执行,下次通过生成器对象的__n......
  • 下标,指针,迭代器
    1//使用下标遍历数组中的元素2inta[4]={1,2,3,4};3for(size_ti=0;i<4;++i)4{5cout<<a[i]<<endl;6}1//使用下标任意访问数组中某个元素2inta[4]={1,2,3,4};3cout<<a[1]<<endl;1//使用指针访问遍历数组中......
  • 代码随想录算法训练营第十四天|理论基础 ● 递归遍历 ● 迭代遍历 ● 统一迭代
    理论基础满二叉树概念完全二叉树概念二叉搜索树概念平衡二叉搜索树概念二叉树存储方式:链式存储和顺序存储二叉树遍历方式:前中后序遍历,层次遍历。二叉树的代码定义publicclassTreeNode{intval;TreeNodeleft;TreeNoderight;TreeNode(){}TreeNode(intval){this.v......
  • python反射、装饰和生成器
    1.反射反射允许使用变量的值(而不是变量的名)对成员进行访问反射的功能:设置属性读取属性删除属性判断属性classA:class_name="A"age=18defshow_me(self):print(class_name)attr_name="test_case_name"setattr(A,attr_name,"sex")#设置属......
  • 2023年6月6日,泛型,迭代器
    1.泛型1.泛型泛型是一种数据安全的做法,限制了集合中元素的类型ArrayList<String>objects=newArrayList<>();/***<E>元素*<T>类型*<K,V>键值*<N,V>名值*@param<E>*/publicclassMyArrayList<E>{publicvoidadd(Ee){}}......
  • 生成器
    生成器生成器的定义:在函数里面具有yield关键字的函数就是生成器。生成器的作用:节省了内存空间在调用函数的时候就不会执行函数体代码了,变成了生成器。"""生成器其实也是迭代器"""defindex():print('first')yieldprint('second')res=index()......
  • MybatisPlus代码生成器
    MybatisPlus代码生成器这里讲解的是新版(mybatis-plus3.5.1+版本),旧版不兼容官方文档:https://baomidou.com/(建议多看看官方文档,每种功能里面都有讲解)https://cloud.tencent.com/developer/article/2119707配置这里的配置表格和官方文档一致手动配置代码生成器建表,插入数......
  • Qt迭代器(Java类型和STL类型)详解
    迭代器为访问容器类里的数据项提供了统一的方法,Qt有两种迭代器类:Java类型的迭代器和STL类型的迭代器。两者比较,Java类型的迭代器更易于使用,且提供一些高级功能,而STL类型的迭代器效率更高。 Java类型迭代器对于每个容器类,有两个Java类型迭代器:一个用于只读操作,一个用于......
  • 生成器
    生成器就是节省空间,在函数里出现关键字yield,函数就变成了生成器,就不再执行函数了想要使用生成器,只需要使用next取值即可每next取一次值代码走到下一个yield处停止yield后面如果有很多数据,会以元组的形式输出defindex():print('执行')yield 123,234,345res=index() ......