有没有办法在for循环中再次迭代 ?例如:
for x in list:
if(condition):
#I'd like to grab the next iteration of the list
所以,如果我有[1,2,3,4],我首先迭代1,然后尝试在for循环中将迭代推进到2,这样当循环再次启动时,它将是在3点。
可能的?
我正在创建一个读取if语句的解析器,然后想要读取行,直到它到达终止if语句的行。
答案 0 :(得分:3)
你可以这样做:
a = [1,2,3,4,5]
b = iter(a)
try:
while True:
c = b.next()
if (condition):
c = b.next()
except StopIteration:
pass
答案 1 :(得分:3)
如果您正在使用的项目是可迭代对象,则可以使用item.next()
来获取下一个元素。但是,如果需要,您需要确保获取StopIteration
例外。
>>> it = iter(range(5))
>>> for x in it:
... print x
... if x > 3:
... print it.next()
...
0 1 2 3 4
Traceback (most recent call last):
File "<stdin>", line 4, in <module>
StopIteration
答案 2 :(得分:1)
您需要continue声明。
for x in list:
if(condition):
continue
答案 3 :(得分:1)
skip = False
for x in list:
if skip:
skip = False
continue
# Do your main loop logic here
if (condition):
skip = True
答案 4 :(得分:1)
您可以使用while
循环代替for
。在伪代码中:
idx = 0
while idx < length(list)
x = list[idx]
...
if (condition)
idx += 1
...
idx += 1
答案 5 :(得分:1)
您始终可以绕过for循环并显式使用迭代器:
iter = list.__iter__()
while True:
x = iter.next()
...
if (condition):
x = iter.next()
...
这将在到达列表末尾时抛出StopIteration异常。
答案 6 :(得分:0)
我怀疑你解析if语句的方法不是一个很好的方法。您还会发现,您不能嵌套您的IF语句,也不能将它们全部放在一行。这是我如何去做。
a)将您的语言转换为BNF表格。例如,对于if语句,它可能是
ifstmnt ::= IF <condiftion> THEN <trueblock> [ ELSE <elseblock> ]
statment ::= ifstmnt | assignstment | whilestmnt | forstmnt
等
b)在每个点找出你在等待的东西。在IF之后,你会读到一个条件,直到你看到那个。
c)编写一个getNextToken例程,该例程读取源中的字符,直到它具有完整的令牌。令牌是可识别的单位 - IF,THEN,数字,符号。每次调用它都会将令牌返回到缓冲区。有一个类型和值返回也很有用 - 它可以节省你在许多地方转换数字。表驱动方法非常快速和灵活。
d)然后编写许多小例程来识别每种类型的语句。一个用于IF,一个用于条件,一个用于块,一个用于语句,一个用于表达等。这些将相互调用并在它们识别语句时返回。例如,条件表达式识别器将读取一个布尔表达式并吃掉所有名称,AND,OR等,直到它向前看并看到那个。它无法处理,因此它存在,并且IF重新识别器发现令牌是那么,它读取下一个并且调用识别器以获得块(可能期望BEGIN,许多语句然后是END)。
e)每个例程都会收集所需的数据 - condition,trueblock,falseblock,并根据需要对其进行处理。一种非常常见的处理方法是在内存中创建程序的树表示。程序员定义的名称在定义时收集在字典中,并在使用时进行检查。
f)真正的编译器会尝试重新排列树以使事情变得更有效 - 但我建议这是未来的发展 然后,最后的行动是走树,以某种方式评估它。如果你正在编写一个解释器,你可以计算值并存储,然后存储 - 将值存储在doctionary中。如果您正在编写真正的编译器,则需要为链接器生成合适的输出。这是一项重大任务。查看YACC和LEX。它们是专门用于完成部分工作的工具,可以节省您的时间。帮助你的研究的术语是“词法分析”“解析器”和类似的。
祝你好运。你的项目非常重要!