簡體   English   中英

為什么我在循環中運行一個簡單的函數會出現類型錯誤?

[英]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 error。

這是問題:(從代碼戰 - IPv4 到 int32)

取以下 IPv4 地址:128.32.10.1 該地址有 4 個八位字節,其中每個八位字節是一個字節(或 8 位)。

第一個八位字節 128 有二進制表示:10000000 第二個八位字節 32 有二進制表示:00100000 第三個八位字節 10 有二進制表示:00001010 第四個八位字節 1 有二進制表示:000000800100100.0100.010010010010010010010010010010010

因為上面的IP地址是32位的,我們可以用32位的數字來表示:2149583361。

編寫一個函數 ip_to_int32(ip) ( JS: ipToInt32(ip) ),它接受一個 IPv4 地址並返回一個 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已經是整數的字符串表示形式,因此無需將其轉換為二進制然后再轉換回十進制。 你可以只返回int(x) (它並不需要是一個單獨的函數)。

有許多其他方法可以改進您的代碼,但由於這是 Codewars 的挑戰,我將把它留給您。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM