Эффективный, элегантный способ создания математических рядов в Python

1

В Javascript это простой математический ряд.

var myList = []

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

Я не могу создать подобную серию в Python без:

  • Использование цикла while

  • Зацикливание по всему диапазону чисел до 10000 в понимании

Является ли это одним из редких случаев, когда Python является менее элегантным языком?
Я не знаю о некоторых функциях в Python здесь?

  • 2
    Я бы снял вопрос об элегантности. Это основано на мнении и, следовательно, не по теме здесь.
  • 3
    Разве это не делается просто с map(lambda x: x*2, range(2,10000)) ?
Показать ещё 12 комментариев
Теги:

3 ответа

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 в целом, что является контрпродуктивным. Я уверен, что некоторые люди ищут однострочники, но они будут запутаны и неэффективны.

  • 0
    Я склонен согласиться с вами здесь. Я не вижу , как в while цикл в Python является то , что гораздо менее элегантно , чем for цикла в JS.
  • 0
    @ChristianDean Меня заинтересовал тот факт, что это было не так легко сделать в Python (из-за малейшей наценки), но я бы, вероятно, поспорил, что подход JS в любом случае медленнее, и вопрос только действительно вызывает бессмысленные языковые дебаты ,
0

"Эффективный" и "элегантный" может быть немного неоднозначным. Я предполагаю, что "эффективный" означает как краткий, так и быстрый для оценки. И элегантный, я полагаю, результат его оценки можно быстро и легко понять из источника.

Трудно ответить на ваш вопрос, потому что математическая серия, написанная математиками, в большинстве случаев может включать произвольно сложные операции, которые могут или не могут разрешить что-то "изящное" на одном или другом языке (например, линейная алгебра много более элегантный в MATLAB/Octave, чем в Python).

Ваш вопрос, в частности, очень легко выразить элегантно (на любом языке), отметив фактическое математическое выражение, которое вы действительно пытаетесь оценить:

Изображение 174551

Что, в python, это:

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

На самом деле, я не уверен, что вы можете представить конструкцию этого набора элегантно с помощью JavaScript, но не цитируйте меня на этом, потому что я никоим образом не специалист в этом языке.

Так что ответ... Это действительно зависит от того, что вы пытаетесь выразить. В этом случае я предпочитаю понимание списка 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.

  • 0
    Обратите внимание, что вам придется myList если вы хотите получить список значений с помощью list() .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню