我对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 )
的情况下如何实现?
答案 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)
,并以恒定的步长从start
到stop
。
如果要使用单个函数,则可以使用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)
发生的方式是首先
编辑:第一部分是解释为什么它不起作用
您将获得一个由range函数生成的列表(虽然不是python3),现在它仅返回一个函数范围及其当前状态,可以是float或int,因此在此处使用/10 as step
除了无效的语法外,它什么都不做,因为range只接受整数。
只有在此之后,x才会被初始化并开始以索引方式获取字典中存在的值。
您可以使用
for y in range(2,-1,-1):
x = (10**y)
欢迎使用python并祝您编程愉快。
感谢@GPhilo指出错误。