推广 热搜: page  关键词  数据分析  服务  获取  哪些  链接  数据分析系统  搜索  小红 

python_魔法方法(六):迭代器和生成器

   日期:2025-01-02     作者:0omy6    caijiyuan   评论:0    移动:https://sicmodule.kub2b.com/mobile/news/14609.html
核心提示:迭代器自始至终,都有一个概念一直在用,但是我们却没来都没有人在的深入剖析它。这个概念就是迭代。迭代的意思有点类似循环,每

迭代器

自始至终,都有一个概念一直在用,但是我们却没来都没有人在的深入剖析它。这个概念就是迭代。

迭代的意思有点类似循环,每一次的重复的过程被称为迭代的过程,而每一次迭代得到的结果会被用来作为下一次迭代的初始值。提供迭代方法的容器称为迭代器,通常接触的迭代器有序列(列表、元组、字符串)还有字典也是迭代器,都支持迭代的操作。举个列子,通常使用for循环进行迭代。

字符串就是一个容器,同时也是一个迭代器,for语句的作用就是触发这个迭代器的迭代功能,每次从容器里面依次拿出一个数据就,这就是迭代操作。

字典和文件也是支持迭代操作的:

打印结果;

python --> python3.x
go --> go是一种语言语法
int --> python关键字

关于迭代,python还提供了两个BIF:iter()  next()

对一个容器对象调用iter()就得到它的迭代器,调用next()迭代器就会返回下一个值,然后怎么结束了?如果迭代器没有值可以返回,python将抛出一个叫做Stoplteration的异常。

所以,利用这两个BIF,可以分析出for语句其实就是这么工作的:

那么实现迭代器的魔法方法就有两个:__iter__()   __next__()

一个容器如果是迭代器,就必须实现__iter__()方法,这个方法实际上就是返回迭代器本身。接下来就是重点实现的是__next__()魔法方法,因为他决定了迭代器的规则,看一段例子:

这个迭代器的唯一亮点就是没有终点,所以如果没有跳出循环,它会不断迭代下去。那么就可以加一个参数,用于控制迭代的范围。

生成器

前面是迭代器,下面来说生成器

生成器其实就是迭代器的一种实现,那既然迭代器就可以实现,为何还要生成器了?生成器之所以存在就是为了是python更为简洁,因为迭代器需要我们自己去定义一个类和实现相关的方法,而生成器则需要在普通函数中加一个yield语句即可。

生成器的发明,使python模仿协同程序的概念得以实现,所谓协同程序,就是可以运行的独立函数调用,函数可以暂停或者挂起,并需要的时候从程序离开的地方继续或重新开始。

对于调用一个普通的python函数,一般是从函数的第一行代码开始执行,结束与return语句,异常或函数所有语句执行完毕,一但函数将控制权交给调用者,就意味着全部结束。函数中做的所有工作以及保存在局部变量中的数据将丢失。再次调用这个函数时一切都将从头创建。

python是通过生成器来实现类似于协同程序的概念:生成器可以暂时挂起函数,并保留函数的局部变量等数据,然后在再次调用他的时候,从上次暂停的位置继续执行下去。

举个例子:

通过例子,当函数结束的时候,一个StopIteration异常就会被抛出。由于Python的for循环会自动调用next()方法和处理StopIteration异常,所以for循环当然也是可以对生成器产生作用的:

前面说的斐波那契数列例子,也可以用生成器实现:

写到现在,可以很好的用类别推导式了,哈哈,先来看下下面的什么意思吧

含义很简单的,打印100以内能被2整除,不能被3整除

还有集合推导式:

那么有没有字符串推导式,来验证下

看吧,不对吧,打印的是整个包含在字符串中的,所以不存在字符串推导式的说法,那元组了?

看打印出来的信息是generator,这就是生成器,用小括号括起来的正是生成器,来看下效果

用for循环吧剩下的打印出来

生成器推导式如果作为函数的参数,可以直接写推导式,而不用加小括号(这个很牛气吧)。

本文地址:https://sicmodule.kub2b.com/news/14609.html     企库往 https://sicmodule.kub2b.com/ , 查看更多

特别提示:本信息由相关用户自行提供,真实性未证实,仅供参考。请谨慎采用,风险自负。

 
 
更多>同类最新资讯
0相关评论

文章列表
相关文章
最新动态
推荐图文
最新资讯
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报  |  鄂ICP备2020018471号