Python print 函数 \r 转义字符的玩法及解析——转圈效果、动态表情、小数点加载、进度条

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: Python print 函数 \r 转义字符的玩法及解析——转圈效果、动态表情、小数点加载、进度条

【 原创作者:小康2021 】

对于这个标题,呃。。。为什么叫玩儿法呢?看了这篇文章你就会明白了。

print 函数 \r 转义字符

\r 是 print 函数的一种转义字符,是回车的意思,其作用是将 \r 后面的内容(包括空格)移到所有字符串开头,并逐一替换开头部分的字符,直至将 \r 后面的内容完全替换完成。(这听起来貌似并没有什么用)

一、基本用法

用法:

print('string1\rstring2')

将 string2 移到字符串开头,并逐一字符地替换 string1 ,直至 string2 被用完了(替换的字符数不够),如果 string1 还有字符没有被替换,则这些字符会保持原样。

实例:(就像这样)

print('Hello\rWorld!')    #'World!'比'Hello'多一个字符
print('google CSDN taobao\r123456')
print('Python\r12345')    #'12345'比'Python'少一个字符

输出结果为:

1. World!    #'!'直接补在后面
2. 123456 CSDN taobao
3. 12345n    #'n'没有被替换掉

这看起来好像还是没有什么用处,但其实只要我们细细研究和深度开发,我们还是可以用 \r 编出花儿一样(好玩的)的程序(玩具)。

二、\r 和 print 函数其他参数的结合

众所周知,print 函数的参数有 end、sep 等等。

但是你们可能不知道的是,当 \r 与 end 参数结合的时候就会有神奇的事情发生。

(一)基本用法:

print('\rsomestring',end='')

在这里,只有这一个 print 函数打印内容自然不会有什么作用,因为在 \r 转义字符前面没有任何字符,但是当你有多个 print 函数去打印内容时,由于参数 end='' 的作用,后面的 print 函数打印的内容会接在上一个 print 函数打印内容的后面。所以呢,如果后面的 print 函数也有 \r 转义字符(也就是和第一个一样),那么后面 print 函数打印的内容就会按字符逐一替换掉上一个 print 函数的打印内容。


那么,对此你想到了什么?对,我们可以在一行内于不同的时间输出不同的内容。


但是,这又有什么用呢?那就看看下面的这些玩法吧!

(二)高级玩法:

与循环和 time 模块相结合,不说那么多废话,直接看下面的高级玩法吧!

(1)转圈效果

from time import sleep
list = ['|','/','—','\\']    #创建转圈效果的所有样式,'\\'是'\'本身
while 1:
    for i in list:
        print('\r正在加载中 %s '%i,end='')
        sleep(0.05)    #间隔0.05秒

引入 time 模块中的 sleep 函数来控制时间间隔,同时创建转圈效果的所有样式,包括 ' | '、' / '、' — ' 以及 ' \ ' 这四个不同的样式,按上图顺序放在 list 列表中则会顺时针旋转,若将这四个样式的顺序倒过来放在 list 列表中,那么就会逆时针旋转。while 1 使 for 不停地循环读取 list 列表,而sleep(0.05) 则表示程序暂停 0.05 秒,这样,一个转圈的效果就实现了。

输出效果:

这是不是看起来有点秀呢?结合其他的代码或者程序,我们可以使我们的程序变得更加有趣,同时也能增加我们编程的动力,最最最重要的是我们还可以‘秀一波’,这难道不是一个一举三得的事情吗?类似地,我们还可以将转圈效果的四种样式依次改为数量不同的小数点,那么我们就得到了 ‘ 正在加载中 . . .  ’ 或者 ‘ Loading . . . ’ 这样的高级玩具,是不是很妙呢?但不要急,下面还有更加高级的玩法。

2)动态表情

from time import sleep
list1 = ['(づ。◕ᴗᴗ◕。)づ','(づ。—ᴗᴗ—。)づ','(づ。◕ᴗᴗ◕。)づ','(づ。—ᴗᴗ—。)づ','(づ。◕ᴗᴗ◕。)づ',
'(づ。◕ᴗᴗ◕。)づ','(づ。◕ᴗᴗ◕。)づ','(づ。◕ᴗᴗ◕。)づ','(づ。◕ᴗᴗ◕。)づ','(づ。◕ᴗᴗ◕。)づ']
#第一个动态表情图的所有样式
list2 = ['u~(@_@)~*','u~(@_@)~*','u~(@_@)~*','u~(@_@)~*','u~(@_@)~*',
'u~(@_@)~*','u~(—_—)~*','u~(@_@)~*','u~(—_—)~*','u~(@_@)~*']
#第二个动态表情图的所有样式
while 1:
    for a,b in zip(list1,list2):
        print('\r %s %s '%(a,b),end='')
        sleep(0.15)

