【问题标题】:Python range functionPython范围函数
【发布时间】:2011-09-23 16:14:49
【问题描述】:

假设我想从 0 循环到 100,但步长为 1/2。如果你尝试

for i in range(0, 100, 0.5):
    whatever

错误:

步长不能为0

问题: Python 2.x 中是否有任何内置方法可以执行此类操作?

【问题讨论】:

  • 看看一些答案,这将是一个很好的反向代码高尔夫问题......

标签: python python-2.7 range


【解决方案1】:

Python2.x:

for idx in range(0, int(100 / 0.5)):

    print 0.5 * idx      

输出:

0.0

0.5

1.0

1.5

..

99.0

99.5


Numpy:

numpy.arange 也可以解决问题。

numpy.arange(0, 100, 0.5)

【讨论】:

  • 有趣的方法,但我喜欢它。 :)
  • @NPE 我在这里遗漏了什么吗?这是结果TypeError: range() integer end argument expected, got float.
  • @gongzhitaao:你说的很对,这需要显式转换为int(见编辑)。由于答案是两年多前写的,我不记得为什么要这样写。
【解决方案2】:

如果你有numpy,这里有两种方法:

numpy.arange(0, 100, 0.5)

numpy.linspace(0, 100, 200, endpoint=False)

【讨论】:

    【解决方案3】:

    range() 和xrange() 必须使用整数步长。这就是为什么您的 0.5 步在内部转换为 0 并且您收到该错误的原因。试试for i in [j / 2.0 for j in xrange(100 * 2)]:

    【讨论】:

    • 会发生整数截断,因此您只需将每个整数重复两次。
    【解决方案4】:

    您必须手动创建循环,或定义自己的自定义范围函数。内置需要一个整数步长值。

    【讨论】:

      【解决方案5】:
      for x in map(lambda i: i * 0.5, range(0,200)):
        #Do something with x
      

      【讨论】:

      • map 和一个简单可迭代的 lambda 函数?看起来很酷且功能强大的编程,但实际上,它只会增加不必要的计算复杂性。
      【解决方案6】:

      对于较大的范围,最好使用生成器表达式而不是显式构建列表:

       for k in ( i*0.5 for i in range(200) ):
           print k
      

      这不会消耗太多额外的内存,速度快且易于阅读。 见http://docs.python.org/tutorial/classes.html#generator-expressions

      【讨论】:

      • 在 Python 2 中,由于 range() 会生成一个列表,因此您将无法节省生成器表达式的内存;改用 xrange() 。在 Python 3 中,xrange() 替换了 range()。
      猜你喜欢
      • 2013-10-12
      • 2020-12-28
      • 1970-01-01
      • 1970-01-01
      • 2021-05-21
      • 2018-09-15
      • 1970-01-01
      • 2013-07-08
      • 1970-01-01
      相关资源
      最近更新 更多