当前位置: 首页 > news >正文

网络公司网站 优帮云友情链接英文翻译

网络公司网站 优帮云,友情链接英文翻译,了解网站开发流程,武汉响应式网站建设生成器 Generators 要理解生成器,首先要理解迭代器,迭代器由以下三个部分组成: 可迭代对象(iterable)迭代器(iterator)迭代(iteration) 1. 可迭代对象 只要定义了可以…

生成器 Generators

要理解生成器,首先要理解迭代器,迭代器由以下三个部分组成:

  • 可迭代对象(iterable)
  • 迭代器(iterator)
  • 迭代(iteration)

1. 可迭代对象

只要定义了可以返回一个迭代器的__iter__方法的对象,或者定义了可以支持下标索引的__getitem__方法。

2. 迭代器

只要定义了一个__next__方法的对象。

3. 迭代

从某个地⽅(⽐如⼀个列表)取出⼀个元素的过程。当我们使⽤⼀个循环来遍历某个东西时,这就叫⼀个迭代。


生成器

生成器也是一种迭代器,但是只能对其迭代一次。因为生成器没有把所有的值存在内存中,而是在运行时生成值(lazy)。可以通过遍历来使用它们,使用for循环或传递给任意可以进行迭代的函数和结构。

大多数生成器是以函数来实现的,它们并不返回一个值,而是yield一个值。

在这里插入图片描述
生成器最好的使用场景是:不需要一次将所有计算的结果全部放在内存中,或者一次读出全部的原始数据,这样会造成很大的内存占用。

上述例子中,我们用for循环来迭代这个生成器函数,同样,我们可以使用python的next()函数来获得迭代器的下一个元素。
在这里插入图片描述

基础数据类型list和str都是可迭代对象,我们经常会使用for循环来获得每一个下标的数据。
在这里插入图片描述
但是我们发现,不能调用next来迭代字符串和数据,这是因为:
数组和字符串是可迭代对象,但不是迭代器
使用for关键字迭代可迭代对象时,for会自动获取到迭代器,进行迭代。但是next只能对迭代器进行迭代,因此我们需要使用到iter()函数来根据一个可迭代对象返回一个迭代器对象
在这里插入图片描述
同时,next方法没有实现对StopIteration异常的捕捉,在自己写的迭代器内一般需要额外进行迭代结束的编写。


测验:

现在我们要写一个生成器,迭代一个数组的时候,不再是按顺序取出而是隔一个元素取出。

1. 函数式迭代器(yield)

def skip_elements(arr):for i in range(0, len(arr), 2):  # 从索引0开始,每次跨越2个元素yield arr[i]my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9]
gen = skip_elements(my_list)for element in gen:print(element)

2. 编写一个迭代器:

class SkipElementsGenerator:def __init__(self, arr):self.arr = arrself.index = 0def __iter__(self):return selfdef __next__(self):if self.index >= len(self.arr):raise StopIterationelement = self.arr[self.index]self.index += 2  # 每次跳过一个元素return elementmy_list = [1, 2, 3, 4, 5, 6, 7, 8, 9]
gen = SkipElementsGenerator(my_list)for element in gen:print(element)

SkipElementsGenerator是一个迭代器,我们直接将要迭代的数组当成形参丢入以初始化迭代器。

注意:因为要用for迭代迭代器,因此迭代器也必须得是可迭代对象,这里只需要简单实现__iter__函数并且返回self即可!

Another Way

比较直观了解可迭代对象与迭代器的例子:

class MyArray:def __init__(self, arr):self.arr = arrdef __iter__(self):return SkipElementsGenerator(self.arr)class SkipElementsGenerator:def __init__(self, arr):self.arr = arrself.index = 0def __next__(self):if self.index >= len(self.arr):raise StopIterationelement = self.arr[self.index]self.index += 2  # 每次跳过一个元素return element# 创建自定义数组对象
my_list = MyArray([1, 2, 3, 4, 5, 6, 7, 8, 9])# 使用生成器迭代元素
for element in my_list:print(element)

原始数据是可迭代对象,实现__iter__方法,返回它的迭代器。
迭代器实现__next__方法,迭代返回每一次迭代的值。

这个时候for循环直接迭代可迭代对象,不像上一个例子一样是迭代迭代器。

for循环是先找到可迭代对象的迭代器! 通过__iter__方法!
然后对迭代器进行迭代! 通过迭代器的__next__方法!

这样写的话可以实现函数的解耦,不会像上面代码一样,还要实例化迭代器gen = SkipElementsGenerator(my_list),然后人为迭代迭代器。
这样写的话,只需要像原来一个,实例化自定义的数据类型,直接用for或者iter来获得迭代器,代码中不会出现迭代器的名字,无感使用。

http://www.hkea.cn/news/158184/

相关文章:

  • 公司网站用什么开发百度指数怎么用
  • 建站主机 wordpress济南网站万词优化
  • 哈尔滨app开发seo自学网官网
  • 网站答辩ppt怎么做全网关键词云在哪里看
  • 网站建设 视频seo关键词词库
  • 网站应用软件设计成都网站建设技术外包
  • 用哪个软件做网站网址查询域名解析
  • 网站安全优化域名停靠浏览器
  • 我做中医培训去哪个网站找学员谷歌排名算法
  • 如何将网站让百度收录网店培训班
  • wordpress旧版页面编辑界面百度seo推广计划类型包括
  • 网站建设茶店网网站换友链平台
  • 珠海建设工程信息网站网络营销百度百科
  • 帮别人做网站推广犯法吗关键词排名网站
  • 建设通网站是政府的么高端网站定制设计
  • 玉溪做网站的公司夸克搜索网页版
  • wordpress导航主题haowseo挂机赚钱
  • 广州做家教的网站深圳网络推广招聘
  • 锐捷网络公司排名seo技术介绍
  • 新圩做网站公司拼多多代运营一般多少钱
  • 免费网站可以做cpa?短视频营销的优势
  • b2b外贸营销型网站如何做电商赚钱
  • 建设无障碍网站seo分析报告怎么写
  • 电子商务网站开发进什么科目模板自助建站
  • 威海市住房和城乡建设局官方网站北京seo营销公司
  • 开网页卡优化关键词排名工具
  • wordpress右侧文章归档东莞公司seo优化
  • 个人网站建设需求说明书免费外链生成器
  • 湖南网站建设的公司排名网页制作网站制作
  • 公司网页网站建设 ppt模板app开发公司排行榜