为什么我不能比较一个迭代值而不首先将它赋给一个变量?

2024-06-16 11:32:04 发布

您现在位置:Python中文网/ 问答频道 /正文

对于这个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

我的问题是为什么


Tags: 代码inforlenif错误range解决方案
3条回答

让我们看一下第一次迭代,即i = 0。数45可被3整除。因此第一个if被执行

在它里面,您可以就地更改列表

在下一行中,您尝试执行if numbersB[0] % 5 == 0,它现在相当于if "buzz" % 5 == 0,它是a way to do string formatting,这就是为什么会出现错误

在Python中,很少需要迭代索引。在您的情况下,^{}将使您的代码正确且可读:

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)

在代码2中,您正在修改现有列表,然后根据%操作检查修改后的值

例如,对于值45,列表是,[45,1,2,3],比如说,现在对于条件1,即如果值%3为真 所以numberB[i]%3==045%3==0是真的,所以您将其修改为“fizz”

numverB[0]='buzz'现在列表变成['fizz',1,2,3..] 现在您正在测试下一个条件,即%by 5,因此'buzz'%5'给出了错误,因为mod操作在str上不起作用

简单来说,代码1使用一个临时数据值,该值保存在列表中的索引值,并测试该变量的条件,然后修改列表值

在代码2中,您直接检查列表中的索引值,并基于条件满足,修改内部列表值,因此,由于值除以3和5,值首先在除以3时修改为“buzz”,然后在测试该索引处的值时(现在变为“buzz”而不是int值)所以不能将字符串除以整数。所以你得到了错误

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中的值是如何变化的

您的代码有问题。 如果满足第一个“If”,则该位置的值将变成字符串“buzz”。然后,当第二个“if”被选中时,您将找到字符串和整数的剩余部分,这是一个未定义的操作

相关问题 更多 >