How to Square a Number in Python (Square Function)

Here’s how to square a number in Python: use the exponent operator, n ** 2, or multiply, n * n. There’s no built-in square() function, so wrap either one in def square(n) when you want a name for it:

side = 12
area = side ** 2     # 144

Squaring looks too simple to test, yet Python 3.12.5 and NumPy 2.5.3 turned up two results worth knowing, and they’re both in the screenshots below.

You’ll see the built-in ways to square a number, a reusable square() function, the negative-number trap, why math.pow loses digits, lists and NumPy arrays, perfect squares and a speed test.

Square a number with **, multiplication and pow()

All four give 144 for a side of 12. The only visible difference is the type of the result:

import math

side = 12
print(side ** 2)            # exponent operator
print(side * side)          # multiply by itself
print(pow(side, 2))         # built-in pow
print(math.pow(side, 2))    # always returns a float

price = 19.99
print(price ** 2, round(price ** 2, 2))

Output:

144
144
144
144.0
399.60009999999994 399.6
Command Prompt output of Python squaring 12 with the ** operator, multiplication, pow and math.pow, plus a squared price
The first three print 144, math.pow prints 144.0, and squaring 19.99 shows a long float that round() tidies up.

Floats carry tiny binary errors, so round for display. Geometry is the classic use, as in finding the area of a square in Python.

Write a square() function in Python

If you call squaring in many places, a small named function documents the intent. Type hints make it clear it takes ints and floats:

def square(n: int | float) -> int | float:
    """Return n squared."""
    return n * n

print(square(12), square(-4), square(2.5))

square_lambda = lambda n: n ** 2           # fine for one-off use, e.g. as a key
sides = [3, 12, 7]
print(list(map(square, sides)), max(sides, key=square_lambda))

try:
    square("12")
except TypeError as err:
    print("TypeError:", err)

Output:

144 16 6.25
[9, 144, 49] 12
TypeError: can't multiply sequence by non-int of type 'str'
Command Prompt output of a Python square() function squaring 12, -4 and 2.5, used with map and max, and a TypeError for a string
square() returns 144, 16 and 6.25, works with map and as a max key, and a string input raises TypeError.

A string like "12" fails, so convert input first with int(); see converting a string to an integer in Python.

Why does -3 ** 2 give -9 in Python?

** binds more tightly than a leading minus sign, so Python reads -3 ** 2 as -(3 ** 2). Parentheses fix it:

x = -3
print(-3 ** 2)        # ** binds tighter than the minus sign -> -(3 ** 2)
print((-3) ** 2)
print(x ** 2)         # a variable holding -3 is fine

print(2 ** 3 ** 2)    # ** groups right to left: 2 ** 9

Output:

-9
9
9
512
Command Prompt output of Python -3 ** 2 returning -9 while (-3) ** 2 and a variable holding -3 return 9
-3 ** 2 prints -9, while (-3) ** 2 and x ** 2 with x = -3 both print 9.

A variable is safe because its value is already negative. Note that ** also groups right to left. For cubes and other powers, see exponents in Python.

Why is math.pow wrong for large numbers?

Python integers have unlimited precision, but math.pow() converts to a 64-bit float, which keeps only about 15 to 17 significant digits:

import math

n = 123_456_789_123
exact = n ** 2
approx = math.pow(n, 2)

print("n ** 2:     ", exact)
print("math.pow:   ", approx)
print("as int:     ", int(approx))
print("off by:     ", int(approx) - exact)

Output:

n ** 2:      15241578780560891109129
math.pow:    1.5241578780560892e+22
as int:      15241578780560891838464
off by:      729335

n ** 2 is exact; the float version is off in the last digits. For money and measurements, use integers or Decimal, and round numbers to 2 decimal places only for display.

Square every number in a list or NumPy array

For a list, use a comprehension. For NumPy arrays, np.square() and ** work element by element, but watch the dtype:

import numpy as np

