关于python中for循环的一个问题

关于python中for循环的一个问题,python,for-loop,Python,For Loop,我想计算毕达哥拉斯的三元组(下面的代码),我想无限地计算,在不使用三个for循环的情况下,我该怎么做?我能以某种方式使用for循环吗?谢谢 import math def main(): for x in range (10000, 1000): for y in range (10000, 1000): for z in range(10000, 1000): if x*x == y*y + z*z:

我想计算毕达哥拉斯的三元组(下面的代码),我想无限地计算,在不使用三个for循环的情况下,我该怎么做?我能以某种方式使用for循环吗?谢谢

import math

def main():
    for x in range (10000, 1000):
        for y in range (10000, 1000):
            for z in range(10000, 1000):
                if x*x == y*y + z*z:
                    print y, z, x
                    print '-'*50

if __name__ == '__main__':
    main()  

一般来说,你不能。三个变量,三个循环

但正如所指出的,这是一个特例。你可以用两个循环来解决这个问题

而且,检查y,z和z,y也没有意义

哦,而且
范围(10000,1000)=[]

import math

for x in range(1, 1000):
  for y in range(x, 1000):
      z = math.sqrt(x**2 + y**2)
      if int(z) == z:
        print x, y, int(z)
        print '-'*50

除了已经发布的内容外,人们还希望三个集合有三个循环。其他任何东西都可能会变得非常混乱,并且没有额外的好处。

您只需要两个循环-只需检查
math.sqrt(x*x+y*y)
是否为整数。如果是的话,你已经发现了毕达哥拉斯的三元组

我是Python新手,所以我不知道
range(10000,1000)
的作用是什么-它从哪里开始和停止?我这样问是因为,由于加法是可交换的,所以可以将运行时间减半,方法是将
y
的范围从
x
开始,而不是将其固定


edit:是我的初衷,如果我懂更多Python,我会写这些东西

您可以将代码安排在一个主循环中,如下所示:

MIN = 10000
MAX = 10010
a = [MIN, MIN, MIN]
while True:
    print a
    for i in range(len(a)):
        a[i] = a[i] + 1
        if a[i] < MAX:
            break
        a[i] = MIN
        i += 1
    else:
        break
MIN=10000
最大值=10010
a=[分钟,分钟,分钟]
尽管如此:
打印
对于范围内的i(len(a)):
a[i]=a[i]+1
如果a[i]
您可以在这里进行毕达哥拉斯三重态测试,而不是打印一个。这将适用于任意数量的维度

如果您真的想无限地执行此操作,则必须使用不同的迭代技术,例如。

不是最有效的(Python将构建一个包含十亿个元组的数组),但这是一个单循环:

for x, y, z in [(x, y, z) for x in range(10000, 11000) for y in range(10000, 11000) for z in range(10000, 11000)]:
    if x*x == y*y + z*z:
        print y, z, x
        print '-'*50
或者,正如

(假设Python>=2.4)使用而不是构建十亿元组数组


不管怎样,你都不应该这样编码。。。使用嵌套循环的初始代码更清晰。

使用而不是
范围
应该使用更少的内存,特别是如果您想尝试更大范围的代码。

这与Can Berk Guder的答案相同,但只是作为生成器,只是为了好玩。对于这里的嵌套循环,它并不是很有用,但它通常是一个更干净的解决方案。你的函数产生结果;您稍后会担心要检索多少

import math

def triplets(limit):
    for x in range(1, limit):
        for y in range(x, limit):
            z = math.sqrt(x**2 + y**2)
            if int(z) == z:
                yield x, y, int(z)

for x, y, z in triplets(10):
    print x, y, z
    print "-" * 50

如果你想数到无穷大

创建一个从零开始计数且从不停止的生成器函数,并在其上使用for循环

def inf():
   i = 0
   while True:
     yield i
     i = i + 1

for i in inf():
    print i  # or do whatever you want!
