python - 如何在python中使用迭代器

标签 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 专家代码示例也很高兴看到。

最佳答案

好的,您的 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代码

关于python - 如何在python中使用迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13323990/

相关文章:

c - 在不使用任何预定义函数的情况下在 C 中进行字符串匹配?

r - R 中的列表和配对列表有什么区别?

python - 如何将不同排名的列表连接成排名 0 的单个列表?

python - 在 Django 中选择查询。如何检索列的单个值?

python : imported packages with 'nested' modules

java - 设置Java中的RegEx默认为非贪婪

r:循环遍历列表并将结果附加到数据框

python - 使用 XMLRPC 将文件从客户端发送到服务器?

python - 在我只有 ftp 访问权限的服务器上安装 pip 包?

c++ - 以常量引用作为输入的函数