'''

The idea is to loop the matrix in layers, and in a spiral way. Similar to the common approach for solving the rotate-matrix problem. Used xrange to print in reverse order the bottom row and left column (remember, xrange(z,a,-1) prints from z to *a+1* )

'''

```
num_rows = len(matrix)
if num_rows == 0:
return []
num_cols = len(matrix[0])
num_layers = min((num_rows+1) / 2, (num_cols+1) / 2)
vals = []
for j in range(num_layers):
for i in range(j, num_cols-j): #print top row
vals.append(matrix[j][i])
if j+1 >= num_rows - j: #no column to go through: break
break
for i in range(j+1, num_rows-j): #print right column
vals.append(matrix[i][num_cols-j-1])
if num_cols - j - 1 == j: #no row to go through : break
break
for i in xrange(num_cols-j-2, j-1, -1): #print bottom row
vals.append(matrix[num_rows - j - 1][i])
for i in xrange(num_rows - j - 2, j, -1): #print left column
vals.append(matrix[i][j])
return vals
```