в Python диапазон (1, 100, * 10) не работает? - PullRequest
0 голосов
/ 24 января 2019

У меня проблема с 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 )?

Ответы [ 6 ]

0 голосов
/ 24 января 2019

Когда вы используете цикл как with x in range(start,stop,step)

То, как это происходит, это первый

Редактировать: первая часть объясняет, почему это не сработает

  1. Вы получаете список, сгенерированный функцией range (но не с python3), теперь он возвращает только диапазон функции и ее текущее состояние, это может быть float или int, поэтому использование /10 as step даст ничего, кроме неверного синтаксиса, потому что диапазон принимает только целые числа.

  2. Только после этого x инициализируется и начинает индексировать значения, присутствующие в словаре.

Однако вы можете использовать

for y in range(2,-1,-1): x = (10**y)

Добро пожаловать в python и удачного кодирования.

Спасибо @GPhilo за указание на ошибки.

0 голосов
/ 24 января 2019

Вы можете просто использовать выражение генератора, например

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
0 голосов
/ 24 января 2019

Аргументами для range являются: start, stop и step, где step - int.Может быть, вы хотите увидеть результат следующим образом:

li = [10**x for x in range(0, 3, 1)]
print(li)

[1, 10, 100]

В целом, взгляните на хороший учебный курс, например, "Автоматизируйте скучный материал с помощью Python":

0 голосов
/ 24 января 2019

Чтобы изменить цикл сложности log(n), вам нужна функция журнала или использовать циклы while для выполнения работы

In [10]: import math
In [9]:  [10**x for x in range( 0,int(math.log10(1000)))]
Out[9]: [1, 10, 100]

Я все еще думаю, что циклы - это путь

0 голосов
/ 24 января 2019

Встроенный диапазон не предназначен для использования таким образом. Он принимает три аргумента: range(start, stop, step) и изменяется от start до stop с постоянным размером шага.

Если вы хотите использовать одну функцию, вы можете использовать logspace numpy

Это выглядит так:

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 кажется мне очень питонным.

Контрольное время: 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 побеждает.

0 голосов
/ 24 января 2019

Вы не можете использовать range для этого. Третий аргумент для диапазона - это фиксированный шаг, используемый для увеличения значения: его нельзя использовать для умножения или деления предыдущего значения.

Вместо этого используйте while цикл:

i = 1
while i < 100:
   ...
   i *= 10  # or i /= 10 depending on what you want.

Если вы действительно хотите использовать понимание списка, вы можете сделать так, как предложил Альбин Пол:

li = [10**x for x in range(3) ]  # [1, 10, 100]
li = [10**x for x in range(2, -1, -1)  # [100, 10, 1]
...