Вложенные циклы For в Python (вычисление периметров треугольников) - PullRequest
1 голос
/ 21 июня 2020

Я хочу рассчитать периметры треугольников. Я хочу получить доступ к конкретным элементам списка, поэтому я использую вложенный для l oop. 1) Я хотел бы знать, почему позиция perimeter отличает мой код в обоих вариантах. (во втором я не понимаю, почему результат равен 240) 2) Я хотел бы знать, как объединить все элементы во вложенных списках, поэтому результат должен быть таким: (Я пробовал использовать индексирование, но это не так. не работает)

60
150
240

Первый:

def function(triangle):
    perimeter = 0
    for i in triangle:
        for j in i:
            perimeter = perimeter + j
    return perimeter

function([[10,20,30], [40,50,60], [70,80,90]])
450

Второй:

def function(triangle):
    for i in triangle:
        perimeter = 0
        for j in i:
            perimeter = perimeter + j
    return perimeter

function([[10,20,30], [40,50,60], [70,80,90]])
240

Ответы [ 4 ]

4 голосов
/ 21 июня 2020

1 - Разница между двумя кодами заключается в том, что в первом perimeter устанавливается значение 0 перед запуском l oop, а затем обновляется на протяжении l oop. Во втором вы устанавливаете значение perimeter равным 0 каждый раз, когда выполняется внешний l oop, поэтому значение из предыдущего l oop не накапливается в нем.

2- Для l oop можно использовать следующий метод:

triangles = [[10,20,30], [40,50,60], [70,80,90]]
perimeters = list(map(sum,triangles))
print(perimeters)
[60, 150, 240]

Здесь map выполняет итерацию по элементам triangles и вызывает функцию sum для каждого элемента. Затем, используя list, вы можете преобразовать его в список значений периметра.

1 голос
/ 21 июня 2020

Незначительное исправление для возврата всего периметра в виде списка

def function(triangle):
    perimeter_list = []
    for i in triangle:
        perimeter = 0
        for j in i:
            perimeter = perimeter + j
        perimeter_list.append(perimeter)
    return perimeter_list

function([[10,20,30], [40,50,60], [70,80,90]])

Вывод

[60, 150, 240]
1 голос
/ 21 июня 2020

В вашем первом примере - поскольку вы устанавливаете периметр равным нулю, прежде чем начнете обходить любой из треугольников, вы вычисляете общий периметр всех перечисленных треугольников.

Перемещая 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)

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

1 голос
/ 21 июня 2020

Похоже, вы хотите вернуть периметры каждого треугольника, предоставленного вашей функции.

Это может быть выражено почти прямо в python:

def get_perimeters(triangles):
    return [sum(perimeters) for perimeters in triangles]

print(get_perimeters([[10,20,30], [40,50,60], [70,80,90]]))

Вывод:

[60, 150, 240]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...