簡體   English   中英

為什么不先將迭代值分配給變量就無法比較迭代值?

[英]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==045%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.

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