【问题标题】:Pythonic way to iterate through a range starting at 1遍历从 1 开始的范围的 Pythonic 方式
【发布时间】:2016-01-21 19:34:32
【问题描述】:

目前,如果我想通过 n 迭代 1,我可能会使用以下方法:

for _ in range(1, n+1):
    print(_)

有没有更简洁的方法来完成此操作而无需参考 n + 1

如果我想迭代一个从 1 开始的范围,这并不罕见,我必须指定两次增加 1,这似乎很奇怪:

  1. 1 位于范围的开头。
  2. + 1 在范围末尾。

【问题讨论】:

  • 为什么你认为这是一种“肮脏”的方式?
  • n+1 评估一次,所以这不是dirty 方式。作为一种选择,如果您不喜欢将 n+1 作为 range 参数,请提前对其进行评估并将结果保存到变量中,然后在 range 调用中使用此变量。
  • 我必须指定两次增加一 你连一次都没有这样做。您正在指定范围的 start (1) 和 end (n+1)。您根本没有指定增加/增量
  • 我想迭代 n 次,但必须修改对 n 的引用才能建立迭代。
  • 问题似乎是n分配不当。如果您更正了n 的分配(即代码中的其他位置),那么您可以只执行for i in range(1,n):,但您可能需要n+=1,因为范围是从0 索引的,所以range(2) == [0,1],等等

标签: python loops


【解决方案1】:

来自文档:

range([start], stop[, step])

start 默认为 0,step 可以是任何你想要的,除了 0 和 stop 是你的上限,它不是迭代次数。因此,将 n 声明为正确的上限,您不必将其加 1。

例如

>>> for i in range(1, 7, 1): print(i)
... 
1
2
3
4
5
6
>>> for i in range(1, 7, 2): print(i)
... 
1
3
5

一个不错的功能是它也可以反向工作。

>>> for i in range(7, 0, -1): print(i)
... 
7
6
5
4
3
2
1

【讨论】:

    【解决方案2】:

    range(1, n+1) 是常用的方法,但如果你不喜欢它,你可以创建你的函数:

    def numbers(first_number, last_number, step=1):
        return range(first_number, last_number+1, step)
    
    for _ in numbers(1, 5):
        print(_)
    

    【讨论】:

      【解决方案3】:

      不是一般的答案,但对于 非常 个小范围(例如,最多五个),我发现用文字拼出它们更具可读性:

      for _ in [1,2,3]:
          print _
      

      即使从零开始也是如此。

      【讨论】:

        【解决方案4】:
        for i in range(n):
            print(i+1)
        

        这将输出:

        1 
        2
        ...
        n    
        

        【讨论】:

        • 这并不意味着更干净,因为每当我想引用循环计数时,我都必须使用 +1。而不是在定义循环时使用 +1 一次,我可能不得不多次使用它。
        【解决方案5】:

        range(1, n+1) 不被视为重复,但我可以看到,如果您要将 1 更改为另一个数字,这可能会很麻烦。

        这会使用生成器删除重复项:

        for _ in (number+1 for number in range(5)):
            print(_)
        

        【讨论】:

        • 这个问题的答案很好,但我们真的从range(1, n+1)前进了
        • 我不会这么说的。我刚刚有了一个很酷的生成器想法,它看起来真的很pythonic,并想分享它。
        猜你喜欢
        • 2022-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-25
        • 2012-06-17
        • 2016-05-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多