[英]Why am I unable to compare an iterated value without assigning it to a variable first?
我已經有了解決這個 Python 代碼問題的方法,但是為了成為一個更好的編碼器,我試圖更好地理解為什么首先存在這個問題。
這有效:
numbersA = [45, 22, 25, 73, 10, 33]
for i in range(len(numbersA)):
numz = numbersA[i]
if numz % 3 == 0:
numbersA[i] = "buzz"
if numz % 5 == 0:
numbersA[i] = "fizz"
print(numbersA)
但是這個:
numbersB = [45, 22, 25, 73, 10, 33]
for i in range(len(numbersB)):
if numbersB[i] % 3 == 0:
numbersB[i] = "buzz"
if numbersB[i] % 5 == 0:
numbersB[i] = "fizz"
print(numbersB)
給出一個錯誤:
Traceback (most recent call last):
File "...", line 18, in <module>
if numbersB[i] % 5 == 0:
TypeError: not all arguments converted during string formatting
我的問題是為什么?
讓我們看一下第一次迭代,即i = 0
。 數字45
可以被3
整除。 所以第一個if
被執行。
在其中,您就地更改列表,現在numbersB[0] = "buzz"
。
在以下行中,您嘗試執行if numbersB[0] % 5 == 0
,現在等效於if "buzz" % 5 == 0
這是一種進行字符串格式化的方法,這就是您收到錯誤的原因.
在 Python 中,很少需要迭代索引。 在您的情況下, enumerate
將使您的代碼正確且可讀:
numbersB = [45, 22, 25, 73, 10, 33]
for i, num in enumerate(numbersB):
if num % 3 == 0:
numbersB[i] = "buzz"
if num % 5 == 0:
numbersB[i] = "fizz"
print(numbersB)
你的代碼有問題。 如果滿足第一個“if”,則該位置的值變為字符串“buzz”。 然后,當檢查第二個“if”時,您會找到一個字符串的其余部分和一個 integer,這是一個未定義的操作。
在代碼 2 中,您正在修改現有列表,然后根據 % 操作檢查修改后的值。
例如,對於值 45 列表是,[45,1,2,3] 說,現在對於條件 1,即如果 value%3 為真,那么numberB[i]%3==0
即45%3==0
為真,所以您正在將其修改為“嘶嘶聲”。
numverB[0]='buzz'
現在列表變為 ['fizz', 1,2,3..] 現在您正在測試下一個條件,即 % by 5,因此 'buzz'%5 會給出錯誤,因為 mod 操作不起作用海峽
簡單來說,代碼 1 您正在使用一個臨時數據值,它在列表中保存索引值,並測試該變量的條件,然后修改列表值。
在code2中,您直接檢查列表中的索引值,並根據條件滿足,修改內部列表值,所以由於,值除以3和5,值除以3時首先修改為'buzz'然后當您在該索引處測試值(現在變為“嗡嗡聲”而不是 int 值)時,您無法將字符串除以 integer。 所以你得到了錯誤
numbersB = [45, 22, 25, 73, 10, 33]
for i in range(len(numbersB)):
print('value at index {} is {} before any operation'.format(i,numberB[i]))
if numbersB[i] % 3 == 0:
numbersB[i] = "buzz"
print('value at index {} is {} after dividing by 3 operation'.format(i,numberB[i]))
if numbersB[i] % 5 == 0:
numbersB[i] = "fizz"
print('value at index {} is {} after dividing by 5 operation'.format(i,numberB[i]))
print(numbersB)
運行上面的代碼,可以看到code2中的值是如何變化的
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.