函数出错:“str”对象不是i

2024-06-02 05:54:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我在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来查看是否有错误,它会告诉我:

^{pr2}$

我不知道错误从何而来。 有人能帮我吗?在

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

Tags: inpymainlineusersdoctestfilenext
1条回答
网友
1楼 · 发布于 2024-06-02 05:54:36
def swap2 (cards):    
    """
    >>> next('FBFFFBFFBF')
    'FFBBBFBBFF'
    >>> next('BFFBFBFFFBFBBBFBBBBFF')
    'FBBFBFBBBFBFFFBFFFFFF'
    >>> next('FFBFBFBFBFBFBFBBFBFBFBFBBFBFBBFBF')
    'FFFBFBFBFBFBFBFFBFBFBFBFFBFBFFBFF'
    """

    # …

函数名为swap2,但在doctest中,您使用的是next,它恰好是一个built-in function,它的作用完全不同。这就是你看到错误的原因。在


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

^{pr2}$

所以,如果你不知道这是从哪里来的,那么检查一下错误信息。Doctest将告诉您它正在执行什么:swap2[0]swap2[1],等等。告诉您Doctest正在执行的docstring函数名以及它是哪个测试用例(0是第一个,1是第二个等等)。它甚至给出了错误出现的行号(在doctest案例中),当然还有导致错误的行。因此,使用这些信息可以找到有问题的代码,并找出问题所在。在

相关问题 更多 >