Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么生成itertools.islice会生成不可用的嵌套对象?_Python_Generator_Slice - Fatal编程技术网

Python 为什么生成itertools.islice会生成不可用的嵌套对象?

Python 为什么生成itertools.islice会生成不可用的嵌套对象?,python,generator,slice,Python,Generator,Slice,我正在尝试将一个生成器分成多个部分,这样我就可以进行并行计算。主生成器由g()生成,gslice()应该生成它的一个子测试,并生成它供程序的其余部分使用: >>> from itertools import product >>> from string import digits >>> def g(): ... for i in product(digits, repeat=2): ... yield "".joi

我正在尝试将一个生成器分成多个部分,这样我就可以进行并行计算。主生成器由
g()
生成,
gslice()
应该生成它的一个子测试,并生成它供程序的其余部分使用:

>>> from itertools import product
>>> from string import digits
>>> def g():
...     for i in product(digits, repeat=2):
...         yield "".join(['aa']+list(i))

>>> def gslice():
...     yield itertools.islice(g(), 3,4)

>>> a=gslice()
>>> next(a)
<itertools.islice object at 0x7fc4dc34ad60>
>>> next(next(a))
'aa03'
>>> next(next(a))
Traceback (most recent call last):
  File "<console>", line 1, in <module>
来自itertools导入产品的
>>
>>>从字符串导入数字
>>>def g():
...     对于产品中的i(数字,重复=2):
...         加入(['aa']+列表(i))
>>>def gslice():
...     产量itertools.islice(g(),3,4)
>>>a=gslice()
>>>下一(a)
>>>下一(下一(a))
‘aa03’
>>>下一(下一(a))
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
不幸的是,正如您所看到的那样,
itertools.islice
,不是拆分
g()
,而是生成某种嵌套对象
itertools.islice
,您可以使用
next(next(a))
一次性获取第一个元素,但如果重试,它会产生错误
list()
应用于
gslice
不列出任何内容,只返回相同的对象

这篇文章的目的基本上是问为什么
gslice
不能简单地产生一个作为
g
子测试的生成器,以及如何做到这一点。如果我将
product
方法中的
repeat=2
更改为
repeat=10
,那么除了通过生成器之外,我们为什么肯定不想处理这个问题呢?

islice()
本身就是一个迭代器(就像生成器是迭代器一样)。如果要生成切片的结果,可以使用
yield from

def gslice():
    yield from itertools.islice(g(), 3, 4)
yield from
需要Python 3.3或更新版本。您也可以只返回切片:

def gslice():
    return itertools.islice(g(), 3, 4)