iter函数,python中迭代器和生成器的区别

1,python中迭代器和生成器的区别对于list、string、tuple、dict等这些容器对象,使用for循环遍历是很方便的 。在后台for语句对容器对象调用iter()函数 。iter()是Python内置函数 。iter()会返回一个定义了next()方法的迭代器对象,它在容器中逐个访问容器内的元素 。next()也是python内置函数 。在没有后续元素时 , next()会抛出一个StopIteration异常,通知for语句循环结束 。先说迭代器 , 对于string、list、dict、tuple等这类容器对象,使用for循环遍历是很方便的 。在后台for语句对容器对象调用iter()函数 , iter()是python的内置函数 。iter()会返回一个定义了next()方法的迭代器对象,它在容器中逐个访问容器内元素,next()也是python的内置函数 。在没有后续元素时,next()会抛出一个stopiteration异常,通知for语句循环结束 。生成器(generator)是创建迭代器的简单而强大的工具 。它们写起来就像是正规的函数,只是在需要返回数据的时候使用yield语句 。每次next()被调用时 , 生成器会返回它脱离的位置(它记忆语句最后一次执行的位置和所有的数据值) 。
2,Excel的IRR函数是什么Excel的IRR函数是返回由数值代表的一组现金流的内部收益率 。这些现金流不必为均衡的,但作为年金,它们必须按固定的间隔产生,如按月或按年 。内部收益率为投资的回收利率 , 其中包含定期支付(负值)和定期收入(正值) 。语法 IRR(values,guess) Values为数组或单元格的引用 , 包含用来计算返回的内部收益率的数字 。bull;Values必须包含至少一个正值和一个负值,以计算返回的内部收益率 。bull;函数IRR根据数值的顺序来解释现金流的顺序 。故应确定按需要的顺序输入了支付和收入的数值 。bull;如果数组或引用包含文本、逻辑值或空白单元格,这些数值将被忽略 。Guess为对函数IRR计算结果的估计值 。Excel使用迭代法计算函数IRR 。从guess开始,函数IRR进行循环计算,直至结果的精度达到0.00001% 。如果函数IRR经过20次迭代,仍未找到结果,则返回错误值#NUM! 。在大多数情况下,并不需要为函数IRR的计算提供guess值 。如果省略guess,假设它为0.1(10%) 。如果函数IRR返回错误值#NUM!,或结果没有靠近期望值,可用另一个guess值再试一次 。注解 函数IRR与函数NPV(净现值函数)的关系十分密切 。函数IRR计算出的收益率即净现值为0时的利率 。
3,python有什么对象是可迭代的使用filter来实现,以python3为例,如果删除列表中的所有0,则可使用下面代码实现:a = [1,2,0,3,4,0,5,0,6]b = filter(lambda x: x != 0, a)list(b)效果如下:注:如果使用python2则直接输出b即可,在python3中filter返回结果为可迭代的对象,需使用list转换成列表 。iamlaosong文我们在用for ... in ...语句循环时,in后面跟随的对象要求是可迭代对象,即可以直接作用于for循环的对象统称为可迭代对象(iterable),如list、tuple、dict、set、str等 。可迭代对象是实现了__iter__()方法的对象,而迭代器(iterator)则是实现了__iter__()和__next__()方法的对象,可以显示地获取下一个元素 。这种可以被next调用并不断返回下一个值的对象称为迭代器 。迭代器一定是可迭代对象,反过来则不一定成立 。用iter()函数可以把list、dict、str等iterable变成iterator,例如:bb=[x for x in range(10)]cc=iter(bb)cc.next()循环变量的值其实可以看着是一次次用next取值的过程,每取一个值 , 做一次处理 。list等对象用于循环实际上可以看着是用iter()方法产生一个迭代器,然后循环取值 。生成器(generator)就是一个能返回迭代器的函数 , 其实就是定义一个迭代算法 , 可以理解为一个特殊的迭代器 。调用这个函数就得到一个迭代器,生成器中的yield相当于一个断点,执行到此返回一个值后暂停,从而实现next取值 。【iter函数,python中迭代器和生成器的区别】
4,新手请教下面这段代码y的值和n的值没有关系,你可以把和y有关的语句全部删除 , 仍然可以正常运行 。iter会尝试调用 __iter__ 或者 支持下标为0的__getitem__ 方法,这个例子中,X类的__getitem__方法支持下标为0,因此iter(x),就从下标为0开始运行:相当于连续执行x[0], x[1], x[2], ....QUOTE:原帖由 HyryStudio 于 2010-1-3 17:31 发表 运行一下下面的代码试试看就知道了,n和y没有关系 , n之所以变化是因为for循环和iter函数的作用class X:def __getitem__(self, n):return (n+2)*3for n in iter(X()):print n... 嗯,明白了,谢谢 送花这么跟楼主说吧,不要在这个问题上纠缠了 。这种写法从Py语法上看,没有道理 。__getitem__ 实现的是对象的 . 运算符 。但是你是不可能写 x.1, x.3的 。而这iter(x),调用的又是X类的 __iter__方法 。而这个__iter__又没有定义 。真的没有定义吗?又不是,因为这个__getitem__属于 catch all 。他接管了这个iter 。然后就是Py的魔术了 。究竟详情如何 , 我也不知道了 。反正里面一团浆糊 。谢谢shhgs,您真是光明使者 是看了您的解释 , 对这个iter(X)的理解又深了一层,不过还是没完全理解 。俺决定听您的建议,不在这个问题上纠缠了 。谢谢 。不好意思 。看错了 。getitem实现的是[]运算符 。不过说实话,我还是不懂这种写法背后的语法根据 。估计是Py解释器里的魔术吧 。5,python生成器和迭代器的区别先说迭代器,对于string、list、dict、tuple等这类容器对象,使用for循环遍历是很方便的 。在后台for语句对容器对象调用iter()函数 , iter()是python的内置函数 。iter()会返回一个定义了next()方法的迭代器对象,它在容器中逐个访问容器内元素,next()也是python的内置函数 。在没有后续元素时,next()会抛出一个StopIteration异常,通知for语句循环结束 。生成器(Generator)是创建迭代器的简单而强大的工具 。它们写起来就像是正规的函数 , 只是在需要返回数据的时候使用yield语句 。每次next()被调用时,生成器会返回它脱离的位置(它记忆语句最后一次执行的位置和所有的数据值) 。iamlaosong文我们在用for ... in ...语句循环时 , in后面跟随的对象要求是可迭代对象,即可以直接作用于for循环的对象统称为可迭代对象(iterable) , 如list、tuple、dict、set、str等 。可迭代对象是实现了__iter__()方法的对象,而迭代器(iterator)则是实现了__iter__()和__next__()方法的对象 , 可以显示地获取下一个元素 。这种可以被next调用并不断返回下一个值的对象称为迭代器 。迭代器一定是可迭代对象,反过来则不一定成立 。用iter()函数可以把list、dict、str等iterable变成iterator , 例如:bb=[x for x in range(10)]cc=iter(bb)cc.next()循环变量的值其实可以看着是一次次用next取值的过程,每取一个值,做一次处理 。list等对象用于循环实际上可以看着是用iter()方法产生一个迭代器,然后循环取值 。生成器(generator)就是一个能返回迭代器的函数,其实就是定义一个迭代算法 , 可以理解为一个特殊的迭代器 。调用这个函数就得到一个迭代器,生成器中的yield相当于一个断点,执行到此返回一个值后暂停 , 从而实现next取值 。

    推荐阅读