Я имею несколько проблем для решения для присвоения и немного застреваю. Вопрос состоит в том, чтобы записать программу, которая добирается, пользователь для ввода нечетного числа (проверьте, что это нечетно), затем распечатайте перевернутую пирамиду звезд на основе размера входа.
Например, если Вы входите 5, это придумывает
*****
***
*
Моя проблема является поэтому двукратной.
1) Как я проверяю, даже ли это или нечетно? Я попробовал if number/2 == int
в надежде, что это могло бы сделать что-то, и Интернет говорит мне делать if number%2==0
, но это не работает.
2) Как я изменяю звездочки посреди каждой строки?
Любая справка с любой проблемой значительно ценится.
Мое решение в основном, которое мы имеем два, представляет в виде строки и с & мы получаем правильный индекс:
res = ["Even", "Odd"]
print(res[x & 1])
Обратите внимание на то, что это кажется медленнее, чем другие альтернативы:
#!/usr/bin/env python3
import math
import random
from timeit import timeit
res = ["Even", "Odd"]
def foo(x):
return res[x & 1]
def bar(x):
if x & 1:
return "Odd"
return "Even"
la = lambda x : "Even" if not x % 2 else "Odd"
iter = 10000000
time = timeit('bar(random.randint(1, 1000))', "from __main__ import bar, random", number=iter)
print(time)
time = timeit('la(random.randint(1, 1000))', "from __main__ import la, random", number=iter)
print(time)
time = timeit('foo(random.randint(1, 1000))', "from __main__ import foo, random", number=iter)
print(time)
вывод:
8.05739480999182
8.170479692984372
8.892275177990086
Несколько решений здесь ссылаются на время, потраченное для различного, "даже" операции, конкретно n % 2
по сравнению с n & 1
, систематически не проверяя, как это меняется в зависимости от размера n
, который оказывается прогнозирующим из скорости.
короткий ответ - это при использовании обоснованно измеренных чисел, обычно < 1e9 , это не имеет большого значения. При использовании большего числа затем, Вы, вероятно, хотите использовать побитовый оператор.
Вот график продемонстрировать то, что продолжается (Python 3.7.3, в соответствии с Linux 5.1.2):
В основном, поскольку Вы поражаете "произвольную точность" longs, вещи прогрессивно становятся медленнее для модуля, оставаясь постоянными для поразрядного op. Кроме того, отметьте 10**-7
множитель на этом, т.е. Я могу сделать ~30 миллионов (маленькое целое число) проверки в секунду.
Вот тот же график для Python 2.7.16:
, который показывает оптимизацию, это вошло в более новые версии Python.
я только получил эти версии Python на моей машине, но мог повторно выполниться для других версий существует интерес. Существуют 51 n
с между 1 и 1e100 (равномерно расположен с интервалами на логарифмической шкале), для каждой точки, из которой я делаю эквивалент:
timeit('n % 2', f'n={n}', number=niter)
, где niter
вычисляется для создания timeit
, занимают ~0.1 секунды, и это повторяется 5 раз. Немного неловкая обработка n
должна удостовериться, что мы также не сравниваем поиска глобальной переменной, который медленнее, чем локальные переменные. Средние из этих значений используются для разграничивания, и отдельные значения оттянуты как точки.