如何从迭代器对象获取元素?

时间:2019-03-16 21:32:32

标签: python-3.x

任何人都可以尝试向我解释以下代码的工作方式吗?据我了解,解压缩就像a, b, i = [1,2,3]一样,但是以下代码如何获取x?我尝试调试是否有x = iter(collections.deque([1,2,3,4,5], maxlen=1)) <_collections._deque_iterator对象位于0x01239>

import collections
x, = iter(collections.deque([1,2,3,4,5], maxlen=1))

2 个答案:

答案 0 :(得分:1)

这是一个简单的例子

>>> x = [24]
>>> x
[24]
>>> x, = [24]
>>> x
24

>>> x, y = [24, 96]
>>> x
24
>>> y
96

这与您的示例等效,因为如果您执行list(iter(collections.deque([1,2,3,4,5], maxlen=1))),它只是一个包含一个元素[5]的列表。

您是正确的,这是在拆箱。您可以将其编写为(x,),以便在x,令人困惑的情况下看起来更像元组。 x后面的逗号使x指向first element of a tuple with one element

答案 1 :(得分:0)

您的上面的代码为我生成x = 5,而不是迭代器对象。

通常,对于迭代器对象(例如生成器),使用next()的效果

这是斐波那契数列的一个简短示例。使用yield会生成一个生成器对象。

def iterative_fib(n):
    a,b = 0,1
    i=1
    while i<n:
        a, b = b, a+b
#         print(b)
        i+=1
    yield b

x = iterative_fib(50)
next(x)  # 12586269025

我不确定100%具体针对您的情况,但是请尝试使用next,因为next需要迭代器。如果这不起作用,那么可能会产生一个代码示例来复制您的问题。

next()的文档:https://docs.python.org/3/library/functions.html#next

编辑: 看到有关拆箱清单的其他答案,这是使用*的其他方式:

a = [1,2,3,4,5]
a,b,c,d,e = [1,2,3,4,5] # you already mentioned this one
a, *b = [1,2,3,4,5]  # a =[1], b=[2, 3, 4, 5]
a, *b, c, d = [1,2,3,4,5]  #a =[1], b=[2,3], c=[4], d=[5]
*a, b, c = [1,2,3,4,5] # a=[1,2,3], b=[4], c=[5]
#But this wont work:
a, *b, *c = [1,2,3,4,5]  # SyntaxError: two starred expressions in assignment