在Python中创建数学系列的高效,优雅的方法

时间:2017-06-29 18:51:35

标签: javascript python

在Javascript中,这是一个简单的数学系列。

var myList = []

for (var x = 2; x < 10000; x = x * 2) {
    mylist.push(x);
}

我无法在 Python 中创建类似的系列,而不是:

  • 使用while循环

  • 在理解中将整个数字范围循环至10,000

这是一种罕见的情况,其中Python是一种不太优雅的语言吗?
我不知道Python中的某些功能吗?

3 个答案:

答案 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中更优雅。

你的问题,特别是,通过注意你真正想要评估的实际基础数学表达式,很容易表达(用任何一种语言):

enter image description here

在python中,这是:

from math import floor, log2
[2**x for x in range(1, floor(log2(10000))+1)]

事实上,我不确定你是否可以用JavaScript来代表这个版本的构造,但不要引用我,因为我不是那种语言的专家。

所以答案是......这实际上取决于你想要表达的内容。在这种情况下,我更喜欢将python列表理解用于循环中的评估(使用任何一种语言),但这只是我。