В Javascript это простой математический ряд.
var myList = []
for (var x = 2; x < 10000; x = x * 2) {
mylist.push(x);
}
Я не могу создать подобную серию в Python без:
Использование цикла while
Зацикливание по всему диапазону чисел до 10000 в понимании
Является ли это одним из редких случаев, когда Python является менее элегантным языком?
Я не знаю о некоторых функциях в Python здесь?
Я не понимаю здесь. Что вы считаете элегантностью? За пару (идеально разборчиво) дополнительным вы можете иметь в 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 в целом, что является контрпродуктивным. Я уверен, что некоторые люди ищут однострочники, но они будут запутаны и неэффективны.
while
цикл в Python является то , что гораздо менее элегантно , чем for
цикла в JS.
"Эффективный" и "элегантный" может быть немного неоднозначным. Я предполагаю, что "эффективный" означает как краткий, так и быстрый для оценки. И элегантный, я полагаю, результат его оценки можно быстро и легко понять из источника.
Трудно ответить на ваш вопрос, потому что математическая серия, написанная математиками, в большинстве случаев может включать произвольно сложные операции, которые могут или не могут разрешить что-то "изящное" на одном или другом языке (например, линейная алгебра много более элегантный в MATLAB/Octave, чем в Python).
Ваш вопрос, в частности, очень легко выразить элегантно (на любом языке), отметив фактическое математическое выражение, которое вы действительно пытаетесь оценить:
Что, в python, это:
from math import floor, log2
[2**x for x in range(1, floor(log2(10000))+1)]
На самом деле, я не уверен, что вы можете представить конструкцию этого набора элегантно с помощью JavaScript, но не цитируйте меня на этом, потому что я никоим образом не специалист в этом языке.
Так что ответ... Это действительно зависит от того, что вы пытаетесь выразить. В этом случае я предпочитаю понимание списка python для оценки в цикле (на любом языке), но это только я.
Это можно сделать с помощью itertools (как предложено 4castle), работающих с выражениями генератора.
from itertools import takewhile, count
myList = takewhile(lambda x: x < 10000, map(lambda x: 2 ** x, count()))
В python 2 вам нужно будет использовать itertools.imap
вместо map
.
myList
если вы хотите получить список значений с помощью list()
.
map(lambda x: x*2, range(2,10000))
?