在Python中,range(1,100,* 10)不起作用?

时间:2019-01-24 09:18:38

标签: python list loops for-loop

我对range()或for循环有疑问。

在C ++中,for循环可以这样使用:

for(int i=1;i<=100;i*=10){
 //lala
}

导致错误的我的Python脚本如下:

li = [x for x in range(100, 0, /10)]

print(li)

我希望得到li = [100, 10, 1]

在不使用li.append ( 100, 10, 1 )的情况下如何实现?

6 个答案:

答案 0 :(得分:4)

您不能为此使用range。 range的第三个参数是用于增加值的固定步骤:它不能用于乘或除前一个值。

相反,请使用while循环:

i = 1
while i < 100:
   ...
   i *= 10  # or i /= 10 depending on what you want.

如果您真的想要使用列表理解功能,则可以按照Albin Paul的建议进行操作:

li = [10**x for x in range(3) ]  # [1, 10, 100]
li = [10**x for x in range(2, -1, -1)  # [100, 10, 1]

答案 1 :(得分:1)

内置范围不用于这种方式。它包含三个参数:range(start, stop, step),并以恒定的步长从startstop

如果要使用单个函数,则可以使用numpy的logspace

它看起来像这样:

import numpy
li = numpy.logspace(0, 2, base=10, dtype = int)
# li is [1, 10, 100]
# goes from base^0 to base^2, so from 1 to 100

如果您不想依靠numpy,那么使用while循环的解决方案对我来说似乎非常Python化。

基准时间:D

一条评论指出该解决方案可能是:

  • 不明显

第一个问题是品味问题,但我对性能不满意:

reps = 100000
list_elems = 100

start = time.perf_counter()
for i in range(reps):
    np.logspace(0, list_elems, base=2, dtype=int)
end = time.perf_counter()
numpy_time = end - start


start = time.perf_counter()
for i in range(reps):
    [2**x for x in range(list_elems)]
end = time.perf_counter()
python_time = end - start

# reps = 100000
# list_elems = 100
# numpy took 1.70, python took 2.86

# reps = 100000
# list_elems = 10
# numpy took 1.65, python took 0.242

当然,这很大程度上取决于您要生成的列表元素的数量。 Numpy引入了开销,但扩展性更好。因此,对于较短的列表,python会获胜。

答案 2 :(得分:1)

您可以简单地使用生成器表达式,例如

for i in (10 ** x for x in range(2, -1, -1)):
    print(i)
# 100
# 10
# 1

或者,如果您希望“功率范围”成为可重用的功能,则可以创建自己的功能,即

def powrange(*args, base=10):
    for i in range(*args):
        yield base ** i


for i in powrange(2, -1, -1, base=10):
    print(i)
# 100
# 10
# 1

答案 3 :(得分:0)

要进行log(n)时间复杂度的循环更改,您需要使用log函数或使用while循环来完成工作

In [10]: import math
In [9]:  [10**x for x in range( 0,int(math.log10(1000)))]
Out[9]: [1, 10, 100]

我仍然认为while循环是解决之道

答案 4 :(得分:0)

The arguments for range是:开始,停止和步进,其中步长为int。 也许您希望看到这样的结果:

li = [10**x for x in range(0, 3, 1)]
print(li)
  

[1,10,100]

总体来看一门不错的学习课程,例如“使用Python自动完成无聊的事情”:

答案 5 :(得分:-1)

当您将for循环用作 with x in range(start,stop,step)

发生的方式是首先

编辑:第一部分是解释为什么它不起作用

  1. 您将获得一个由range函数生成的列表(虽然不是python3),现在它仅返回一个函数范围及其当前状态,可以是float或int,因此在此处使用/10 as step除了无效的语法外,它什么都不做,因为range只接受整数。

  2. 只有在此之后,x才会被初始化并开始以索引方式获取字典中存在的值。

您可以使用

for y in range(2,-1,-1): x = (10**y)

欢迎使用python并祝您编程愉快。

感谢@GPhilo指出错误。