- 主题:关于for in的简单实现
【 在 VincentGe 的大作中提到: 】
:
: 我认为我很清楚,朋友,是你在这方面有问题。
: 可迭代对象不一定是迭代器,一个迭代器对象要求__iter__必须返回自身,实现了__next__对象才能是迭代器。生成器函数的返回值是生成器迭代器。
: ...................
我认为是你以为我的理解是错误的, 说明你还是没明白我帖子的意思
我已经和你说了一遍了, 我是要实现for in 循环, 并使用生成器函数, 就这么简单一个需求。
你张嘴一个这错了, 闭嘴一个这错了, 还不够添乱的
我的第一个方案是仿照迭代器实现生成器, 是有点不伦不类,否则,我也不会奇怪发帖子。
后面, 我自己给出了, 一个通常迭代器的 __iter__ __next__的实现。
之后, 我自己也试出来生成函数的实现, 只要__iter__ 里面返回一个生成函数就够了, 至于生成函数用什么名字,
并不重要, 也就是 把 __next__换成个普通名字的函数也一样。
这样 for x in obj
就会被翻译成 调用obj.__iter__ 返回一个生成函数, for 会对生成函数反复调用来yield到正确的值。
--
FROM 124.126.0.*
抱歉,现在我理解你的需求了。但,方法名字很重要。
你希望用生成器和__iter__来实现 for i in obj。
第一方案你实现的是可迭代对象iterable,而不是迭代器,迭代器要求实现__next__,且__iter__一定要返回self。
至于那个Stopiteration 异常为什么for in没有处理,因为那个异常是由于你Raise Stopiteration 引发的RuntimeError,而不是Stopiteration。
至于最后一点,名字很重要,如果你把__next__换成其他名字我大概率就不会说这些,一般看来,你实现一个魔术方法,我便认为你在实现一个迭代器,所以引发了哪些误解。
【 在 poggy 的大作中提到: 】
: 我认为是你以为我的理解是错误的, 说明你还是没明白我帖子的意思
: 我已经和你说了一遍了, 我是要实现for in 循环, 并使用生成器函数, 就这么简单一个需求。
: 你张嘴一个这错了, 闭嘴一个这错了, 还不够添乱的
: 我的第一个方案是仿照迭代器实现生成器, 是有点不伦不类,否则,我也不会奇怪发帖子。
: 后面, 我自己给出了, 一个通常迭代器的 __iter__ __next__的实现。
: 之后, 我自己也试出来生成函数的实现, 只要__iter__ 里面返回一个生成函数就够了, 至于生成函数用什么名字,
: 并不重要, 也就是 把 __next__换成个普通名字的函数也一样。
: 这样 for x in obj
: 就会被翻译成 调用obj.__iter__ 返回一个生成函数, for 会对生成函数反复调用来yield到正确的值。
#发自zSMTH@CDU.MP
--
FROM 171.120.158.*
【 在 poggy 的大作中提到: 】
:
: 我认为是你以为我的理解是错误的, 说明你还是没明白我帖子的意思
: 我已经和你说了一遍了, 我是要实现for in 循环, 并使用生成器函数, 就这么简单一个需求。
: ...................
嗯, 确实, 我一开始也是有些迷糊, 一开始只有个模糊的想用生成器, 但是,
有没太清楚规范和for in调用它的流程, 顺手想照猫画虎, 结果,
不仅自己没跑通,还把别人误解了。
天气闷热, 没解决问题,心有点躁, 言语有点冲的, 得罪的地方抱个歉。
--
FROM 124.126.0.*