今天继续来写一个有趣的小程序——二进制钟表
二进制钟表
前戏
开门见山,先给大家看个好玩的!
最近一段时间在倒腾 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
本节的练习题在网上搜一下总结中所列举的方法,并尝试扩展其用途,写几行代码实验一下效果。
吐槽
最后吐槽一下,我本地写完之后直接发知乎,格式崩了。
又重新整理了一下格式。累死了!
如果喜欢我的文章记得点一下关注!您的关注是我最大的动力!
另外有兴趣的同学也可以关注一下我刚搭的博客,谢谢大家!