zoukankan      html  css  js  c++  java
  • 一行代码打印列表推导式的每一步结果

    问题描述

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

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

    在这里插入图片描述

  • 相关阅读:
    Scrum敏捷开发中的各种会议到底怎么开?
    敏捷的方法与误区
    原创:分享封装好的面向JAVA的memcached客户端操作类
    ReactRouter路由配置
    脚手架创建react项目
    React基础知识
    Fetch请求
    redux学习笔记
    npm install常用用法
    python3+selenium3自动化8——当click事件失效,如何解决 测试
  • 原文地址:https://www.cnblogs.com/junsircoding/p/15664887.html
Copyright © 2011-2022 走看看