Python原地输出效果实现
分享一个很有意思的代码,实现动画如下所示:
从有趣的代码中学习知识点
一、上代码
简单粗暴,直接上代码(代码来源于《fluent python》一书):
import threading
import itertools
import time
import sys
class Signal:
"""
线程结束的标识
"""
go = True
def spin(msg, signal):
write, flush = sys.stdout.write, sys.stdout.flush
for char in itertools.cycle('|/-\'):
status = char + ' ' + msg
write(status)
flush()
write('x08' * len(status))
time.sleep(.1)
if not signal.go:
break
write(' ' * len(status) + 'x08' * len(status))
def slow_function():
# pretend wait IO a moment
# 主线程 sleep ,子线程获得执行
time.sleep(3)
return 42
def supervisor():
signal = Signal()
spinner = threading.Thread(target=spin, args=('thinking!', signal))
print('spinner object:', spinner)
spinner.start()
result = slow_function()
signal.go = False
spinner.join()
return result
def main():
result = supervisor()
print('Answer:', result)
if __name__ == "__main__":
main()
代码说明
代码中涉及到的小知识点,一一解释如下:
1、线程的切换
由于 GIL 的存在,所以每次只有一个线程在运行,所以 slow_function() 的作用就是强制 sleep 主线程,使子线程得到执行
2、sys.stdout.write 与 print 的区别,以及 sys.stdout.flush 的作用
来看下官方说明:
sys.stdout.write(string)
"""
Write string to stream.
Returns the number of characters written (which is always equal to the length of the string).
"""
print(value, ..., sep=' ', end='n', file=sys.stdout, flush=False)
"""
Prints the values to a stream, or to sys.stdout by default.
Optional keyword arguments:
file: a file-like object (stream); defaults to the current sys.stdout.
sep: string inserted between values, default a space.
end: string appended after the last value, default a newline.
flush: whether to forcibly flush the stream.
"""
简单说下这几点区别:
a、sys.stdout.write 是只能将 string 写到流,并且返回 string 的长度,它总是与 string 的长度值完全一致
b、sys.stdout.write 只能输出单个 string,而 print 可以输出多个,多个之间默认用空格隔开,同时默认以换行符结尾,通过修改 sep 参数与 end 参数,可以改变间隔符和结束符
c、print 接受多个参数,其实 file 是一个 file-like 的对象,即必须要有 write(string) 方法,file 的默认值是 sys.stdout
d、print 还可写入文件
e、print 从 3.3 版本开始,接受 flush 的参数,默认值为 False
3、itertools.cycle(iterable) 函数是怎么用的
这个就比较简单了,官方解释如下:
Make an iterator returning elements from the iterable and saving a copy of each. When the iterable is exhausted, return elements from the saved copy. Repeats indefinitely. Roughly equivalent to:
def cycle(iterable):
# cycle('ABCD') --> A B C D A B C D A B C D ...
saved = []
for element in iterable:
yield element
saved.append(element)
while saved:
for element in saved:
yield element
可以理解为无限循环可迭代对象里的元素
4、x08 是个什么东西
这是个有意思的东西,从前面的动画可以看出,一直在动的光标是一直在首位的,但我们都知道输出会一直往后叠加。x08 就是用来消除原来输出过的位置,b也可以实现同样的效果
扩展
如何实现一个进度条的展示呢,效果是左侧有移动的进度条,右侧有固定的百分比?
这个代码后面在公开,感兴趣的可以在后台留言哦
你点的每个赞,我都认真当成了喜欢
- spring profile 多环境配置管理
- 论linux下计划任务
- 20条Linux命令面试问答
- CentOS 6 使用 yum 安装MongoDB及服务器端配置
- java处理高并发高负载类网站的优化方法
- 每一个程序员需要了解的10个Linux命令
- php_curl.dll libssh2.dll 始终无法加载的原因 及解决办法
- ant安装、环境变量配置及验证
- MySQL性能优化的最佳20+条经验
- 剑指offer面试题7——用两个栈实现队列
- String类中你不知道的知识
- Hibernate 不同数据库的连接及SQL方言
- Java中被你忽视的四种引用
- 使用Python和R语言从头开始理解和编写神经网络
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 原创|面试官:Java对象一定分配在堆上吗?
- 频繁FGC的真凶原来是它
- 类加载器知识点吐血整理
- ThreadPoolExecutor 线程池"源码分析"
- 一起刷 leetcode 之螺旋矩阵(头条和美团真题)
- 如何快速判断一个用户是否访问过我们的 APP?
- replication-manager之switchover剖析
- 组复制安装部署 | 全方位认识 MySQL 8.0 Group Replication
- 提升低端设备的 Web 性能
- TypeScript 4.0 RC发布,带来诸多更新
- istio mcp实现探究
- K8S 生态周报| Helm v2 进入维护期倒计时
- Halcon实例转OpenCV:计算回形针方向
- OpenCV检测轮廓极点(Python C++)
- 「Python 正则」使用专题总结