В вашем первом примере - поскольку вы устанавливаете периметр равным нулю, прежде чем начнете обходить любой из треугольников, вы вычисляете общий периметр всех перечисленных треугольников.
Перемещая perimeter = 0
внутрь внешний l oop (в вашем 2-м примере), вы отбрасываете сумму для первого треугольника после ее вычисления, а затем вы отбрасываете сумму для 2-го треугольника, прежде чем снова рассчитать ее для третьего.
Я бы переписал ваш код следующим образом:
def perimeters(geom):
for triangle in geom:
yield sum(triangle)
теперь у вас есть генератор, который вы можете использовать oop - или преобразовать в список, или передать такой функции, как map , filter et c.
for perimeter in perimeters([[10,20,30], [40,50,60], [70,80,90]])
print(perimeter)
Преимущество использования генераторов заключается в том, что они вычисляют данные, когда они вам нужны, вместо того, чтобы выполнять все расчеты заранее.