在Javascript中,这是一个简单的数学系列。
var myList = []
for (var x = 2; x < 10000; x = x * 2) {
mylist.push(x);
}
我无法在 Python 中创建类似的系列,而不是:
使用while循环
在理解中将整个数字范围循环至10,000
这是一种罕见的情况,其中Python是一种不太优雅的语言吗?
我不知道Python中的某些功能吗?
答案 0 :(得分:0)
这可以通过对生成器表达式进行操作的itertools(由4castle建议)来完成。
from itertools import takewhile, count
myList = takewhile(lambda x: x < 10000, map(lambda x: 2 ** x, count()))
在python 2中,您需要使用itertools.imap
而不是map
。
答案 1 :(得分:0)
我在这里没有提出这个问题。你觉得优雅是什么?对于一些(非常清晰)额外的你可以设置一个while
循环。
def my_func():
x = 2
my_list = []
while x < 10000:
my_list.append(x)
x = x * 2
我在古老的笔记本电脑上使用timeit
获取基本代码:
10000000 loops, best of 3: 34.9 ns per loop
这场辩论在执行时间或可读性方面无关紧要。进一步讨论这个问题没有任何好处,只能进入一场关于{}
和;
的辩论,这些辩论一般都是JS,这会适得其反。我确定有些人正在寻找单行,但这将是混淆和低效的。
答案 2 :(得分:0)
“高效”和“优雅”可能有点含糊不清。我认为“高效”意味着既简洁又快速评估。我认为优雅意味着可以从源头快速,轻松地理解其评估结果。
一般来说,你的问题很难回答,因为在大多数情况下,数学家编写的数学系列可能包括任意复杂的操作,这些操作可能会或可能不会解析为某种语言中的“优雅”(例如线性) MATLAB / Octave中的代数比Python中更优雅。
你的问题,特别是,通过注意你真正想要评估的实际基础数学表达式,很容易表达(用任何一种语言):
在python中,这是:
from math import floor, log2
[2**x for x in range(1, floor(log2(10000))+1)]
事实上,我不确定你是否可以用JavaScript来代表这个版本的构造,但不要引用我,因为我不是那种语言的专家。
所以答案是......这实际上取决于你想要表达的内容。在这种情况下,我更喜欢将python列表理解用于循环中的评估(使用任何一种语言),但这只是我。