如何在python中使用迭代器

时间:2012-11-10 16:52:53

标签: python string list iteration

我正在学习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代码示例也很好看。

2 个答案:

答案 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代码实现了一个可以与迭代一起使用的链表,但在您的代码中,您正在改变某些节点的位置。

如果你想编写python代码,不要在python

中编写C代码

答案 1 :(得分:2)

Python中的迭代器只能继续前进。它们支持的唯一操作是next(),它返回下一个值,或者引发StopIteration异常。它们不适合这个需要前后移动的问题。

您的原始代码令人困惑,但我会使用列表和整数索引来解决这个问题。