def pyg(n):
n=int(n)
for i in range(1,n):
a=(2*i)+1
b=(2*i)*(i+1)
c=(2*i)*(i+1)+1
return(a,b,c)
当我尝试使用pyg(100)
在Shell上运行这个时,我只得到输出(3,4,5)。问题可能是所有的三元组都没有生成
正如许多人指出的那样,当执行return语句时,函数将结束,并且不会继续循环。但是,您可以选择从单个函数返回多个值。例如,聚合列表中的值并返回该值,或者使用yield
关键字而不是return
。yield
关键字将使您的函数成为生成器函数,它返回一个可迭代生成器对象,其中包含所有您期望的元素。
我建议您将代码拆分为单独的函数,因此您将原始公式作为I 的函数,以及将返回1 <= i < n
元素的生成器函数。注意,您可以通过将生成器的元素提供给list
构造函数来收集列表。
def pyg(i):
a = (2*i) + 1
b = (2*i) * (i+1)
c = (2*i) * (i+1) + 1
return (a,b,c)
def pygs(n):
for i in range(1, n):
yield pyg(i)
print(list(pygs(10))) # prints the first 9 Pythagorean triplet as a list of tuples
return
句。更改为yield
。如果你想测试它,你可以:
>>> pygs = pyg(100)
>>> next(pygs)
(3, 4, 5)
>>> next(pygs)
.
.
.
你的函数只产生一对,因为return
会中断函数的执行。您可以使用yield
关键字,如@jgomo3所建议的,或map
函数:
def generate_triplet(n):
a=(2*n)+1
b=(2*n)*(n+1)
c=(2*n)*(n+1)+1
return(a,b,c)
def pyg(n):
return map(generate_triplet, range(1, int(n))