Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.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 恢复列表读取并记住光标_Python - Fatal编程技术网

Python 恢复列表读取并记住光标

Python 恢复列表读取并记住光标,python,Python,当标志设置为False时,我试图使列表暂时无法读取。也就是说,当标志为False时读取列表不会给出任何值(就好像它是空的或者列表已经用尽)。一旦设置回True,列表将再次变得可读,光标将从上次停止的位置继续。我当前的实现继续读取,但不记得光标以前在哪里。有人知道如何改变它吗?我知道我可以有一个变量来跟踪光标的位置,但是有没有更优雅的方法呢 items = range(0, 5) flag = True def values(): for v in items: whil

当标志设置为
False
时,我试图使列表暂时无法读取。也就是说,当标志为
False
时读取列表不会给出任何值(就好像它是空的或者列表已经用尽)。一旦设置回
True
,列表将再次变得可读,光标将从上次停止的位置继续。我当前的实现继续读取,但不记得光标以前在哪里。有人知道如何改变它吗?我知道我可以有一个变量来跟踪光标的位置,但是有没有更优雅的方法呢

items = range(0, 5)
flag = True

def values():
    for v in items:
        while not flag:
            yield None
        yield v

def read():
    for i in values():
        if i is None:
            return
        yield i

def run():
    global flag
    # should print just 0 1 2, as flag is False when i == 2
    for i in read():
        if i == 2:
            flag = False
        print i

    print "flip!"

    # should print just 3 4, as the previous cursor position should be used
    flag = True
    for i in read():
        print i

run() # outputs 0 1 2 flip 0 1 2 3 4 rather than the expected 0 1 2 flip 3 4

您的第一个循环工作正常,您可以在第一个
for
循环之后添加
打印“**********”
!看看结果

但是对于第二个循环,您没有理解,因为在第二个循环中,您不能从您已转换为
falg
的部分迭代列表!第二个循环将从start开始,因此您可以将第一个循环中最后一个元素的索引保存到
indx
变量,并将其传递给您的函数:

items = range(0, 5)
flag = True

def values(indx):
    for v in items[indx:]:
        while not flag:
            yield None
        yield v

def read(indx=0):
    for i in values(indx):
        if i is None:
            return
        yield i

def run():
    global flag
    global indx
    # should print just 0 1 2
    for i,j in enumerate(read(),1):
        if j == 2:
            flag = False
            indx=i
        print j
    print "**********"

    # should print just 3 4
    flag = True
    for i in read(indx):
        print i
    print '********'
run() 
结果:

0
1
2
**********
3
4
********

您的第一个循环工作正常,您可以在第一个
for
循环之后添加
打印“**********”
!看看结果

但是对于第二个循环,您没有理解,因为在第二个循环中,您不能从您已转换为
falg
的部分迭代列表!第二个循环将从start开始,因此您可以将第一个循环中最后一个元素的索引保存到
indx
变量,并将其传递给您的函数:

items = range(0, 5)
flag = True

def values(indx):
    for v in items[indx:]:
        while not flag:
            yield None
        yield v

def read(indx=0):
    for i in values(indx):
        if i is None:
            return
        yield i

def run():
    global flag
    global indx
    # should print just 0 1 2
    for i,j in enumerate(read(),1):
        if j == 2:
            flag = False
            indx=i
        print j
    print "**********"

    # should print just 3 4
    flag = True
    for i in read(indx):
        print i
    print '********'
run() 
结果:

0
1
2
**********
3
4
********

你不能用发电机做你想做的事;生成器是专门的迭代器,迭代器只能迭代一次。一旦耗尽(
StopIterator
)它们就不能产生更多的项

另一方面,您的代码期望引发
StopIteration
(第一个循环结束),然后第二个循环继续再次迭代

不要在生成器中处理这个问题,只需停止迭代即可。创建生成器一次,然后在两个循环中使用它:

def run():
    iterator = read()
    for i in iterator:
        print i
        if i == 2:
            break   # stop iterating

    print 'flip'

    # resume iterating
    for i in iterator:
        print i

你不能用发电机做你想做的事;生成器是专门的迭代器,迭代器只能迭代一次。一旦耗尽(
StopIterator
)它们就不能产生更多的项

另一方面,您的代码期望引发
StopIteration
(第一个循环结束),然后第二个循环继续再次迭代

不要在生成器中处理这个问题,只需停止迭代即可。创建生成器一次,然后在两个循环中使用它:

def run():
    iterator = read()
    for i in iterator:
        print i
        if i == 2:
            break   # stop iterating

    print 'flip'

    # resume iterating
    for i in iterator:
        print i

这样做将从根本上被打破:

该协议的目的是,一旦迭代器的next()方法引发StopIteration,它将在后续调用中继续这样做。不遵守此属性的实现将被视为已损坏


您应该做的是将其设为类,并将索引存储为实例变量。这样,您就不必传入参数或依赖全局变量。

这样做将从根本上打破:

该协议的目的是,一旦迭代器的next()方法引发StopIteration,它将在后续调用中继续这样做。不遵守此属性的实现将被视为已损坏


您应该做的是将其设为类,并将索引存储为实例变量。这样,您就不必传入参数或依赖全局变量。

您可以在下面找到感兴趣的生成器。使用生成器的
send()
方法,我们可以将数据发送回生成器。有关此功能的更多信息,请参见Python文档中的。(该文档的Python 3版本为)


您可以在下面找到感兴趣的生成器。使用生成器的
send()
方法,我们可以将数据发送回生成器。有关此功能的更多信息,请参见Python文档中的。(该文档的Python 3版本为)


你能解释一下你所说的“完全可读”是什么意思吗?@Kasra在中,
read()
返回时就好像列表已用尽一样
标志
为False。如果
flag
True
read()
返回下一个元素。希望这能让事情变得更清楚。您基本上想用
None
值替换迭代计数的其余部分?因此,迭代器通常会生成5个值,当您设置需要生成(5-已生成计数)次
None
的标志时,然后在再次切换标志但再次开始迭代时生成“未生成”的数字?你不能这样做,因为一旦你结束了一个迭代器,你就不能再使用它了。换句话说,一旦
StopIteration
被提升,你的迭代器就不能再开始产生了。你想解决什么问题?当你达到标志条件时,不迭代一段时间不是更好吗?你能解释一下你所说的“完全可读”是什么意思吗?@Kasra如中所示,
read()
返回,就好像列表已用尽
标志
为False一样。如果
flag
True
read()
返回下一个元素。希望这能让事情变得更清楚。您基本上想用
None
值替换迭代计数的其余部分?因此,迭代器通常会生成5个值,当您设置需要生成(5-已生成计数)次
None
的标志时,然后在再次切换标志但再次开始迭代时生成“未生成”的数字?你不能这样做,因为一旦你结束了一个迭代器,你就不能再使用它了。换句话说,一旦
StopIteration
被提升,你的迭代器就不能再开始产生了。你想解决什么问题?当达到标志条件时,不迭代一段时间不是更好吗?