在条件变为False之前中断Python中的迭代函数



这是为学校作业准备的。

我的任务是定义一个函数,确定给定整数(自变量(的最大平方棱锥数。对于某些背景,这些是方形金字塔数字:

1=1^2

5=1^2+2^2

14=1^2+2^2+3^2

因此,对于函数和参数largest_square_pyramidal_num(15),函数应该返回14,因为这是参数域中的最大数字。

我明白了。这是我的代码:

def largest_square_pyramidal_num(n):
sum = 0
i = 0
while sum < n:
sum += i**2
i += 1
return sum

从逻辑上讲,它看起来很好,很乐观,直到我意识到它并没有在应该停止的时候停止。当n=15,sum=14,sum<n、 因此,代码又添加了一轮i**2,并且超过了n。我一直在思考如何在条件sum<n变为false,包括尝试中断并继续:

def largest_square_pyramidal_num(n):
sum = 0
for i in range(n+1):
sum += i**2
if sum >= n:
break
else:
continue
return sum

只是意识到这没什么区别。

有人能给我什么建议吗?我的逻辑失误在哪里?非常感谢!

您可以执行以下操作:

def largest_pyr(x):
pyr=[sum([i**2 for i in range(1,k+1)]) for k in range(int(x**0.5)+1)]
pyr=[i for i in pyr if i<=x]
return pyr[-1]
>>>largest_pyr(15)
14
>>> largest_pyr(150)
140
>>> largest_pyr(1500)
1496
>>> largest_pyr(15000)
14910
>>> largest_pyr(150000)
149226

让我首先说第二段代码中的continue是多余的。当您不希望for循环中的代码继续,而是希望开始新的迭代(在您的情况下,循环体中没有更多的指令(时,此指令用于场景。

例如,让我们打印从1到100的每个数字,但跳过那些以0:结尾的数字

for i in range(1, 100 + 1):
if i % 10 != 0:
print(i)
for i in range(1, 100 + 1):
if i % 10 == 0:
# i don't want to continue executing the body of for loop,
# get me to the next iteration
continue
print(i)

第一个例子是接受所有";"好";而第二个是排除"数字";坏的";数字。IMHO、CCD_;不必要的";元素,而不是编写if(if中的代码变得格外缩进,这会降低较大函数的可读性(。

至于你的第一首作品,让我们思考一下。当piramid数大于或等于n时,while循环终止。这并不是你真正想要的(是的,你最终可能会得到一个等于n的piramid数,但事实并非总是如此(。

我想建议的是生成一个金字塔数,直到超过n,然后通过删除一个额外的项来后退一步:

def largest_square_pyramidal_num(n):
result = 0
i = 0
while result <= n:
i += 1
result += i**2
result -= i ** 2
return result

需要注意的2件事:

  1. 不要使用sum作为变量的名称(这可能会让内置sum()函数的人感到困惑(
  2. 我交换了循环主体中的增量和结果更新(这样,当while循环终止时,I是最新的(

因此函数如下所示:继续添加项,直到我们花费太多并后退一步

希望这是有道理的。干杯:(

最新更新