问题描述
将下面这个代码用一行代码实现:
l = []
for i in range(10):
l.append(i**2)
print(l)
这个代码的打印结果为:
[0]
[0, 1]
[0, 1, 4]
[0, 1, 4, 9]
[0, 1, 4, 9, 16]
[0, 1, 4, 9, 16, 25]
[0, 1, 4, 9, 16, 25, 36]
[0, 1, 4, 9, 16, 25, 36, 49]
[0, 1, 4, 9, 16, 25, 36, 49, 64]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
用一行代码替换为:
print('\n'.join(str(t) for t in [(lambda b : [a**2 for a in range(b+1)])(x) for x in range(10)]))
输出结果为:
[0]
[0, 1]
[0, 1, 4]
[0, 1, 4, 9]
[0, 1, 4, 9, 16]
[0, 1, 4, 9, 16, 25]
[0, 1, 4, 9, 16, 25, 36]
[0, 1, 4, 9, 16, 25, 36, 49]
[0, 1, 4, 9, 16, 25, 36, 49, 64]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
分析思路
- 想办法得到一个大列表,这个大列表中包含若干个小列表,每个小列表是列表推导式的每一步结果。当得到这个大列表的时候就可以遍历它,将每一个子元素转换成字符串输出,而这一点是可以用列表推导式做到的。
- 列表推导式是直接得到结果的,不能打印每一步结果,所以考虑用lambda函数。lambda函数中,冒号左边是参数,冒号右边是返回值。lambda函数可以直接括起来,后边跟着写小括号,里面写实参。
- 此时这个lambda函数的功能和
[i**2 for i in range(10)]
是一样的。 - 这时可以考虑for循环给他动态赋值
- 而动态赋值的动作是可以写成列表推导式的
- 这次生成的列表就是开始需要的那个大列表
实现思路
-
lambda a:b
,lambda函数冒号左边的a是形参,冒号右边的b是返回结果。所以用lambda函数是可以实现[i**2 for i in range(10)]
的。这样做:
(lambda a : [i ** 2 for i in range(a + 1)])(10)
-
需求是要得到
0~9
的每一步二次幂的结果,所以用for循环赋值。赋值之后将其写成列表推导式,得到的就是开始需要的那个大列表[(lambda a : [i ** 2 for i in range(a + 1)])(10) for x in range(10)]
-
遍历这个列表,将每个元素转成字符串,用换行追加的方式输出
print('\n'.join(str(t) for t in 大列表))