今天继续来写一个有趣的小程序——二进制钟表

二进制钟表

前戏

开门见山,先给大家看个好玩的!


最近一段时间在倒腾 Manjaro系统,配置桌面时意外的发现了这个二进制钟表挂件。

第一次见这玩意的同学可能会一头雾水。

没关系,看完下面这张图之后你就明白它是干啥的了!


是不是很有趣?

今天我们就用Python来实现它!

实现

第一步 :创建脚本


名字依旧是随便写。

第二步:写出很烂的一坨代码。

import time # 引用 time 库
def main():
time_str = time.strftime("%H %M %S") # 将格式化时间存入变量
print(time_str)
time_str_split = time_str.split() # 将 time_str 用空格分割为列表
print(time_str_split)
for i in time_str_split:
print(f"{int(i[0]):04b}") # 输出数字的第一位,并转为二进制数,若不足 4 位则用 0 补全
print(f"{int(i[1]):04b}")
if __name__ == '__main__':

main()

输出结果

14 13 44
['14', '13', '44']
0001
0100
0001
0011
0100
0100

看这 3 - 8 行,有内味了吧!

只不过这输出怎么是横着的?

看来代码还得改!

import time # 引用 time 库
def main():
time_str = time.strftime("%H %M %S") # 将格式化时间存入变量
print(time_str)
time_str_split = time_str.split() # 将 time_str 用空格分割为列表
print(time_str_split)
l = [] # 定义一个列表 l
for i in time_str_split:
l.append(f"{int(i[0]):04b}") # 将生成的字符串存入列表 l
l.append(f"{int(i[1]):04b}")
print(l)
l = list(zip(*l)) # 使用 zip 函数将 l 重新排列
print(l)
for i in l:
print("".join(i)) # join 的作用是将列表或元组通过某字符串连接起来
if __name__ == '__main__':
main()

输出结果

14 29 40
['14', '29', '40']
['0001', '0100', '0010', '1001', '0100', '0000']
[('0', '0', '0', '1', '0', '0'), ('0', '1', '0', '0', '1', '0'), ('0', '0', '1', '0', '0', '0'), ('1', '0', '0', '1', '0', '0')]
000100
010010
001000

100100

这下 5 - 8 行顺序是没有问题了,而且也满足了二进制时钟的规则。这样子我们雏形就完成了!

但是因为篇幅原因,我们这一节就做到这, 暂时先不优化!

毕竟先实现后优化是我一直信奉的真理。啥都别怕动手去做!

总结

本节中用到的方法我来逐个说明。

time 库

import time,import 是引用库的语法,这个以后会经常用到,先记住

time.strftime("%H %M %S"),这是将当前的系统时间格式化输出。字符含义见下表:

举个例子:

import time
print(time.strftime("%Y-%m-%d%H:%M:%S"))

输出:

2020-04-05 14:45:05
split()

将字符串以某字符作为分隔符,将其分割为列表。默认使用空格作为分割符。

例子:

a = "1,2,3"
print(a.split(","))
b = "12345"
print(b.split("3"))

输出:

['1', '2', '3']
['12', '45']
f-string

在字符串的引号前加上 f 或 F 则说明改字符串使用了 python3.6 的新特性 —— f-string 。

该字符串中,被大括号 {} 所包裹的对象会将其运行所得的值替换直该字符串。

举例:

a = 123

print(f"a: {a}")

输出:

a: 123

这玩意还有更复杂的用法,后面的章节会单独说明。

zip()

zip()可以将多个可迭代对象中的对应元素打包成为一个个的元组。

举例:

# 例子1

a = [1,2,3]

b = [4,5,6]

print(list(zip(a, b)))

# 例子2

l = ["abc", "def"]

print(list(zip(*l)))

输出:

[(1, 4), (2, 5), (3, 6)]

[('a', 'd'), ('b', 'e'), ('c', 'f')]

因为 python3 中`zip()`返回的是一个对象,所以要用`list()`将其转化为列表

在 例子2 中,`l`是作为一个可变长参数传入的,所以在其前面加了一个`*`。关于什么是可变参数,后面也会做详细说明。

join()

字符串的内建方法。

可以使用该字符作为连接符,将一个列表或元组连接为一个字符串。

例子:

# 例子1
a = ["1", "2", "3"]
print(",".join(a))
# 例子2
b = ("a", "b", "c")
print("|".join(b))

输出:

1,2,3

a|b|c

本节的练习题在网上搜一下总结中所列举的方法,并尝试扩展其用途,写几行代码实验一下效果。