我想计算三角形的周长。 我想访问列表的具体元素,所以我使用了嵌套的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
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)
使用生成器的好处是它在您需要的时候计算数据,而不是预先进行所有的计算。