如何用python输出“1024“

一、问题描述: 昨天程序员的节日,看到有个趣味编程,打印图形"1024",编程语言不限;要求是:

  • 图形"1"用数字1构成
  • 图形"0"用数字0构成
  • 图形"2"用数字2构成
  • 图形"4"用数字4构成

示例如图所示:

二、问题解决:

python 复制代码
F = lambda a, b, c, d, t: [a, b, c, d, not a, not c, not d, not a and not b, not a  and not c , not b and not c, not a and not b and not c, a or c, a or b, b or c, a or b or c][t]
M = 'difedialcijcahihdjnkhhochkbackmffgm'
L = list(map(lambda i: ord(i) - 97, M))

def Split(start, end, n, B):
    D = ' '*4
    for i in range(start, end):
        D += F(*B, L[i]) and str(n) or ' '
    return D

def PrintProgramerDate():
    D = ''
    B1 = list(map(lambda i: i=='1', bin(1)[2:].zfill(4)))[::-1]
    B0 = list(map(lambda i: i=='1', bin(0)[2:].zfill(4)))[::-1]
    B2 = list(map(lambda i: i=='1', bin(2)[2:].zfill(4)))[::-1]
    B4 = list(map(lambda i: i=='1', bin(4)[2:].zfill(4)))[::-1]
    count = 0
    for i in range(len(M)):
        D += F(*B1, L[i]) and str(1) or ' '
        if i % 5 == 4:
            D += Split(i-4, i+1, 0, B0)
            D += Split(i-4, i+1, 2, B2)
            D += Split(i-4, i+1, 4, B4)
            D += '\n'
        D += ''

        
    print(D)

if __name__ == "__main__":
    PrintProgramerDate()

三、代码解释:

python 复制代码
# 从上面的代码段可知,代码的核心是PrintProgramerDate函数,所以我们从该函数开始看
def PrintProgramerDate():
    D = ''
    B1 = list(map(lambda i: i=='1', bin(1)[2:].zfill(4)))[::-1]
    B0 = list(map(lambda i: i=='1', bin(0)[2:].zfill(4)))[::-1]
    B2 = list(map(lambda i: i=='1', bin(2)[2:].zfill(4)))[::-1]
    B4 = list(map(lambda i: i=='1', bin(4)[2:].zfill(4)))[::-1]
    count = 0
    for i in range(len(M)):
        D += F(*B1, L[i]) and str(1) or ' '
        if i % 5 == 4:
            D += Split(i-4, i+1, 0, B0)
            D += Split(i-4, i+1, 2, B2)
            D += Split(i-4, i+1, 4, B4)
            D += '\n'
        D += ''

        
    print(D)

1、 该函数不需要参数;

2、首先定义一个空字符串D;

3、接下来的一个表达式B1 = list(map(lambda i: i=='1', bin(1)[2:].zfill(4)))[::-1],让我们拆开看:

  • 首先看最里面的bin函数,作用是将十进制的数字转化为二进制,例如:bin(2)='0b10',bin(2)[2:]的含义就是取其数字部分,结果是'10';
  • bin(2)[2:].zfill(4)的含义是用0将bin(2)[2:]填充为4个字符,结果是:'0010';
  • 然后是一个map套lambda表达式,它的作用是对上面得到的字符串'0010'遍历并判断是否等于'1',这样会得到一个map类;
  • 下面通过List将上面得到的结果转化为列表,最后通过[::-1],倒序结果,结果是:[False, True, False, False]

4、通过3的解释,可以知道B1、B0、B2、B4,是将数字1、0、2、4分别按照二进制转化为一个列表,列表的元素为True或者False;

5、然后进入一个循环,循环的长度是通过M的长度来控制,M是一个字符串,字符串中是字母构成;

6、循环中的第一个语句D += F(*B1, L[i]) and str(1) or ' '的结构乍看起来很奇怪,其实就是if-else的简写,作用是:如果F(*B1, L[i])的结果为True则给D拼接字符1,否则拼接空格;对于F(*B1, L[i])的运算过程,下面进行详细分析:

  • 首先看L,L= list(map(lambda i: ord(i) - 97, M)),其中的ord函数的作用是将字符转成ascii码,97是小写字母a的ascii码,ord(i)-97得到的是个数字,所以L执行完后的结果是:[3, 8, 5, 4, 3, 8, 0, 11, 2, 8, 9, 2, 0, 7, 8, 7, 3, 9, 13, 10, 7, 7, 14, 2, 7, 10, 1, 0, 2, 10, 12, 5, 5, 6, 12]
  • 下面我们看F,F是一个lamdda表达式,其实就是一个"匿名函数",参数是将B解包了(*B)的数据以及Li的值,返回的结果是布尔值;
  • 具体执行过程举个例子说明:假设i=0,(*B,L[i])传过去的参数就是[True, False, False, False, 3],这里面的最后一个数字3是根据上面得到的L来获取的,传到F中,t=3,a=True,b=False,c=False,d=False,由t=3知道,从F中的列表中可知,返回的结果应该是【3】个值,也是就d,d的值为False,所以 F(*B1, L[0])的结果就是False,那么D += F(*B1, L[0]) and str(1) or ' '的结果就是D拼接了个空格;

7、下面是个判断语句,i对5取模是否为4,后面也是对D进行拼接字符串,执行过程和6一样,最后拼了个回车符,这几个语句的主要作用是让输出的图形打印在同一行。

至此主要的代码就分析完毕!

看到这里相信第一次看的人会有一个疑问,就是你那个M那一串字符是怎么确定的,为什么打印出来就是1024了,这说白了就是根据输出的图形进行编码;打印出来的结果图形每个都是5*7的刚好是35个字符,和M的长度一样,细品。。。。

相关推荐
VidDown2 小时前
24fps 转 25fps 不只是改个数字:帧率转换、PAL/NTSC 与音频补偿
python·网络协议·音视频·视频编解码·视频
遇印记3 小时前
传输层,网络层
运维·服务器·网络·windows·学习
死磕音视频3 小时前
让小模型做选择题:限定候选项并读取 logits 概率的入门实践(附 Python 代码)
开发语言·python·大模型·文本分类·transformers
凤山老林4 小时前
Spring Boot 接入国密 SM2/SM3/SM4 的一些实践记录
spring boot·后端·python
又見山5 小时前
Obsidian 跨平台同步实测:Nutstore Sync 在 Windows、Mac、Linux、iOS、Android 全平台综合测评
windows·macos·obsidian·obsidian同步·obsidian教程·obsidian入门·obsidian笔记库搭建
pride.li5 小时前
第03章 Python 教程-基础语法:注释与变量
服务器·前端·后端·python·算法·计算机视觉
databook6 小时前
用 Pydantic AI 从零搭建一个能干活的 AI Agent
人工智能·python
顽疲6 小时前
Java vue 养老系统源码详解:月账单 care_month_bill 与 Quartz 扣费 Job 实践
java·开发语言·vue.js·vue养老·springboot养老·java养老
康小旺6 小时前
把 markitdown 做成 Windows 桌面版:拖进文档就出 Markdown,附 233MB→64MB 打包裁剪全过程
python
jearry6 小时前
一个编辑器两个内核:Markdown 实时视图与源码视图并存时的竞态、光标锚点与 PDF 导出
windows·markdown