这里的原理与上一个转圈效果类似,用 list 列表来创建效果图的每一帧的样式,然后循环 print 就得到了我们想要的效果。

输出效果:

看到之后是不是很心动呢?不急不急,还有更好玩儿的呢。

(3)进度条

from time import sleep
while 1:
    for i in range(51):
        print('\r加载进度: [%-50s]%.2f%%  '%('#'*i,i*2),end='')
        sleep(0.05)

这里的主要原理还是和之前的一样,但是这里要注意的是,在 ' %.2f%% ' 的后面要加上两个空格,因为转义字符 ' \r ' 的作用是替换掉前面的字符串,但是如果替换字符串比要替换的字符串短一点,或者说数量少一点,那么就不会被完全替换。在这里的情况就是当百分比重新回到 0.00% 的时候会比原来的 100.00% 短了两个字符,这就会导致有一部分字符没有被替换,也就是说,会出现 0.00%% 的情况。所以这里要额外加两个空格。

输出效果:

我们还可以为它加上颜色:

from time import sleep
while 1:
    for i in range(51):
        print('\r加载进度: [\033[32m%-50s\033[0m]\033[32m%.2f%%\033[0m  '%('#'*i,i*2),end='')
        sleep(0.05)

输出效果:

至于颜色是怎么搞出来的,大家可以自行在 CSDN 或者百度上搜索,这里就不多说了。不过我还是给个链接吧:Python如何输出带颜色的文字方法_u013934107的博客-CSDN博客或者我们也可弄其他的样式:

比如:

又或者:

这些样式都还挺有趣的,按各自的喜好,大家也可以自行设计自己的进度条的样式。顺便再在评论区留下你的足迹哦!


如果想让进度条不重复地执行,而是只执行一遍,我们可以在代码中加入 if 判断语句,并在适当的地方加入 break  语句去终止循环即可。


我们不一定非要用 time 模块中的 sleep 函数去让进度条执行,我们也可以将其用到其他地方,发挥进度条应有的作用。就比如说,我就将其用到了一个给文本加密的小程序(玩具)上面,它的效果是这样的(我自己又添加了一些小功能):

这种进度条看起来是不是十分地舒服呢?估计强迫症表示非常同意吧?反正我个人是比较喜欢的,不知道大家觉得怎么样呢?欢迎评论区留名!但是转义字符 ' \r ' 还是有一个不够完美的地方,或者说我还没有解决的地方(博主能力有限,但也有可能是本来就不能这样做),那就是不能用这个 ' \r ' 做到多行于不同时间不换行地输出不同内容,若有某位同志能解释不能做到的原因或者有做到的相关方法,欢迎在评论区留下你的大名!


(4)白给的知识

另外,在进度条这一方面,我们还可以加上另外一个转义字符 ' \a ',让你的进度条的功能更强大!也就不说那么多废话了,代码如下:

from time import sleep
while 1:
    for i in range(51):
        print('\r加载进度: [\033[32m%-50s\033[0m]\033[32m%.2f%%\033[0m  '%('#'*i,i*2),end='')
        sleep(0.05)
    print('\n加载完毕!','\a')
    break

这里有几点要注意:

首先,因为你第一个 print 语句后面有 end ='' 参数,所以如果第二个print  的 ‘加载完毕!’ 前面没有 ' \n ' 的话,那么 ‘加载完毕!’ 就会被打印在进度条的后面,而不是换行输出(这里要的是换行输出)。


第二,这里用了另外一个转义字符 ' \a ' ,它的作用简单粗暴,就是打印它(它并不会真的被打印出来)的时候会响铃(电脑的提示音)。这听起来是不是很给力呢?对,有了它,如果你的进度条走的非常慢(有可能你在执行某个工程量较大的程序),然后你又不想一直去看着它,那么转义字符 ' \a ' 将会帮你一个大忙,在进度条走完的时候,打印它,它就会发出电脑的提示音,然后你就会知道你的程序执行完了。所以,有了它,你就可以放心地睡大觉了。


