我试图在projecteuler上做一些问题,然后我得到了一个正方形和平方和的总和。我不想暴力破解它,所以我查找了解决方案,即:
sum1 = 0
sum2 = 0
for i in ((x,x ** 2) for x in range(1,100+1)):
sum1 += i[0]
sum2 += i[-1]
print(sum1 ** 2 - sum2)
我没有得到:
(x,x ** 2) for x in range(1,100+1)
我也在javascript的另一个代码高尔夫解决方案中看到了这一点。这是一种特定的语法,还是一种不熟悉的常规方法?有人可以解释一下吗?
答案 0 :(得分:4)
遇到复杂语法时,请添加print语句。
for i in ((x,x ** 2) for x in range(1,100+1)):
print i
没太大帮助。
试试这个。
a = ((x,x ** 2) for x in range(1,100+1))
print a
for i in a:
print i
有用吗?也许
试试这个:
a = ((x,x ** 2) for x in range(1,100+1))
b = list(a)
print b
嗯。 for i in a
循环也停止工作。这个生成器对象似乎只做了一次。在for循环中或在list()
(或tuple()
)函数中,但不是两者都有。
试试这个。
for x in range(1,100+1):
print x, x**2
好。那么,我们学到了什么?
((x,x ** 2) for x in range(1,100+1))
是一个生成器表达式。 http://www.python.org/dev/peps/pep-0289/
它是“可迭代的”,可以在for
语句或list()
函数中使用。
另外,我们已经学会了添加print语句来探索令人困惑的语法。