能被 next 指针调用,并不断返回下一个值的对象,叫做迭代器。表示为Iterator,迭代器是一个对象类型数据。
迭代器指的是迭代取值的工具,迭代是一个重复的过程,每次重复都是基于上一次的结果而继续的,单纯的重复并不是迭代。
迭代器并不依赖索引,而通过 next 指针迭代所有数据,一次只取一个值,大大节省空间。
惰性序列是指没有一次性的把所有数据都放在序列中,而是遍历一个放一个这样的序列,range对象和迭代器能够产生惰性序列。
for循环的用于遍历可迭代对象,简单粗暴的来说,可以被for循环遍历的元素都是可迭代对象。for 循环能够遍历一切可迭代性数据的原因在于,底层调用了迭代器,通过next方法中的指针实现数据的获取。所以普通的非迭代器可迭代对象和迭代器之间的区别就是,一个不能直接使用next调用,一个可以被next指针调用。
再次重复一遍,可迭代对象不一定是迭代器,迭代器一定是一个可迭代对象。
使用dir()函数可以查看一个数据中的所有的对象成员,如果包含有__iter__方法,说明就是一个可迭代对象。换句话说,__iter__方法的作用就是返回一个可迭代对象。
# 定义一个列表,列表是可迭代对象
lst = [1, 2, 3, 4, 5]
# 获取列表的所有成员
res_lst = dir(lst)
print(res_lst)
'''
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
'''
# 查看是否存在__iter__方法
# 存在__iter__方法,说明确实是一个可迭代对象
res = '__iter__' in res_lst
print(res) # True
迭代器的表示方式是iterator。
使用 iter 函数将一个普通的可迭代对象转成迭代器。
lst = [1, 2, 3]
print(type(lst)) # <class 'list'>
it = iter(lst)
print(type(it)) # <class 'list_iterator'>
使用 __iter__ 内置方法实现可迭代对象转成迭代器。
lst = [1, 2, 3]
print(type(lst)) # <class 'list'>
it = lst.__iter__()
print(type(it)) # <class 'list_iterator'>
见 生成器详细说明。
存在__iter__方法说明是可迭代对象。存在 __next__ 方法说明是迭代器,因为迭代器可以使用next指针获取元素。迭代器中,__iter__和__next__都存在。
# 列表
lst = list()
# 迭代器
lst_it = iter(lst)
# 迭代器中的所有成员
res_lst = dir(lst_it)
# 判断
if '__iter__' in res_lst:
print('lst_it是一个可迭代对象')
if '__next__' in res_lst:
print('lst_it是一个迭代器')
'''
结果:
lst_it是一个可迭代对象
lst_it是一个迭代器
'''
导入collections模块中的Iterator和Iterable类型可以判断是否是可迭代对象或者是迭代器。Iterator是迭代器类型数据。Iterable是可迭代对象类型数据。利用导入的数据类型配合isinstance函数就可以判断数据的类型。
lst = list()
lst_it = iter(lst)
# 判断是否是迭代器
res = isinstance(lst_it, Iterator)
print(res) # True
# 判断是否是可迭代对象
res = isinstance(lst_it, Iterable)
print(res) # True
调用迭代器的几种方法
next函数或者是__next__内置方法一个一个、一遍一遍的获取其中的数据;next函数或者是__next__内置方法;调用迭代器使用next函数才可以取出其中的内容,next 在调用迭代器中的数据时单向不可逆的,是一条路走到黑的过程,如果调用超出迭代器中的元素个数,会报错StopIteration ,意为停止迭代。
# 因为lst本没有数据,所以无法取出数据
lst = list()
lst_it = iter(lst)
res = next(lst_it) # StopIteration
print(res)
取出迭代器中的数据,如果数据全部取出要重置迭代器才能再次取出。
lst = [1, 2, 3]
lst_it = iter(lst)
# 迭代器中一次只会取出一个数据
print(next(lst_it)) # 1
print(next(lst_it)) # 2
print(next(lst_it)) # 3
# 超出迭代器中的元素个数,就会报错
print(next(lst_it)) # StopIteration
# 迭代器中的数据是一次性的,不能重复使用
# 如果需要重复使用迭代器,可以重置迭代器(重新定义一遍迭代器)
lst_it = lst.__iter__() # 使用内置方法__iter__()也可以
# 然后再次取出数据,也可以使用内置方法__next__()取值
print(lst_it.__next__()) # 1
print(lst_it.__next__()) # 2
print(lst_it.__next__()) # 3
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
我正在尝试用ruby中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了
我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin
我在用Ruby执行简单任务时遇到了一件奇怪的事情。我只想用每个方法迭代字母表,但迭代在执行中先进行:alfawit=("a".."z")puts"That'sanalphabet:\n\n#{alfawit.each{|litera|putslitera}}"这段代码的结果是:(缩写)abc⋮xyzThat'sanalphabet:a..z知道为什么它会这样工作或者我做错了什么吗?提前致谢。 最佳答案 因为您的each调用被插入到在固定字符串之前执行的字符串文字中。此外,each返回一个Enumerable,实际上您甚至打印它。试试
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht
如何在Ruby中按名称传递函数?(我使用Ruby才几个小时,所以我还在想办法。)nums=[1,2,3,4]#Thisworks,butismoreverbosethanI'dlikenums.eachdo|i|putsiend#InJS,Icouldjustdosomethinglike:#nums.forEach(console.log)#InF#,itwouldbesomethinglike:#List.iternums(printf"%A")#InRuby,IwishIcoulddosomethinglike:nums.eachputs在Ruby中能不能做到类似的简洁?我可以只
华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o
我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的