输出效果:(哪有什么输出效果啊,一个声音还能给你整出花儿来诶?)


PS : 这个 ' \a ' 转义字符算是白给的知识啊,本来是讲 ' \r ' 的,跑题了。。。


大家要是还有什么好玩的用法,一定要在评论区发声噢!

目录
相关文章
|
2月前
|
SQL 数据挖掘 测试技术
南大通用GBase8s数据库:LISTAGG函数的解析
南大通用GBase8s数据库:LISTAGG函数的解析
|
3天前
|
数据采集 供应链 API
Python爬虫与1688图片搜索API接口:深度解析与显著收益
在电子商务领域,数据是驱动业务决策的核心。阿里巴巴旗下的1688平台作为全球领先的B2B市场,提供了丰富的API接口,特别是图片搜索API(`item_search_img`),允许开发者通过上传图片搜索相似商品。本文介绍如何结合Python爬虫技术高效利用该接口,提升搜索效率和用户体验,助力企业实现自动化商品搜索、库存管理优化、竞品监控与定价策略调整等,显著提高运营效率和市场竞争力。
21 3
|
24天前
|
数据采集 JSON API
如何利用Python爬虫淘宝商品详情高级版(item_get_pro)API接口及返回值解析说明
本文介绍了如何利用Python爬虫技术调用淘宝商品详情高级版API接口(item_get_pro),获取商品的详细信息,包括标题、价格、销量等。文章涵盖了环境准备、API权限申请、请求构建和返回值解析等内容,强调了数据获取的合规性和安全性。
|
22天前
|
数据挖掘 vr&ar C++
让UE自动运行Python脚本:实现与实例解析
本文介绍如何配置Unreal Engine(UE)以自动运行Python脚本,提高开发效率。通过安装Python、配置UE环境及使用第三方插件,实现Python与UE的集成。结合蓝图和C++示例,展示自动化任务处理、关卡生成及数据分析等应用场景。
89 5
|
1月前
|
存储 缓存 Python
Python中的装饰器深度解析与实践
在Python的世界里,装饰器如同一位神秘的魔法师,它拥有改变函数行为的能力。本文将揭开装饰器的神秘面纱,通过直观的代码示例,引导你理解其工作原理,并掌握如何在实际项目中灵活运用这一强大的工具。从基础到进阶,我们将一起探索装饰器的魅力所在。
|
1月前
|
Android开发 开发者 Python
通过标签清理微信好友:Python自动化脚本解析
微信已成为日常生活中的重要社交工具,但随着使用时间增长,好友列表可能变得臃肿。本文介绍了一个基于 Python 的自动化脚本,利用 `uiautomator2` 库,通过模拟用户操作实现根据标签批量清理微信好友的功能。脚本包括环境准备、类定义、方法实现等部分,详细解析了如何通过标签筛选并删除好友,适合需要批量管理微信好友的用户。
58 7
|
2月前
|
XML 数据采集 数据格式
Python 爬虫必备杀器,xpath 解析 HTML
【11月更文挑战第17天】XPath 是一种用于在 XML 和 HTML 文档中定位节点的语言,通过路径表达式选取节点或节点集。它不仅适用于 XML,也广泛应用于 HTML 解析。基本语法包括标签名、属性、层级关系等的选择,如 `//p` 选择所有段落标签,`//a[@href='example.com']` 选择特定链接。在 Python 中,常用 lxml 库结合 XPath 进行网页数据抓取,支持高效解析与复杂信息提取。高级技巧涵盖轴的使用和函数应用,如 `contains()` 用于模糊匹配。
|
2月前
|
测试技术 开发者 Python
使用Python解析和分析源代码
本文介绍了如何使用Python的`ast`模块解析和分析Python源代码,包括安装准备、解析源代码、分析抽象语法树(AST)等步骤,展示了通过自定义`NodeVisitor`类遍历AST并提取信息的方法,为代码质量提升和自动化工具开发提供基础。
82 8
|
1月前
|
C语言 开发者
【C语言】断言函数 -《深入解析C语言调试利器 !》
断言(assert)是一种调试工具,用于在程序运行时检查某些条件是否成立。如果条件不成立,断言会触发错误,并通常会终止程序的执行。断言有助于在开发和测试阶段捕捉逻辑错误。
48 5
|
2月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
98 2