输出超出range()函数中指定的最大值

问题描述 投票:0回答:3

我想回答以下练习题:

“写一个循环(我们建议一个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作为我的输出!

有人可以向我解释为什么代码这样做?提前致谢!

python for-loop range conditional
3个回答
0
投票

因为当你在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

0
投票

maximum为33并且你制作一个range对象去maximum+1时,你将看到它的最大值是maximum,它是33.但是,当你用numbers += 1将该值加1时,你将其改为34 ,这是你得到的地方34.你可以在开始之前根据需要更改minimummaximum来清理代码,而不是移动range中的每个数字。

def printer(low, hi, even):
    for num in range(low + (even == low%2), hi+1, 2):
        print(num)

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)
© www.soinside.com 2019 - 2024. All rights reserved.