“float”对象无法解释为整数,但转换为整数不产生输出。

7

我正在尝试测试某个字符串是否是回文。以下是我的代码:

这个函数返回一个较长字符串的前半部分。 (“TEST”返回“TE”,“HELLO”返回“HE”)

def takeStart(s):
    start = ""

    # The following determines the final index of the first half

    if len(s)%2==0:  
        a = (len(s)/2)-1
    else:
        a = ((len(s)-1)/2)-1

    for i in range(a):
        start+=s[i]
    return start

这个函数返回一个字符串的后半部分。("TEST" 返回 "ST", "HELLO" 返回 "LO")

def takeEnd(s):  
    end = ""

    # The following determines the beginning index of the second half

    if len(s)%2==0:
        a = (len(s)/2)
    else:
        a = ((len(s)-1)/2)

    for i in range(a,len(s)):
        end+=s[i]
    return end

这个函数可以翻转一个字符串。("TEST" 翻转后为 "TSET","HELLO" 翻转后为 "OLLEH")

def flip(s):
    flipped = ""
    for i in range(1,len(s)):
        flipped+=s[len(s)-i]
    flipped+=s[0]
    return flipped

这段代码会计算两个三位数相乘的结果,并检查该结果是否为回文数。
for i in range(100,1000):
    for q in range(100,1000):
        a = i*q
        if takeStart(str(a)) == flip(takeEnd(str(a))):
            print(str(a))

当运行此代码时,它输出:
Traceback (most recent call last):
  File "[redacted]", line 39, in <module>
    if takeStart(str(a)) == flip(takeEnd(str(a))):
  File "[redacted]", line 14, in takeStart
    for i in range(a):
TypeError: 'float' object cannot be interpreted as an integer

好的,我认为只需要将a转换为整数就可以了。

这样做似乎移除了所有错误,但是没有任何输出。(偶尔会有新行出现,这让我觉得代码在运行但没有输出数据)

有什么想法吗?为什么会这样?

更新:我的代码现在是:

def takeStart(s):
    start = ""
    if len(s)%2==0:
        a = (len(s)//2)
    else:
        a = (len(s)-1)//2
    return start[0:a]

def takeEnd(s):  
    end = ""
    if len(s)%2==0:
        a = (len(s)//2)
    else:
        a = ((len(s)-1)//2)

    return end[int(a):len(s)]

def flip(s):
    return s[::-1]

for i in range(100,1000):
    for q in range(100,1000):
        a = i*q
        if takeStart(str(a)) == flip(takeEnd(str(a))):
            print(str(a))

这只是输出每一个数字。 我测试了每种方法,它们都返回空字符串。(我猜的),这就是为什么每个数字都通过了回文检查并被打印出来。


你正在使用Python 2还是Python 3? - Foon
1
顺便提一下,你正在让这件事变得比必要的更加困难。例如,不要一个一个地循环索引,只需使用切片即可。 - abarnert
看起来你正在使用Python 3,其中a由于除法运算的结果而变成了float...你可以使用//强制进行整数除法,但我还没有想太多这是否是你想要做的...正如@abarnet所提到的-有更简单的方法来完成这个(看起来像一个欧拉挑战...) - Jon Clements
2个回答

11
首先,使用range(int(a))range(int(a), len(s))可以解决错误。正如Jon Clements所指出的,您可以通过使用//而不是/更轻松地得到整数。但无论哪种方式,它都不会引起任何问题。
您的问题在于,Python中的range以及几乎所有相关内容都是半开放的。因此,您的takeStart函数返回所有值,但不包括半途点,也就是说,对于HELLO它给出H,对于TEST它给出T,对于BIGGERTEST它给出BIGG
只需删除a = …行上的-1即可解决该问题。
然后它会打印出许多回文输出行,这是您想要做的吧。
然而,您仍然无法获得任何奇数长度的回文。例如,对于'MADAM',即使您正确执行了这些函数,takeStart(s)MAtakeEnd(s)DAMflip(takeEnd(s))MAD,这与MAD不同。即使您的函数正常工作,它们也不能解决问题。因此,在设计和实现中都存在错误。如果您考虑一段时间,应该会想出如何使其起作用。
一旦这样做,您应该意识到可以大大简化takeStarttakeEnd。(提示:在哪些情况下您真正需要区分奇数长度和偶数长度?)
顺便说一下,这个:
foo = ""
for i in range(x, y):
    foo += s[i]
return foo

…只是一种冗长、缓慢且容易出错的编写方式,下面是更简洁易懂的写法:

return foo[x:y]

同样地,你的整个flipped函数只是:

return s[::-1]

@JonClements:同意...虽然如果他在编写take_middle之前解决了HEL/ LLO问题,那么简化事情的方法会更容易找到。 - abarnert
@CortneyReagle:是的,完全指定的切片看起来像[start:end:step]。默认值(实际上)是0len(s)1,但您可以指定任何您想要的内容,包括负数。 - abarnert
@abarnert 我已经有一个take_middle函数了,但正如你所说,我将其分离出来,以便更轻松地解决问题。 - Cortney Reagle
@CortneyReagle:你的代码现在是什么样子?如果我看不到它,那么调试起来就很困难,但我猜测你正在计算某些东西,但从未“返回”它... - abarnert
恭喜@CortneyReagle。只需注意一种可用于计算方便进行末尾切片和负起始位置切片的索引的小技巧是 sum(divmod(len(string), 2)),其中对于长度为5的情况,它会给出3,而对于长度为4的情况,则会给出2... 因此,'ABCBA'[:3] 将给你 ABC,而 'ABCBA'[-3:] 将给你 CBA... 然后检查它们是否互为翻转即可完成... - Jon Clements
显示剩余6条评论

0
Python的range()函数不支持浮点数,但是numpy的arange()函数支持。
要使用arange()函数,您需要安装和导入numpy包。我们将在此处使用arange()函数生成一系列浮点数。 arange()具有与内置的range()方法相同的签名。但是,我们可以将浮点类型参数作为参数传递给此函数。
import numpy
arange (start, stop, step)

在完整的代码示例中,它看起来如下所示:
from numpy import arange

print("Float range using NumPy arange():")

print("\nTest 1:")
for i in arange(0.0, 1.0, 0.1):
    print(i, end=', ')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接