问题描述:找出50之内的所有勾股数。
所谓勾股数,就是三个正整数,满足x*x + y*y = z*z。例如:3,4,5或5,12,13。
电脑解题只会用笨办法,一个一个地试,x、y、z都从1递增到49,三重循环搞定。
for x in range(1, 50) : for y in range(1, 50) : for z in range(1, 50) : if x*x + y*y == z*z : print(x, y, z)
输出的结果中有许多重复答案,比如:3 4 5 和 4 3 5 实际上算一种答案。可以加个要求:x<y<z,代码稍微修改即可。
for x in range(1, 50) : for y in range(x, 50) : for z in range(y, 50) : if x*x + y*y == z*z : print(x, y, z)
可能大家感觉这个题目太初级,但这里想提的是Python中强大的列表推导(list comprehension)。
比如:输出1到9的平方数,在Python中用一行语句:
[x*x for x in range(1, 9)]
输出:[1, 4, 9, 16, 25, 36, 49, 64]
有了这个武器,前面的问题可以用一行语句搞定:
[(x,y,z) for x in range(1,50) for y in range(x,50) for z in range(y,50) if x*x + y*y == z*z]
输出结果:[(3, 4, 5), (5, 12, 13), (6, 8, 10), (7, 24, 25), (8, 15, 17), (9, 12, 15), (9, 40, 41), (10, 24, 26), (12, 16, 20), (12, 35, 37), (15, 20, 25), (15, 36, 39), (16, 30, 34), (18, 24, 30), (20, 21, 29), (21, 28, 35), (24, 32, 40), (27, 36, 45)]
小结:
Python语言中的列表List借鉴了许多现代语言的优点,可以用比较简短的语句写出一些强大的表达式。为了得到一个数组array或列表list,直接用列表推导就可以方便地搞定。
知乎上有个贴子:一行Python能实现什么丧心病狂的功能?点击文章左下角的“阅读原文",直达该链接。
--- END ---