提问者:小点点

Python中的嵌套For循环(计算三角形的周长)


我想计算三角形的周长。 我想访问列表的具体元素,所以我使用了嵌套的for循环。 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

共3个答案

匿名用户

1-两个代码之间的区别在于,在第一个代码中,perimeter在循环开始之前被设置为0,并且在整个循环中被更新。 在第二个循环中,您在每次执行外部循环时将perimeter值设置为0,因此来自上一个循环的值不在其中累加。

2-对于循环,可以使用以下方法:

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

这里,map迭代triangles的元素,并为每个元素调用sum函数。 然后,可以使用list将其转换为周长值列表。

匿名用户

看起来您想返回提供给函数的每个三角形的周长。

这在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]

匿名用户

在第一个示例中,因为在开始循环通过任何三角形之前,您将周长设置为零,所以您计算所有列出的三角形的总周长。

通过在外循环中移动周长=0(在您的第二个示例中),您将在计算第一个三角形之后丢弃它的总数,然后在再次计算第三个三角形之前丢弃第二个三角形的总数。

我会像这样重写您的代码:

def perimeters(geom):
    for triangle in geom:
         yield sum(triangle)

你现在有了一个生成器,你可以循环它,或者转换成列表,或者传递到一个函数,比如映射,过滤等等。

for perimeter in perimeters([[10,20,30], [40,50,60], [70,80,90]])
    print(perimeter)

使用生成器的好处是它在您需要的时候计算数据,而不是预先进行所有的计算。