我正在尝试回答以下练习问题:
“编写一个循环(建议使用for循环),从最小到最大打印数字,包括最小和最大值本身。如果偶数为True,则仅打印偶数。如果偶数为False,则仅打印奇数。您可以假设最小值将始终小于最大值。”
为此,我编写了以下代码,它适用于某些最小值和最大值:
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
作为输出!
有人可以向我解释为什么代码如此行吗?预先感谢!
答案 0 :(得分:0)
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)
答案 1 :(得分:0)
因为在for循环中,您正在递增number
变量,所以wich是循环索引,应该由循环本身进行管理。
特别是当您到达时,电话号码是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
答案 2 :(得分:0)
当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)