f-string+sys.stdout.write,在python中“随意”我的输出。
(笔记模板由python脚本于2024年07月29日 08:09:35创建,本篇笔记适合喜欢python并有一定基础的coder翻阅)
-
Python 官网:https://www.python.org/
-
Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅是基础那么简单……
地址:https://lqpybook.readthedocs.io/
自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。
—— 华罗庚
- My CSDN主页、My HOT博、My Python 学习个人备忘录
- 好文力荐、 老齐教室
本文质量分:
本文地址: https://blog.csdn.net/m0_57158496/
CSDN质量分查询入口:http://www.csdn.net/qc
- ◆ 定制自己的writer
- 1、sys.stdout.write v s vs vs print
- 2、sys.stdout.write是print的底层操作
- 3、“定制”自己的writer
- 4、f-string定制模板
- 5、有色输出
◆ 定制自己的writer
1、sys.stdout.write v s vs vs print
在Python中,sys.stdout.write
和 print
函数在许多情况下可以产生相似的效果,因为它们都用于将输出发送到标准输出(通常是控制台或终端)。但是,它们之间有一些关键的区别:
-
自动换行:
print
函数默认在输出的末尾添加一个换行符(\n
),除非指定end=''
参数。sys.stdout.write
不会自动添加换行符,必须显式地写入换行符。
例如:
import sys print("Hello, World!") sys.stdout.write("Hello, World!\n")
-
参数处理:
print
函数可以接受多个参数,并自动处理它们之间的空格分隔。sys.stdout.write
只接受一个字符串参数,如果需要,你必须自己构建这个字符串。
例如:
print("Hello", "World!") # 输出:Hello World! sys.stdout.write("Hello " + "World!\n") # 输出:Hello World!
-
文件操作:
print
可以通过file
参数直接写入到任何文件对象。sys.stdout.write
默认只写入到标准输出,但可以通过重新分配sys.stdout
到一个文件对象来实现写入文件。
例如:
with open('example.txt', 'w') as f: print("Hello, World!", file=f) with open('example.txt', 'w') as f: sys.stdout = f sys.stdout.write("Hello, World!\n") sys.stdout = sys.__stdout__ # 恢复标准输出
-
性能:
- 在某些情况下,
sys.stdout.write
可能比print
有轻微的性能优势,因为print
函数要处理更多的参数和自动格式化。
- 在某些情况下,
总的来说,尽管 sys.stdout.write
和 print
可以在某些情况下互换使用,但它们并不是同质同效的。根据具体的使用场景和需求,你应该选择最适合的那个。通常,print
函数因其易用性和多功能性而被广泛使用,而 sys.stdout.write
在需要更细粒度控制输出格式时可能更受欢迎。
2、sys.stdout.write是print的底层操作
“sys.stdout.write是print的底层操作”,可以说 print
是 sys.stdout.write
的一种“个性定制”。在Python中,print
是一个高级的内置函数,它提供了更多的功能和方便的接口来处理输出。当您使用 print
函数时,Python解释器实际上在底层调用了 sys.stdout.write
(以及可能的其他操作)来实现其功能。
以下是 print
的一些“个性定制”特性,这些特性在 sys.stdout.write
中是默认不提供的:
- 自动字符串转换:
print
会自动将非字符串对象转换为字符串。 - 自动添加空格:
print
在参数之间自动添加空格。 - 自动换行:默认情况下,
print
在输出的末尾添加一个换行符。 - 文件支持:
print
允许您通过file
参数直接写入文件,而不是标准输出。 - 结尾字符定制:
print
允许您通过end
参数指定输出结尾的字符。
在Python的早期版本中(例如Python 2),print
是一个语句而不是函数,其实现细节与现在有所不同。但从Python 3开始,print
被重新实现为一个函数,其背后确实是调用了 sys.stdout
的 write
方法来执行实际的输出工作。
在Python源代码中,可以找到 print
函数的实现细节。在调用 print
时,解释器会执行一系列操作,最终调用 sys.stdout.write
来输出内容。以下是一个非常简化的示例流程:
def print(*args, sep=' ', end='\n', file=sys.stdout):
output = sep.join(str(arg) for arg in args)
file.write(output + end)
在这个简化的示例中,print
函数首先将所有参数转换为字符串,并将它们用 sep
参数指定的分隔符连接起来。然后,它将结果字符串和 end
参数指定的结尾字符一起写入到 file
参数指定的文件对象中,默认是 sys.stdout
。
因此,虽然 sys.stdout.write
是 print
的一个底层操作,但 print
提供了更多的功能,使得它成为日常编程中更常用的输出方法。
3、“定制”自己的writer
一般情况下,python“官方”固化的sys.stdout.write,完全可以满足需求。当print不能实现“预期”时,最适宜的就是自己“定制”sys.stdout.write。
这样子的理解是正确的。在大多数情况下,Python的 print
函数确实可以满足常见的输出需求,因为它提供了很多方便的特性,如自动换行、参数之间的空格分隔等。然而,当 print
函数无法满足特定的输出格式或性能要求时,使用 sys.stdout.write
(而不是 sys.stdout.write
,这里应该是 sys.stdout.write
)来定制输出是一个合适的选择。
以下是一些可能需要使用 sys.stdout.write
的场景:
-
性能优化:在需要频繁输出大量数据时,
sys.stdout.write
可能会比print
函数提供更好的性能,因为它避免了print
函数的额外开销。 -
精细控制输出:当需要精确控制输出的格式,例如不添加额外的空格或换行符时,
sys.stdout.write
允许您直接写入指定的字符串。 -
二进制数据:
print
函数是为文本输出设计的,如果需要写入二进制数据到标准输出,使用sys.stdout.buffer.write
会更合适。 -
多线程输出:在多线程环境中,直接使用
sys.stdout.write
可能需要更少的同步操作,因为它不会像print
那样自动添加换行符,这可能导致线程间的输出交错。 -
与其他系统交互:当需要将输出发送到其他程序或系统时,可能需要更精细地控制输出,以符合外部系统的接口要求。
在使用 sys.stdout.write
时,需要注意以下几点:
- 需要手动管理换行符
- 需要确保所有非字符串类型的参数都被转换为字符串
- 如果您希望输出后不立即刷新输出缓冲区,可能需要手动调用
sys.stdout.flush()
因此,当 print
函数不能满足特定的需求时,sys.stdout.write
提供了一个更底层、更灵活的接口来自定义输出行为。这样子,就可以自由“定制”自己的writer。
4、f-string定制模板
用f-string做模板用一条语句先行在sys.stdout.write前把文本处理成“自己想要的样子”,也是很方便。这是一个较好的方案。
使用 f-string(格式化字符串字面量)来构建要输出的文本,然后使用 sys.stdout.write
来输出,确实是一个很好的方案。f-string 是 Python 3.6 及以上版本中引入的一种非常强大和灵活的字符串格式化方法,它允许你轻松地嵌入表达式到字符串字面量中,并且执行效率通常比其他字符串格式化方法(如 %
格式化或 str.format()
)要高。
以下是使用f-string
和 sys.stdout.write
的一个例子:
import sys
name = "Alice"
age = 30
message = f"Hello, {name}. You are {age} years old.\n"
sys.stdout.write(message)
在这个例子中,f-string 被用来构建一个包含变量 name
和 age
的消息字符串,然后使用 sys.stdout.write
将该字符串输出到标准输出。
以下是使用 f-string 作为模板的优点
:
-
易读性:f-string 提供了一种清晰、直观的方式来格式化字符串,使得代码更易于阅读和维护。
-
效率:f-string 在运行时编译为表达式,因此它们的执行速度通常比其他字符串格式化方法快。
-
灵活性:你可以轻松地在 f-string 中嵌入任意表达式,包括函数调用、算术运算等。
-
控制:使用
sys.stdout.write
允许你精确控制输出的行为,例如,不自动添加换行符,或者根据需要手动刷新输出缓冲区。
因此,如果你需要更精细地控制输出格式,同时希望代码保持简洁和高效,使用 f-string 构建模板然后使用 sys.stdout.write
输出是一个非常好的方案。
5、有色输出
可以if os.name != 'nt’来过滤windows,非’nt’有色而’nt’原样。可以“区别对待”定制自己的writer。🤗🤗
确实,可以使用 os.name
来检查当前操作系统,并根据操作系统类型来决定是否启用颜色输出。在 Python 中,os.name
的值通常是 'posix'
(表示类Unix系统,如Linux和macOS)或者 'nt'
(表示Windows系统)。
以下是如何根据操作系统来定制您的
my_writer函数的示例
:
import os
import sys
def my_writer(*args, sep=' ', end='\n', file=sys.stdout, flush=False, color=None):
# 检查操作系统是否支持颜色输出
if os.name != 'nt' and color:
# 添加颜色控制字符
color_start = f"\033[{color}m"
color_end = "\033[0m"
else:
# Windows 或未指定颜色,不添加颜色控制字符
color_start = ""
color_end = ""
# 使用 f-string 构建消息,并添加颜色控制字符(如果支持)
message = f"{color_start}{sep.join(f'{arg}' for arg in args)}{color_end}{end}"
# 使用 sys.stdout.write 写入消息
file.write(message)
# 如果 flush 参数为 True,则刷新输出缓冲区
if flush:
file.flush()
# 使用自定义的 my_writer 函数
my_writer("Hello", "World", sep='-', end='!\n', color='92') # 绿色输出
在这个示例中,color
参数允许您指定一个 ANSI 颜色代码(例如 '92'
表示绿色)。函数会检查当前操作系统,如果操作系统不是 Windows (os.name != 'nt'
) 并且提供了颜色代码,则会在消息前后添加相应的颜色控制字符。
这样,您就可以在不同的操作系统上“区别对待”,为非 Windows 系统提供彩色输出,而为 Windows 系统提供原样输出。这种方法使得您的 my_writer
函数更加灵活,可以根据运行环境来调整输出样式。🤗🤗
上一篇: Python获取终端尺寸(os.get_terminal_size(),无差别获取当前终端长宽,让你为所欲)
下一篇:
我的HOT博:
本次共计收集 311 篇博文笔记信息,总阅读量43.82w。数据于2024年03月22日 00:50:22完成采集,用时6分2.71秒。阅读量不小于6.00k的有
7
7
7篇。
-
001
标题:让QQ群昵称色变的神奇代码
(浏览阅读 5.9w )
地址:https://blog.csdn.net/m0_57158496/article/details/122566500
点赞:25 收藏:86 评论:17
摘要:让QQ昵称色变的神奇代码。
首发:2022-01-18 19:15:08
最后编辑:2022-01-20 07:56:47 -
002
标题:Python列表(list)反序(降序)的7种实现方式
(浏览阅读 1.1w )
地址:https://blog.csdn.net/m0_57158496/article/details/128271700
点赞:8 收藏:35 评论:8
摘要:Python列表(list)反序(降序)的实现方式:原址反序,list.reverse()、list.sort();遍历,全数组遍历、1/2数组遍历;新生成列表,resersed()、sorted()、负步长切片[::-1]。
首发:2022-12-11 23:54:15
最后编辑:2023-03-20 18:13:55 -
003
标题:pandas 数据类型之 DataFrame
(浏览阅读 9.7k )
地址:https://blog.csdn.net/m0_57158496/article/details/124525814
点赞:7 收藏:36
摘要:pandas 数据类型之 DataFrame_panda dataframe。
首发:2022-05-01 13:20:17
最后编辑:2022-05-08 08:46:13 -
004
标题:个人信息提取(字符串)
(浏览阅读 8.2k )
地址:https://blog.csdn.net/m0_57158496/article/details/124244618
点赞:2 收藏:15
摘要:个人信息提取(字符串)_个人信息提取python。
首发:2022-04-18 11:07:12
最后编辑:2022-04-20 13:17:54 -
005
标题:Python字符串居中显示
(浏览阅读 7.6k )
地址:https://blog.csdn.net/m0_57158496/article/details/122163023
评论:1 -
006
标题:罗马数字转换器|罗马数字生成器
(浏览阅读 7.5k )
地址:https://blog.csdn.net/m0_57158496/article/details/122592047
摘要:罗马数字转换器|生成器。
首发:2022-01-19 23:26:42
最后编辑:2022-01-21 18:37:46 -
007
标题:回车符、换行符和回车换行符
(浏览阅读 6.0k )
地址:https://blog.csdn.net/m0_57158496/article/details/123109488
点赞:2 收藏:3
摘要:回车符、换行符和回车换行符_命令行回车符。
首发:2022-02-24 13:10:02
最后编辑:2022-02-25 20:07:40
截屏图片
(此文涉及ChatPT,曾被csdn多次下架,前几日又因新发笔记被误杀而落马。躺“未过审”还不如回收站,回收站还不如永久不见。😪值此年底清扫,果断移除。留此截图,以识“曾经”。2023-12-31)
精品文章:
- 好文力荐:齐伟书稿 《python 完全自学教程》 Free连载(已完稿并集结成书,还有PDF版本百度网盘永久分享,点击跳转免费🆓下载。)
- OPP三大特性:封装中的property
- 通过内置对象理解python'
- 正则表达式
- python中“*”的作用
- Python 完全自学手册
- 海象运算符
- Python中的 `!=`与`is not`不同
- 学习编程的正确方法
来源:老齐教室
◆ Python 入门指南【Python 3.6.3】
好文力荐:
- 全栈领域优质创作者——[寒佬](还是国内某高校学生)博文“非技术文—关于英语和如何正确的提问”,“英语”和“会提问”是编程学习的两大利器。
- 【8大编程语言的适用领域】先别着急选语言学编程,先看它们能干嘛
- 靠谱程序员的好习惯
- 大佬帅地的优质好文“函数功能、结束条件、函数等价式”三大要素让您认清递归
CSDN实用技巧博文:
- 8个好用到爆的Python实用技巧
- python忽略警告
- Python代码编写规范
- Python的docstring规范(说明文档的规范写法)