草庐IT

Iterator

全部标签

python - 为什么 next 会引发 'StopIteration' ,但 'for' 会正常返回?

在这段代码中,为什么使用for导致没有StopIteration还是for循环捕获所有异常然后静默退出?在这种情况下,为什么我们会有多余的return??或者是raiseStopIteration导致:returnNone?#!/usr/bin/python3.1defcountdown(n):print("countingdown")whilen>=9:yieldnn-=1returnforxincountdown(10):print(x)c=countdown(10)next(c)next(c)next(c)假设StopIteration被触发:returnNone。Generat

python - 为什么 next 会引发 'StopIteration' ,但 'for' 会正常返回?

在这段代码中,为什么使用for导致没有StopIteration还是for循环捕获所有异常然后静默退出?在这种情况下,为什么我们会有多余的return??或者是raiseStopIteration导致:returnNone?#!/usr/bin/python3.1defcountdown(n):print("countingdown")whilen>=9:yieldnn-=1returnforxincountdown(10):print(x)c=countdown(10)next(c)next(c)next(c)假设StopIteration被触发:returnNone。Generat

python - itertools中chain和chain.from_iterable有什么区别?

我在互联网上找不到任何有效的例子,我可以看到它们之间的区别以及为什么要选择一个而不是另一个。 最佳答案 第一个接受0个或多个参数,每个参数是一个可迭代对象,第二个接受一个参数,该参数预计会产生可迭代对象:fromitertoolsimportchainchain(list1,list2,list3)iterables=[list1,list2,list3]chain.from_iterable(iterables)但iterables可以是任何产生可迭代对象的迭代器:defgen_iterables():foriinrange(10

python - itertools中chain和chain.from_iterable有什么区别?

我在互联网上找不到任何有效的例子,我可以看到它们之间的区别以及为什么要选择一个而不是另一个。 最佳答案 第一个接受0个或多个参数,每个参数是一个可迭代对象,第二个接受一个参数,该参数预计会产生可迭代对象:fromitertoolsimportchainchain(list1,list2,list3)iterables=[list1,list2,list3]chain.from_iterable(iterables)但iterables可以是任何产生可迭代对象的迭代器:defgen_iterables():foriinrange(10

python - 为什么在类上定义 __getitem__ 使其在 python 中可迭代?

为什么在类上定义__getitem__会使其可迭代?例如,如果我写:classb:def__getitem__(self,k):returnkcb=b()forkincb:printk我得到了输出:012345678...我真的希望看到“forkincb:”返回错误 最佳答案 迭代对__getitem__的支持可以看作是“遗留功能”,当PEP234将迭代性作为主要概念引入时,它可以实现更平滑的过渡。它仅适用于没有__iter__的类,其__getitem__接受整数0、1和&c,并在索引过高时引发IndexError(如果有的话))

python - 为什么在类上定义 __getitem__ 使其在 python 中可迭代?

为什么在类上定义__getitem__会使其可迭代?例如,如果我写:classb:def__getitem__(self,k):returnkcb=b()forkincb:printk我得到了输出:012345678...我真的希望看到“forkincb:”返回错误 最佳答案 迭代对__getitem__的支持可以看作是“遗留功能”,当PEP234将迭代性作为主要概念引入时,它可以实现更平滑的过渡。它仅适用于没有__iter__的类,其__getitem__接受整数0、1和&c,并在索引过高时引发IndexError(如果有的话))

python - 计算生成器/迭代器中项目数的最短方法是什么?

如果我想要迭代中的项目数而不关心元素本身,那么pythonic的方法是什么?现在,我会定义defilen(it):returnsum(itertools.imap(lambda_:1,it))#orjustmapinPython3但我知道lambda接近被认为是有害的,而lambda_:1肯定不漂亮。(这个用例是计算文本文件中匹配正则表达式的行数,即grep-c。) 最佳答案 在Python2中调用itertools.imap()或在Python3中调用map()可以用等效的生成器表达式代替:sum(1fordummyinit)这也

python - 计算生成器/迭代器中项目数的最短方法是什么?

如果我想要迭代中的项目数而不关心元素本身,那么pythonic的方法是什么?现在,我会定义defilen(it):returnsum(itertools.imap(lambda_:1,it))#orjustmapinPython3但我知道lambda接近被认为是有害的,而lambda_:1肯定不漂亮。(这个用例是计算文本文件中匹配正则表达式的行数,即grep-c。) 最佳答案 在Python2中调用itertools.imap()或在Python3中调用map()可以用等效的生成器表达式代替:sum(1fordummyinit)这也

python - 如果 range() 是 Python 3.3 中的生成器,为什么我不能在范围上调用 next()?

也许我已经成为网络上错误信息的受害者,但我认为更有可能是我误解了某些东西。根据我目前所了解的,range()是一个生成器,并且生成器可以用作迭代器。但是,这段代码:myrange=range(10)print(next(myrange))给我这个错误:TypeError:'range'objectisnotaniterator我在这里缺少什么?我期待这会打印0,并前进到myrange中的下一个值。我是Python新手,所以请接受我对这个相当基本的问题的歉意,但我在其他任何地方都找不到好的解释。 最佳答案 range是一类不可变的可迭

python - 如果 range() 是 Python 3.3 中的生成器,为什么我不能在范围上调用 next()?

也许我已经成为网络上错误信息的受害者,但我认为更有可能是我误解了某些东西。根据我目前所了解的,range()是一个生成器,并且生成器可以用作迭代器。但是,这段代码:myrange=range(10)print(next(myrange))给我这个错误:TypeError:'range'objectisnotaniterator我在这里缺少什么?我期待这会打印0,并前进到myrange中的下一个值。我是Python新手,所以请接受我对这个相当基本的问题的歉意,但我在其他任何地方都找不到好的解释。 最佳答案 range是一类不可变的可迭