【问题标题】:Python For loop and range functionPython For循环和范围函数
【发布时间】:2014-01-24 20:02:55
【问题描述】:
def countMe(num):
    for i in range(0, num, 3):
        print (i)

countMe(18)

def oddsOut(num1, num2):

    for i in range(num1):
        for j in range(num2):
            print(i*j)

oddsOut(3, 8)

我不明白 range 函数是如何工作的:

  • countMe 中的代码不应该上升到 18 吗;
  • 为什么在countMe中打印的最后一个数字是15,而不是18;
  • 为什么在第二个函数oddsOut 中,即使 j 是 8,该函数也只能为 j 找到 7 而不是 8;
  • 为什么oddsOut 14 中打印的最后一个数字。

【问题讨论】:

  • range的stop参数(第二个)是排他不包括。
  • Python 中的几乎 all 范围都是“半开”的,这意味着开始是包含的,而停止是排他的——range 函数、切片等。这在Strings 的教程章节中进行了解释,首先介绍了切片,并且应该在任何其他教程/文本/等的早期类似地显示。
  • 如果你想让它包含 18 个,也许只需将 num 更改为 num + 3
  • 我知道的 stdlibs 中唯一包含端点的东西是random.randint
  • @user3193087 实际上,没有。您需要将num 更改为num+1

标签: python for-loop range


【解决方案1】:

好吧,从帮助:

>>> help(range)
range(...)
    range([start,] stop[, step]) -> list of integers

    Return a list containing an arithmetic progression of integers.
    range(i, j) returns [i, i+1, i+2, ..., j-1]; start (!) defaults to 0.
    When step is given, it specifies the increment (or decrement).
    For example, range(4) returns [0, 1, 2, 3].  The end point is omitted!
    These are exactly the valid indices for a list of 4 elements.

所以最后一个增量不是stop,而是stop之前的最后一步。

  • countMe 中的代码不应该上升到 18 ;
  • 为什么countMe中打印的最后一个数字是15,而不是18;
  • 为什么在第二个函数oddsOut 中,即使 j 为 8,该函数也只能计算到 j 的 7 而不是 8;
  • 为什么在oddsOut 14 中打印最后一个数字。

更一般地说,这些问题的答案是,在大多数语言中,范围定义为 [start:stop[,即从不包括范围的最后一个值,并且索引始终从 0 开始。混乱之处在于,在一些语言中,在处理算法时,范围从 1 开始,并包含最后一个值。

最后,如果你想包含你可以做的最后一个值:

def closed_range(start, stop, step=1):
    return range(start, stop+1, step)

或者在你的例子中:

>>> def countMe(num):
>>>     for i in range(0, num+1, 3):
>>>         print (i)
>>> 
>>> countMe(18)
0
3
6
9
12
15
18
>>> 

【讨论】:

  • stop-step?那么range (0, 100, 7) 产生的最后一个数字是93? (实际上是98
【解决方案2】:

例如,范围内的停止参数不包括该数字

for i in range(0,5):
    print i

会打印 0-4 但不会打印 5。

【讨论】:

    【解决方案3】:

    Python 中的范围包含结束值。这与切片是一致的。

    如果您需要一种方法来记住这一点,请考虑 range(10) 有 10 个元素 - 数字 0 到 9。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 2018-09-15
      • 2018-12-20
      • 2022-12-16
      • 2018-11-04
      相关资源
      最近更新 更多