我想回答以下练习题:
“写一个循环(我们建议一个for循环),打印从最小到最大的数字,包括最小和最大数。如果是偶数,只打印偶数。如果是偶数,只打印奇数。你可以假设最小值总是低于最大值。“
为此,我编写了以下代码,它适用于某些最小值和最大值:
minimum = 5
maximum = 14
even = True
if even:
for numbers in range(minimum, maximum+1, 2):
if numbers%2 == 0:
print(numbers)
elif numbers%2 == 1:
numbers += 1
print(numbers)
else:
for numbers in range(minimum, maximum+1, 2):
if numbers%2 == 1:
print(numbers)
elif numbers%2 == 0:
numbers += 1
print(numbers)
这产生了我想要的6, 8, 10, 12, 14
输出。
但是,一旦我的最小值,最大值和偶数值被改变,例如:
minimum = 29
maximum = 33
even = True
代码以某种方式生成30, 32 and 34
的输出。 34> 33因此它不应该存在,但它确实存在。我假设range()
工作使得它不包括最大数量,因此我使用maximum+1
包括maximum
作为问题,但它包括一个甚至超出maximum+1
的数字!
为了进一步测试,我尝试将变量改为如下,并发现一些有趣的东西,因为它也令人费解:
minimum = 1
maximum = 4
even = False
正如所料,我得到了1, 3
作为我的输出。然而,当我改变minimum = 2
时,我得到了3, 5
作为我的输出!
有人可以向我解释为什么代码这样做?提前致谢!
因为当你在for循环中时,你正在递增number
变量,它是循环索引,并且应该由循环本身来管理。
特别是当你到达时,数字是33
elif numbers%2 == 1:
numbers += 1
print(numbers)
它增加1并且即使它被打印也是34。
我可以建议实施:
for number in range(minimum, maximum+1):
if (number%2 == 0 and even):
print number
elif (number%2 != 0 and not even):
print number
当maximum
为33并且你制作一个range
对象去maximum+1
时,你将看到它的最大值是maximum
,它是33.但是,当你用numbers += 1
将该值加1时,你将其改为34 ,这是你得到的地方34.你可以在开始之前根据需要更改minimum
和maximum
来清理代码,而不是移动range
中的每个数字。
def printer(low, hi, even):
for num in range(low + (even == low%2), hi+1, 2):
print(num)
mn, mx, even = 5, 14, True
for x in range(mn + int(bool(mn % 2) == even), mx + 1, 2):
print(x)
int()将bool值转换为0或1,这是启动所必需的偏移量。
PS要理解为什么你的代码超出范围,假设numbers = 33
,将其插入代码中,看看会发生什么:
if numbers%2 == 0:
print(numbers)
elif numbers%2 == 1:
numbers += 1
print(numbers)