第1章:Python基础:标准输入和输出
点击上方“ Python学习开发 ”,选择“ 加为星标 ”
第一时间关注Python技术干货!
Python 3 是一种动态、解释型的高级编程语言,以其简洁明了的语法和强大的功能而广受欢迎。上一节介绍 Python 3 中的变量和表达式,以及它们在 CPython 实现中的工作方式。本文将介绍Python 3最新版中的标准输入输出(I操作,并深入探讨这些操作在CPython实现中的代码细节。
基本输入输出操作
1. 打印输出
在Python中,print()
函数是最常用的输出方法。它允许你将信息打印到控制台。例如:
print("Hello, World!")
此外,print()
函数还支持格式化输出,可以使用str.format()
方法或者f-string(Python 3.6+):
name = "cxa"
print("Hello, {}!".format(name))
# 或者使用f-string
print(f"Hello, {name}!")
2. 输入操作
输入操作通常通过input()
函数实现,它会暂停程序执行,等待用户输入。例如:
user_input = input("Please enter your name: ")
print(f"Hello, {user_input}!")
3.第三方打印模块rich
rich
是一个Python库,它提供了一种在命令行中创建丰富、多彩的文本输出的方式。rich
的目标是使命令行输出更加生动和信息丰富,同时保持代码的简洁性和易读性。它支持多种输出格式,包括文本、Markdown、JSON等,并且可以很容易地与Python的标准print()
函数结合使用。
基本使用
from rich import print
print("[bold[red]Hello, World![/red][/bold]")
这将输出"Hello, World!",其中"Hello, World!"将以红色粗体显示。
支持的样式
rich
支持多种文本样式,包括加粗、斜体、下划线、高亮等:
from rich import print
# 粗体
print("[bold]This is bold text[/bold]")
# 斜体
print("[italic]This is italic text[/italic]")
# 下划线
print("[underline]This is underlined text[/underline]")
# 高亮
print("[highlight]This is highlighted text[/highlight]")
颜色输出
rich
还支持多种颜色的文本输出:
from rich import print
# 多种颜色的输出
print("[red]This is red[/red] [green]and this is green[/green]")
表格输出
rich
可以很容易地创建表格输出:
from rich import print
from rich.table import Table
table = Table(show_header=True, header_style="bold magenta")
table.add_column("Column 1", style="cyan")
table.add_column("Column 2", style="yellow")
table.add_column("Column 3", style="green")
table.add_row("Item 1", "Item 2", "Item 3")
table.add_row("Item 4", "Item 5", "Item 6")
print(table)
进度条
rich
还提供了进度条功能,可以用于显示长时间运行的任务的进度:
from rich import print
from rich.progress import track
for i in track(range(100), description="Processing"):
# 模拟任务
time.sleep(0.1)
CPython中的实现方式
print
函数的实现
在CPython中,print
函数的实现主要位于Modules/builtins.c
文件中。print
函数的实现会涉及到多个步骤,包括参数的处理、格式化字符串的创建以及最终的输出。以下是print
函数实现的一个简化版本:
static PyObject *
builtin_print(PyObject *self, PyObject *args, PyObject *kwds)
{
static char *kwlist[] = {"sep", "end", "file", "flush", NULL};
PyObject *sep = NULL, *end = NULL, *file = NULL, *flush = NULL;
// 解析参数和关键字参数
if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OOOO:print", kwlist,
&sep, &end, &file, &flush)) {
return NULL;
}
// ... 参数处理逻辑 ...
// 获取标准输出
if (file == NULL || file == Py_None) {
file = PySys_GetObject("stdout");
// ...
}
// ... 单个或多个对象的输出逻辑 ...
// 刷新输出
if (PyObject_CallMethod(file, "flush", "") == NULL) {
return NULL;
}
Py_RETURN_NONE;
}
在这个简化的例子中,builtin_print
函数是print
函数的底层实现。它接收可变数量的参数,并且有默认的分隔符和结束符。然后,它会创建一个格式化的输出字符串,并使用write
方法将其写入到指定的文件对象中,通常是sys.stdout
。
input
函数的实现
input
函数的实现则位于Modules/_io/_iotextio.c
文件中。input
函数会从标准输入读取一行文本,并返回一个字符串对象。以下是input
函数实现的一个简化版本:
static PyObject *
builtin_input(PyObject *self, PyObject *args, PyObject *kwds)
{
PyObject *result = NULL, *getline_func = NULL;
PyObject *stdin = PySys_GetObject("stdin");
// ... 参数处理逻辑 ...
getline_func = PyObject_GetAttrString(stdin, "readline");
if (getline_func == NULL) {
return NULL;
}
result = PyObject_CallObject(getline_func, NULL);
Py_DECREF(getline_func);
if (result == NULL) {
return NULL;
}
// 去除末尾的换行符
if (PyBytes_Check(result)) {
// ... 处理字节数据 ...
} else if (PyUnicode_Check(result)) {
Py_ssize_t length;
length = PyUnicode_GET_LENGTH(result);
if (length == 0) {
Py_CLEAR(result);
} else {
// 去除\n或者\r\n
PyObject *rstripped = PyUnicode_Substring(result, 0, length-1);
if (rstripped == NULL || PyUnicode_READY(rstripped) == -1) {
return NULL;
}
Py_SETREF(result, rstripped);
}
}
return result;
}
在这个例子中,builtin_input
函数是input
函数的底层实现。如果提供了提示字符串,它会先将其写入标准输出。然后,它会从标准输入读取一行文本,并返回该行文本(不包括结尾的换行符)。
推荐阅读
第1章:Python基础-Python 3 数据类型详解:数字、字符串、布尔值