Если вы просто хотите напечатать их, это похоже на хороший способ начать изучать тонкости Python, в частности, использование генераторов:
def twoPower(count):
val = 1
for _ in range(count):
yield val
val = val * 2
Вы можете создайте список с помощью этого генератора, просто используя понимание списка:
>>> [_ for _ in twoPower(5)]
[1, 2, 4, 8, 16]
И, конечно, вы можете сделать его более читаемым, превратив их в строки и присоединив к ним (используйте "\n"
вместо " "
, если вы хотите, чтобы каждый номер был в отдельной строке):
>>> print(" ".join([str(_) for _ in twoPower(5)]))
1 2 4 8 16
Если вместо этого вам нужна функция , которая даст вам мощность (по крайней мере, для неотрицательных целых показателей), вы можете просто использовать рекурсию, зная, что выражение n<sup>p</sup>
имеет вид:
n * n<sup>p-1</sup>
где p
больше нуля; или 1
, где p
равно нулю.
Это означает, что функция может быть такой же простой, как показано ниже:
def pwr(n, p):
if p == 0:
return 1
return n * pwr(n, p - 1)
# Test harness.
for n1 in range(-2, 4):
for n2 in range(0, 4):
print(f"{n1:3} ** {n2:3} = {pwr(n1, n2):3}")
Выполняется этот код дает желаемый результат:
-2 ** 0 = 1
-2 ** 1 = -2
-2 ** 2 = 4
-2 ** 3 = -8
-1 ** 0 = 1
-1 ** 1 = -1
-1 ** 2 = 1
-1 ** 3 = -1
0 ** 0 = 1
0 ** 1 = 0
0 ** 2 = 0
0 ** 3 = 0
1 ** 0 = 1
1 ** 1 = 1
1 ** 2 = 1
1 ** 3 = 1
2 ** 0 = 1
2 ** 1 = 2
2 ** 2 = 4
2 ** 3 = 8
3 ** 0 = 1
3 ** 1 = 3
3 ** 2 = 9
3 ** 3 = 27
Теперь он не обрабатывает отрицательные показатели, но вы можете исправить это с помощью:
def pwr(n, p):
if p < 0:
return 1 / pwr(n, -p)
if p == 0:
return 1
return n * pwr(n, p - 1)
Он также не будет обрабатывать не- интегральные показатели, но это намного сложнее, поэтому я предпочитаю сразу их отклонять:
def pwr(n, p):
if str(type(p)) != "<class 'int'>":
raise Exception("Non-integral power")
if p < 0:
return 1 / pwr(n, -p)
if p == 0:
return 1
return n * pwr(n, p - 1)