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
被提升,你的迭代器就不能再开始产生了。你想解决什么问题?当达到标志条件时,不迭代一段时间不是更好吗?