我正在学习Python,我不明白如何使用迭代器。
我需要编写代码。在C中,它将是这样的:
list_node *cp = list_of_chars;
char dp = '>'; int flag = 0;
while (cp != NULL)
{ if( isdigit(cp->val) )
{ printf("%c",cp->val);
if( cp->val == '0' )
{ cp->prev->next = cp->next; cp->next->prev = cp->prev; }
else cp->val--;
}
else if( (cp->val == '>') || (cp->val == '<') )
{ dp = cp->val; flag = 1; }
if( dp == '>' ) cp = cp->next;
else if( dp == '<' ) cp = cp->prev;
else return ERR;
if( flag && ( (cp->val == '>') || (cp->val == '<') ))
{ cp->prev->prev->next = cp;
cp->prev = cp->prev->prev;
}
}
你能帮我把这段代码翻译成python吗?我开始写,但有一些错误,我不确定,我理解文档。
ip = {'cp' : iter(program), 'dp' : '>'}
flag = 0
while ip['cp'] != []:
if ('0' <= ip['cp']) & (ip['cp'] <= '9'):
print ip['cp']
if ip['cp'] == '0': ip['cp'] = []
else: ip['cp'] -= 1
elif (ip['cp'] == '>') | (ip['cp'] == '<'):
ip['dp'] = ip.['cp']
flag = 1
else: raise NameError('incorrect cp-value')
if ip['dp'] == '>': ip['cp'].next()
elif ip['dp'] == '<': ip['cp'].prev()
else: raise NameError('incorrect dp-value')
if flag & ( (ip['cp'] == '>') | (ip['cp'] == '<') ):
ip['cp'].prev()
ip['cp'] = []
问题是如何在没有函数next()的情况下获取迭代器的值。
使用迭代器的高级用法的python-expert代码示例也很好看。
答案 0 :(得分:3)
好的,你的python代码中有很多问题。
从简单的
开始吧while ip['cp'] != []:
可写简单
while ip['cp']:
虽然ip['cp']
不是一个错误的值,但它会这样做。例如,[], None, ''
是一个错误的值。
而不是:
if ip['dp'] == '>': ip['cp'].next()
elif ip['dp'] == '<': ip['cp'].prev()
else: raise NameError('incorrect dp-value')
写
if ip['dp'] == '>':
ip['cp'].next()
elif ip['dp'] == '<':
ip['cp'].prev()
else:
raise NameError('incorrect dp-value')
即使在某些情况下,编写内联代码也可以。考虑可读性。内联代码几乎从不是使代码可读且易于调试的良好开端。它还可以轻松修复90%的语法错误。
这是有趣的开始......
if( cp->val == '0' )
{ cp->prev->next = cp->next; cp->next->prev = cp->prev; }
else cp->val--;
和
if ip['cp'] == '0': ip['cp'] = []
else: ip['cp'] -= 1
在python中,'0'是字符串0
。在python中,当你有一个字符串对象时,你正在使用字符串。当你有数字时,你正在处理数字...换句话说,你试图在python中编写的代码不能纯粹地转换为python。 python字符串中的最后一个字符不是'\ 0'。它是字符串中的最后一个字符。换句话说,你可以真正测试C中的最后一个字符。
尽管如此,忽略代码中的所有其他问题,以下是如何使用迭代器。
iter()
是一个返回迭代器的内置函数。在大多数情况下,您不必自己调用它。有一些结构会为你做到这一点。
iterable = iter('string')
iterable.next() == 's'
iterable.next() == 't'
... Until StopIteration is raised
for i in iter('string'):
与:
相同for i in 'string':
也就是说,迭代器习惯于某种东西。你真正想要的不是迭代器。因为迭代器是一种方式。你可以走到最后,你不能回去。以前没有。您的C
代码实现了一个可以与迭代一起使用的链表,但在您的代码中,您正在改变某些节点的位置。
答案 1 :(得分:2)
Python中的迭代器只能继续前进。它们支持的唯一操作是next(),它返回下一个值,或者引发StopIteration异常。它们不适合这个需要前后移动的问题。
您的原始代码令人困惑,但我会使用列表和整数索引来解决这个问题。