Написать функцию, вычисляющую сумму элементов главной или побочно диагонали (Python)

Тема: 
Функции

В решении данной задачи можно выделить три части:

  1. Заполнение квадратной матрицы
  2. Вызов функции
  3. Функция

Заполнение квадратной матрицы

В терминах языка программирования Python матрица - это список с вложенными списками одинаковой длины. Если говорить о квадратной матрице (а только в этом случае имеет смысл говорить о ее диагоналях), то количество вложенных списков и количество элементов в них должно совпадать. Например, список [[12,45,18][0,3,10][21,18,6]] можно назвать квадратной матрицей.

Пусть квадратная матрица заполняется случайными числами и ее размерность будет равна 10 (т. е. 10 строк и 10 столбцов). Перед заполнением матрицы, создается пустой список. Во внешнем цикле осуществляется проход по строкам, которые представляют собой вложенные списки. Сначала создается пустой вложенный список, потом во внутреннем цикле он заполняется случайными числами, после чего уже заполненный добавляется в основной список. При заполнении матрицы может также осуществляться вывод ее на экран.

Вызов функции

Поскольку функция должна уметь по выбору вычислять как сумму главной, так и побочной диагонали, то в нее необходимо передавать не только список, но и "сигнал" о том, по какому пути ей идти. Если функция будет возвращать полученную сумму в основную ветку программы, то вызов функции надо связать с переменной или поместить как аргумент в функцию print().

Перед вызовом функции надо получить значение переменной-"сигнала". Сумму какой диагонали вычислять, может выбрать пользователь. Например, если он вводит символ '1', то вычислять главную диагональ, если '2', то побочную. Так как пользователь может ввести не только эти символы, а какие угодно, то разумно заключить вызов функции и вывод результата на экран в конструкцию if, условием выполнения которой будет правильно введенный символ.

Функция

При написании функции надо сделать выбор, будет ли она выводить результат на экран в своем теле или возвращать в основную ветку программы. Пусть функция возвращает результат, в таком случае она должна содержать оператор return (обычно, но не обязательно, в конце тела функции), после которого указывается возвращаемое значение.

Главная диагональ квадратной матрицы идет от левого верхнего угла до нижнего правого, и, следовательно, каждый элемент такой диагонали имеет совпадающие первый и второй индексы. При этом индексы следующего элемента диагонали отличаются от предыдущего на 1. Т.е. первый элемент главной диагонали имеет индексы [0][0], второй - [1][1] и т.д. Поэтому для нахождения суммы элементов главной диагонали, надо построчно перебрать матрицу и в каждой строке взять элемент, номер которого совпадает с номером строки, и добавить его значение в общую сумму.

Побочная диагональ идет из верхнего правого угла в нижний левый. Индексы ее элементов обратны. В первой строке это будет последний элемент, во второй - предпоследний и т.д. Если i - это номер строки, равный в начале 0, то второй индекс будет вычисляться как (N-1)-i. Выражение (N-1) - это индекс последнего элемента при индексации с нуля.

def diagonal(l,c):
    s = 0
    i = 0
    while i < N:
        if c == '1':
            s += l[i][i]
        else:
            s += l[i][N-i-1]
        i += 1
    return s
 
 
from random import random
N = 10
a = []
for i in range(N):
    b = []
    for j in range(N):
        n = int(random()*10)
        b.append(n)
        print("%3d" % n, end='')
    a.append(b)
    print()
 
ch = input("Главная (1) или побочная (2): ")
if ch == '1' or ch == '2':
    summa = diagonal(a,ch)
    print(summa)

Пример выполнения кода:

  1  0  3  6  9  1  6  6  4  1
  2  2  5  2  5  7  0  9  9  0
  4  6  2  1  2  4  0  7  2  8
  6  8  6  3  8  8  5  8  6  9
  0  1  2  1  0  3  8  5  0  1
  5  2  2  7  4  6  4  8  4  1
  1  2  3  9  8  1  1  6  0  6
  9  8  5  3  5  3  6  2  8  7
  8  9  1  4  3  0  0  4  4  1
  3  3  2  2  4  6  1  2  2  4
Главная (1) или побочная (2): 1
25

[N-i-1] проще заменить на

[N-i-1] проще заменить на [-i-1]:

>>> a = [1,2,3,4,5]
>>> len(a)
5
>>> for x in xrange(len(a)):
...     print a[x], a[-x-1]
...
1 5
2 4
3 3
4 2
5 1
>>>

[-1] - последний элемент списка, [-2] - предпоследний, и т.д.