1

我正在学习 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 专家代码示例也很高兴看到。

4

2 回答 2

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代码

于 2012-11-10T17:28:29.700 回答
2

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

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

于 2012-11-10T17:22:53.903 回答