为什么我在循环中得到 运行 一个简单函数的类型错误?
Why am i getting typeerror for running a simple function in a loop?
我正在编写一个函数来获取一个 ip 地址,将其每个部分(以“.”分隔)转换为一个 8 位二进制数字。然后我想把所有的二进制数组合起来得到一个大的 32 位数字,我想把它转换成十进制。我的 convert 函数在作为独立测试时工作正常,但是当它在循环中 运行 时,它给了我 TypeError: 'str' object cannot be interpreted as an integer
错误。
这是个问题:(从 codewars - IPv4 到 int32)
采用以下 IPv4 地址:128.32.10.1 该地址有 4 个八位字节,其中每个八位字节是一个字节(或 8 位)。
第一个八位字节 128 具有二进制表示:10000000
第二个八位字节 32 具有二进制表示:00100000
第三个八位位组 10 具有二进制表示:00001010
第 4 个八位字节 1 具有二进制表示:00000001
所以 128.32.10.1 == 10000000.00100000.00001010.00000001
因为上面的IP地址有32位,我们可以将其表示为32位的数字:2149583361。
写一个函数 ip_to_int32(ip) ( JS: ipToInt32(ip) ) 接受一个 IPv4 地址和 returns 一个 32 位数。
ip_to_int32("128.32.10.1") => 2149583361
def convert(x):
return int(bin(x).replace("0b", ''))
def ip_to_int32(ip):
data = ip.split('.')
converted = []
for i in range(len(data)):
converted.append(convert(data[i]))
str = ''
for i in converted:
str += i
num = int(str)
return dec(num).replace('0d', '')
这是我得到的错误:
Traceback (most recent call last):
File "tests.py", line 4, in <module>
test.expect(ip_to_int32("128.114.17.104") == 2154959208, "wrong integer for ip: 128.114.17.104")
File "/workspace/default/solution.py", line 8, in ip_to_int32
converted.append(convert(data[i]))
File "/workspace/default/solution.py", line 2, in convert
return int(bin(x).replace("0b", ''))
TypeError: 'str' object cannot be interpreted as an integer
这是测试文件:
test.describe("Basic Tests")
test.expect(ip_to_int32("128.114.17.104") == 2154959208, "wrong integer for ip: 128.114.17.104")
test.expect(ip_to_int32("0.0.0.0") == 0, "wrong integer for ip: 0.0.0.0")
test.expect(ip_to_int32("128.32.10.1") == 2149583361, "wrong integer for ip: 128.32.10.1")
感谢您的帮助!
问题是 convert()
的 x
参数是一个字符串。您不能将其用作 bin()
.
的参数
由于 x
已经是整数的字符串表示形式,因此不需要将其转换为二进制然后再转换回十进制。你可以只 return int(x)
(它并不需要是一个单独的函数)。
还有许多其他方法可以改进您的代码,但由于这是 Codewars 挑战,我将把它留给您。
我正在编写一个函数来获取一个 ip 地址,将其每个部分(以“.”分隔)转换为一个 8 位二进制数字。然后我想把所有的二进制数组合起来得到一个大的 32 位数字,我想把它转换成十进制。我的 convert 函数在作为独立测试时工作正常,但是当它在循环中 运行 时,它给了我 TypeError: 'str' object cannot be interpreted as an integer
错误。
这是个问题:(从 codewars - IPv4 到 int32)
采用以下 IPv4 地址:128.32.10.1 该地址有 4 个八位字节,其中每个八位字节是一个字节(或 8 位)。
第一个八位字节 128 具有二进制表示:10000000 第二个八位字节 32 具有二进制表示:00100000 第三个八位位组 10 具有二进制表示:00001010 第 4 个八位字节 1 具有二进制表示:00000001 所以 128.32.10.1 == 10000000.00100000.00001010.00000001
因为上面的IP地址有32位,我们可以将其表示为32位的数字:2149583361。
写一个函数 ip_to_int32(ip) ( JS: ipToInt32(ip) ) 接受一个 IPv4 地址和 returns 一个 32 位数。
ip_to_int32("128.32.10.1") => 2149583361
def convert(x):
return int(bin(x).replace("0b", ''))
def ip_to_int32(ip):
data = ip.split('.')
converted = []
for i in range(len(data)):
converted.append(convert(data[i]))
str = ''
for i in converted:
str += i
num = int(str)
return dec(num).replace('0d', '')
这是我得到的错误:
Traceback (most recent call last):
File "tests.py", line 4, in <module>
test.expect(ip_to_int32("128.114.17.104") == 2154959208, "wrong integer for ip: 128.114.17.104")
File "/workspace/default/solution.py", line 8, in ip_to_int32
converted.append(convert(data[i]))
File "/workspace/default/solution.py", line 2, in convert
return int(bin(x).replace("0b", ''))
TypeError: 'str' object cannot be interpreted as an integer
这是测试文件:
test.describe("Basic Tests")
test.expect(ip_to_int32("128.114.17.104") == 2154959208, "wrong integer for ip: 128.114.17.104")
test.expect(ip_to_int32("0.0.0.0") == 0, "wrong integer for ip: 0.0.0.0")
test.expect(ip_to_int32("128.32.10.1") == 2149583361, "wrong integer for ip: 128.32.10.1")
感谢您的帮助!
问题是 convert()
的 x
参数是一个字符串。您不能将其用作 bin()
.
由于 x
已经是整数的字符串表示形式,因此不需要将其转换为二进制然后再转换回十进制。你可以只 return int(x)
(它并不需要是一个单独的函数)。
还有许多其他方法可以改进您的代码,但由于这是 Codewars 挑战,我将把它留给您。