[英]Trying to convert RLE to ASCII but will not allow me to convert more than one line
我正在嘗試編寫一個函數,該函數允許我將用戶以'01h01e02l01o'
形式輸入的RLE轉換為ASCII 'hello'
。 用戶需要分別輸入每一行,雖然我的代碼讓我輸入第一行,但會出現錯誤消息。
def enterRLE():
print ('\n' + 'You have selected option 1: Enter RLE')
lineNo = 0
lineNoList = []
RLEList = []
while lineNo <= 2:
lineNo = int(input('How many lines of RLE would you like to input? Please enter a number over 2. '))
for i in range(lineNo):
RLEData = input('\n' + "Please enter one line of RLE and press enter. Enter your code with two digits, for example '07c' or '40a'. ")
RLEList.append(RLEData)
RLELength = len(RLEList)
for i in range(RLELength):
n = 3
RLEData = [RLEData[i:i+n] for i in range(0, len(RLEData), n)]
for i in (RLEData):
numOfChar = int(i[0:2])
numOfChar = ((i[2:3])*numOfChar)
print(numOfChar, end = "")
如果我將第二行輸入為“01h01a02l01w01a01y”,則輸出應為“走廊”,然后它應詢問我的第三行,但是,輸出為“走廊”,然后顯示以下顯示錯誤:
File "rleConverter.py", line 16, in enterRLE
numOfChar = int(i[0:2])
TypeError: int() argument must be a string or a number, not 'list'
這個問題實際上不是關於 RLE,而是關於基本的編程知識/經驗。 所以我會根據你問題中的代碼給你一些建議。
當代碼沒有按預期工作時該怎么辦
當您的代碼未按預期工作時,請先嘗試對其進行調試。 做這件事有很多種方法:
i
的值以了解發生了什么。使用這些方法中的任何一種,您都可能會在代碼中發現錯誤。
如何改進你的代碼(這樣你就不必調試了)
代碼的最大問題與命名內容(主要是變量)有關。 考慮要存儲哪些變量,並適當地命名它們。 在閱讀代碼時,應該很容易從變量名中“猜測”出變量的實際含義。
i
被多次使用,這會導致問題)。lineNoList
已分配但從未使用過。)for i in range(...)
構造不是必需的,但可以用更簡單、更 Pythonic 的代碼替換(例如, for line in lines: ...
,其中lines
是列表、元組或其他迭代器,或for line in file: ...
,其中file
是一個打開的文件)。 這更易於閱讀並減少了您必須定義的變量數量。此外,在編程時使用pylint檢查代碼。 它會給你有價值的反饋。 在這種情況下,它會為您的代碼的第 12 和 15 行報告以下消息:
從外部范圍重新定義名稱“i”(第 8 行)
因此,使用 pylint,您會在運行代碼之前就已經發現了此錯誤 :-)
例如,以下是您的代碼的修改版本,它可以正常工作:
def decode_rle(line):
parts = [line[i:i+3] for i in range(0, len(line), 3)]
for part in parts:
length = int(part[0:2])
character = part[2]
print(length * character, end='')
def enter_rle():
print('\nYou have selected option 1: Enter RLE')
num_lines = 0
while num_lines <= 2:
num_lines = int(input('How many lines of RLE would you like to input? Please enter a number over 2. '))
for _ in range(num_lines):
line = input("\nPlease enter one line of RLE and press enter. Enter your code with two digits, for example '07c' or '40a'. ")
decode_rle(line)
if __name__ == '__main__':
enter_rle()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.