我不知道是否已经有这样一个内置函数使用相同的算法(请参阅其他答案了解更好的方法),您可以使用itertools.count获得一个永远运行的循环

import itertools

for x in itertools.count(1):
    for y in xrange(1, x):
         for z in xrange(1, y):
              if x*x == y*y + z*z:
                  print x, y, z

这是一个高效的版本,使用迭代器生成所有这样的三元组, 整齐这里的技巧是通过(x,y)对的集合进行迭代 这个总数等于N,等于所有的N

import math import itertools def all_int_pairs(): "generate all pairs of positive integers" for n in itertools.count(1): for x in xrange(1,n/2+1): yield x,n-x for x,y in all_int_pairs(): z = math.sqrt(x**2 + y**2) if int(z) == z: print x, y, int(z) print '-'*50 输入数学 进口itertools 定义所有内部对(): “生成所有正整数对” 对于itertools中的n。计数(1): 对于x范围内的x(1,n/2+1): 产量x,n-x 对于x,y,在所有_int_对()中: z=数学sqrt(x**2+y**2) 如果int(z)==z: 打印x,y,int(z) 打印'-'*50
无穷大至少需要三个循环。要使某种东西灵活,需要大量的循环。这个例子是一个解决方案和更多

#!/usr/bin/env python

def fcount(start=1):
    n = float(start)
    while True:
        yield n
        n += 1

def find_triples():
    for c in fcount():
        for b in fcount():
            if b > c:
                break
            for a in fcount():
                if a > b:
                    break
                if a ** 2 + b ** 2 == c ** 2:
                    yield (a, b, c)

def triples_by_sum(targetsum):
    for a, b, c in find_triples():
        if a + b + c == targetsum:
            yield a, b, c
        if c > targetsum:
            break

if __name__ == '__main__':
    # Finds multiple triples
    for a, b, c in triples_by_sum(252):
        print a, b, c
    # Finds single triples
    a, b, c = triples_by_sum(1000).next()
    print a, b, c
    # Goes forever
    for a, b, c in find_triples():
        print a, b, c

不如改用itertools.product

# range is [10000, 1000)
for x, y, z in itertools.product(range(10000, 1000, -1), repeat=3): 
    if x * x == y * y + z * z:
        print(y, z, x)
稍微优化一下:

for x, y, z in itertools.product(range(10000, 1000, -1), repeat=3):
    if y >= x or z >= x or x >= (y + z) or z < y:
        continue
    if x * x == y * y + z * z:
        print(y, z, x)
对于itertools.product中的x、y、z(范围(10000、1000,-1),重复=3):
如果y>=x或z>=x或x>=(y+z)或z

编辑:这里我只给出了一种使用
产品
而不是多for循环的方法。你可以在上面的帖子中找到更有效的方法。

+1:因为你必须使用某种iterable;序列或生成器。是的,这就是我要说的,如果我知道更多Python,我会写的。while语句有什么问题?你能提供关于为什么你认为必须用for语句来做这件事的额外信息吗?如果你是为project euler问题做这件事,那么有一个简单的纸笔数学解决方案。+1对角化——我想成为回答这个问题的人:(在Python的最新版本中,它们是相同的,尽管在Python 3.0中,我认为大多数人还没有使用。但是如果没有必要的话,就不应该进行优化。好吧,最初的海报似乎他想做更大的范围,如果可以的话,因此我的建议。考虑到它的价值:-)将其更改为“对于x,y,z”((x,y,z)对于xrange中的x(10000,11000)对于xrange中的y(10000,11000)对于xrange中的z(10000,11000)):“对于生成器表达式,请改为将范围更改为xrange,除非您已经在使用Py3.0
for x, y, z in itertools.product(range(10000, 1000, -1), repeat=3):
    if y >= x or z >= x or x >= (y + z) or z < y:
        continue
    if x * x == y * y + z * z:
        print(y, z, x)