sales = [3, 7, 12, 25]
print([x ** 2 for x in sales])
print(list(map(lambda x: x * x, sales)))

arr = np.array(sales)
print(np.square(arr), arr ** 2)

small = np.array([100, 120], dtype=np.int8)
print("int8 squared:", np.square(small), "<- overflow, wrapped around")
print("int64 squared:", np.square(small.astype(np.int64)))

Output:

[9, 49, 144, 625]
[9, 49, 144, 625]
[  9  49 144 625] [  9  49 144 625]
int8 squared: [16 64] <- overflow, wrapped around
int64 squared: [10000 14400]
Command Prompt output of Python squaring a list with a comprehension and map, a NumPy array with np.square, and int8 overflow
The list and array squares match; the int8 array overflows to wrong values, while converting to int64 gives 10000 and 14400.

NumPy fixed-size integers wrap around without an error. Making lists of numbers to square is covered in creating an array from 1 to N in Python.

Check whether a number is a perfect square

The reverse question comes up often. math.isqrt() returns the exact integer square root, so squaring it back tells you the answer:

import math

def is_perfect_square(n: int) -> bool:
    if n < 0:
        return False
    root = math.isqrt(n)        # exact integer square root
    return root * root == n

for n in (144, 150, 0, 10**30, 10**30 + 1):
    print(f"{n:>32,}  {is_perfect_square(n)}")

print(math.sqrt(10**30 + 1).is_integer(), "<- float sqrt gets this one wrong")

Output:

                             144  True
                             150  False
                               0  True
1,000,000,000,000,000,000,000,000,000,000  True
1,000,000,000,000,000,000,000,000,000,001  False
True <- float sqrt gets this one wrong
Command Prompt output of a Python perfect square check using math.isqrt, compared with a float sqrt that gets a huge number wrong
144 and 10 to the 30th are perfect squares, 150 and 10 to the 30th plus 1 aren’t, and the float sqrt check wrongly says the last one is.

math.sqrt() rounds very large values, so is_integer() can lie. For roots in general, see square roots in Python.

Which way to square a number is fastest?

Here are two million squarings of 1234 with each method, best of three runs:

import math
import timeit

n = 1234
for label, stmt in [("n * n", "n * n"), ("n ** 2", "n ** 2"), ("pow(n, 2)", "pow(n, 2)"), ("math.pow(n, 2)", "math.pow(n, 2)")]:
    t = min(timeit.repeat(stmt, globals={"n": n, "math": math}, number=2_000_000, repeat=3))
    print(f"{label:<16}{t * 1000:8.1f} ms per 2,000,000")

Output:

n * n               38.1 ms per 2,000,000
n ** 2              54.3 ms per 2,000,000
pow(n, 2)           67.7 ms per 2,000,000
math.pow(n, 2)     123.9 ms per 2,000,000

On my machine n * n is the quickest and math.pow isn’t faster despite being in the math module. The gaps are tiny, so I use n ** 2 because it reads clearly. Digit-level math is in summing the squares of digits.

Squaring methods compared

CodeResult for 12Notes
n ** 2144Exact for ints; mind -3 ** 2
n * n144Exact, quickest
pow(n, 2)144Same as **
math.pow(n, 2)144.0Float; loses precision on big ints
np.square(arr)ArrayWatch small integer dtypes

If you’re practicing Python math, these come next:

Frequently asked questions

How do you square a number in Python?

Use n ** 2. n * n and pow(n, 2) give the same result.

Why does -3 ** 2 return -9?

The exponent is applied before the minus sign. Write (-3) ** 2 to get 9.

Should I use math.pow to square numbers?

Not for integers. It returns a float and can lose precision for large values.

How do I square every item in a list?

Use a list comprehension: [x ** 2 for x in nums], or np.square() for NumPy arrays.

Is there a square function in Python?

No built-in one. Use n ** 2, or write def square(n): return n * n.

Where is the ** operator documented?

See the power operator in the Python reference.