【问题标题】:error in function: 'str' object is not an iterator函数错误:“str”对象不是迭代器
【发布时间】:2016-11-01 15:33:28
【问题描述】:

我在 python 中的以下函数有问题(其中 swap 是我之前创建的一个函数,并且工作正常):

def swap (cards):
     """
     >>> swap('FBFFFBFFBF')
     'BFBBBFBBFB'
     >>> swap('BFFBFBFFFBFBBBFBBBBFF')
     'FBBFBFBBBFBFFFBFFFFBB'
     >>> swap('FFBFBFBFBFBFBFBBFBFBFBFBBFBFBBFBF')
     'BBFBFBFBFBFBFBFFBFBFBFBFFBFBFFBFB'
     """
    invert=""
    for i in cards:
        if i is "B":
            invert+="F"
        else:
            invert+="B"
    return (invert)

def swap2 (cards):    
    """
    >>> next('FBFFFBFFBF')
    'FFBBBFBBFF'
    >>> next('BFFBFBFFFBFBBBFBBBBFF')
    'FBBFBFBBBFBFFFBFFFFFF'
    >>> next('FFBFBFBFBFBFBFBBFBFBFBFBBFBFBBFBF')
    'FFFBFBFBFBFBFBFFBFBFBFBFFBFBFFBFF'
    """
    indices=""
    for pos, i in enumerate(cards):
        if i =="B":
            indices+=str(pos)
    first= int(indices[0])
    last=  int(indices[-1])
    prefix= cards [:first]
    middle= cards [first:last+1]
    suffix= cards [last+1:]
    middle2=swap(middle)
    return (prefix+middle2+suffix)

def turns (cards):
    """
    >>> turns('FBFFFBFFBF')
    3
    >>> turns('BFFBFBFFFBFBBBFBBBBFF')
    6
    >>> turns('FFBFBFBFBFBFBFBBFBFBFBFBBFBFBBFBF')
    14
    """
    turn=0
    while cards != 'F'*len(cards):
        cards=swap2(cards)
        turn+=1
    return (turn)

if __name__ == '__main__':
    import doctest
    doctest.testmod()

当我运行这个函数时它工作正常,但是如果我使用 doctest 查看是否有错误,它会告诉我:

TypeError: 'str' object is not an iterator

我不知道这个错误来自哪里。 谁能帮帮我?

doctest 的完整输出:

File "C:\Users\manuel\Documents\Gent MaStat\programming and algorithms\workspace_python\homeworks\Week 5\looking_up.py", line 25, in __main__.swap2
Failed example:
    next('FBFFFBFFBF')
Exception raised:
    Traceback (most recent call last):
      File "C:\Users\manuel\Anaconda3\lib\doctest.py", line 1321, in __run
        compileflags, 1), test.globs)
      File "<doctest __main__.swap2[0]>", line 1, in <module>
        next('FBFFFBFFBF')
    TypeError: 'str' object is not an iterator
**********************************************************************
File "C:\Users\manuel\Documents\Gent MaStat\programming and algorithms\workspace_python\homeworks\Week 5\looking_up.py", line 27, in __main__.swap2
Failed example:
    next('BFFBFBFFFBFBBBFBBBBFF')
Exception raised:
    Traceback (most recent call last):
      File "C:\Users\manuel\Anaconda3\lib\doctest.py", line 1321, in __run
        compileflags, 1), test.globs)
      File "<doctest __main__.swap2[1]>", line 1, in <module>
        next('BFFBFBFFFBFBBBFBBBBFF')
    TypeError: 'str' object is not an iterator
**********************************************************************
File "C:\Users\manuel\Documents\Gent MaStat\programming and algorithms\workspace_python\homeworks\Week 5\looking_up.py", line 29, in __main__.swap2
Failed example:
    next('FFBFBFBFBFBFBFBBFBFBFBFBBFBFBBFBF')
Exception raised:
    Traceback (most recent call last):
      File "C:\Users\manuel\Anaconda3\lib\doctest.py", line 1321, in __run
        compileflags, 1), test.globs)
      File "<doctest __main__.swap2[2]>", line 1, in <module>
        next('FFBFBFBFBFBFBFBBFBFBFBFBBFBFBBFBF')
    TypeError: 'str' object is not an iterator

【问题讨论】:

  • 你传入这个函数的参数是什么?
  • 编辑您的问题,向我们展示您如何运行 doctest,包括完整的输出。
  • 这个函数没有文档字符串,所以我怀疑错误来自其他地方。
  • 你不能在字符串上调用next()。你想做什么?
  • next() 可能不是您期望的那样。为什么你认为你可以这样称呼它?您的其他代码甚至与此有什么关系?你确定你不是要打电话吗? swap(…) 还是什么?另外,您为什么要运行 doctest,该源中没有文档。

标签: python function python-3.x doctest


【解决方案1】:
def swap2 (cards):    
    """
    >>> next('FBFFFBFFBF')
    'FFBBBFBBFF'
    >>> next('BFFBFBFFFBFBBBFBBBBFF')
    'FBBFBFBBBFBFFFBFFFFFF'
    >>> next('FFBFBFBFBFBFBFBBFBFBFBFBBFBFBBFBF')
    'FFFBFBFBFBFBFBFFBFBFBFBFFBFBFFBFF'
    """

    # …

该函数称为swap2,但在文档测试中,您使用的是next,它恰好是一个built-in function,它做了完全不同的事情。这就是您看到该错误的原因。


在这种情况下,实际查看错误消息非常重要。它清楚地告诉你什么叫做:

File "<doctest __main__.swap2[0]>", line 1, in <module>
  next('FBFFFBFFBF')

因此,如果您不知道它应该来自哪里,请查看错误消息。 Doctest 会告诉你它正在执行什么:swap2[0]swap2[1] 等告诉你函数名 doctest 正在执行的文档字符串以及它是哪个测试用例(0 是第一个,1第二个等)。它甚至为您提供错误出现的行号(在 doctest 案例中),当然还有导致错误的行。因此,请使用该信息查找有问题的代码,并找出问题所在。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-07
    • 2013-06-18
    • 1970-01-01
    • 2023-03-06
    • 2012-08-20
    • 1970-01-01
    • 2015-07-09
    • 2021-08-21
    相关资源
    最近更新 更多