一行代码打印列表推导式的每一步结果

问题描述

将下面这个代码用一行代码实现:

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 大列表))
    

在这里插入图片描述

posted @ 2021-12-08 23:05  小骏不抬杠  阅读(87)  评论(0编辑  收藏  举报