如何用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])的运算过程,下面进行详细分析:

  • 首先看LL= 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)的数据以及L[i]的值,返回的结果是布尔值;
  • 具体执行过程举个例子说明:假设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的长度一样,细品。。。。

相关推荐
gs801408 分钟前
idea java.lang.OutOfMemoryError: GC overhead limit exceeded
java·开发语言
紫云_Zyun19 分钟前
JAVA开发学习Day8
java·开发语言·学习·vue
heardlover37 分钟前
Jupyter Markdown样式说明
python
码上飞扬40 分钟前
探索Python的异步编程:高效处理并发任务
开发语言·python·php·异步编程
叫我阿呆就好了1 小时前
C++ 复习总结记录六
开发语言·c++
白白白白纸呀1 小时前
C#核心技术---Linq
开发语言·windows·c#·.net·linq
越甲八千1 小时前
C++ vtordisp的应用场景
开发语言·c++
靴子学长1 小时前
基于 Python 自动化接口测试(踩坑与实践)
python·模块测试
007php0071 小时前
如何恢复依赖的go自定义SDK的GoZero项目
java·数据库·python·microsoft·oracle·golang·php
Spcarrydoinb1 小时前
python学习笔记—14—函数
笔记·python·学习