对于这个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
被执行在它里面,您可以就地更改列表
在下一行中,您尝试执行
if numbersB[0] % 5 == 0
,它现在相当于if "buzz" % 5 == 0
,它是a way to do string formatting,这就是为什么会出现错误在Python中,很少需要迭代索引。在您的情况下,^{} 将使您的代码正确且可读:
在代码2中,您正在修改现有列表,然后根据%操作检查修改后的值
例如,对于值45,列表是,[45,1,2,3],比如说,现在对于条件1,即如果值%3为真 所以
numberB[i]%3==0
即45%3==0
是真的,所以您将其修改为“fizz”numverB[0]='buzz'
现在列表变成['fizz',1,2,3..] 现在您正在测试下一个条件,即%by 5,因此'buzz'%5'给出了错误,因为mod操作在str上不起作用简单来说,代码1使用一个临时数据值,该值保存在列表中的索引值,并测试该变量的条件,然后修改列表值
在代码2中,您直接检查列表中的索引值,并基于条件满足,修改内部列表值,因此,由于值除以3和5,值首先在除以3时修改为“buzz”,然后在测试该索引处的值时(现在变为“buzz”而不是int值)所以不能将字符串除以整数。所以你得到了错误
运行上面的代码,您可以看到code2中的值是如何变化的
您的代码有问题。 如果满足第一个“If”,则该位置的值将变成字符串“buzz”。然后,当第二个“if”被选中时,您将找到字符串和整数的剩余部分,这是一个未定义的操作
相关问题 更多 >
编程相关推荐