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

时间:2019-01-12 10:29:32

标签: python for-loop range conditional

我正在尝试回答以下练习问题:

“编写一个循环(建议使用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作为输出!

有人可以向我解释为什么代码如此行吗?预先感谢!

3 个答案:

答案 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的位置。您可以通过更改minimummaximum来清理代码开始之前,请根据需要进行操作,而不是移动range中的每个数字。

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