Python(二):第一章:字符串打印格式化与PyCharm模板变量

Python(二):第一章:字符串打印格式化与PyCharm模板变量
Prorise第一章:字符串打印格式化与PyCharm模板变量
本章将分为两个主要部分:首先介绍如何在 Python 控制台中使用 ANSI 转义序列来实现文本的彩色和格式化输出,并提供一个实用的封装示例;其次,我们将探讨如何利用 IDE(特别是 PyCharm,但概念也适用于其他IDE)中的 Live Template (实时模板/代码片段) 功能,通过预设的模板变量和缩写来大幅提升 Python 的编码效率。
字符串打印格式化 (ANSI 转义序列)
Python 允许在控制台中输出彩色文本和特殊格式,这在创建命令行界面 (CLI) 或需要突出显示特定输出时非常有用,可以显著增强用户体验和信息的可读性。这种效果通常是通过 ANSI 转义序列 (ANSI escape sequences) 来实现的。
基本语法
ANSI 转义序列的基本格式如下:
1 | \033[参数m内容\033[0m |
或者在 Python 字符串中,通常写作:
1 | '\033[<参数>m<你的文本内容>\033[0m' |
其中:
\033
(或\x1b
):这是 ESC 字符的八进制(或十六进制)表示,标志着转义序列的开始。[
:控制序列引导符 (Control Sequence Introducer, CSI)。<参数>
:一个或多个用分号;
分隔的数字。这些数字代码控制着文本的显示方式、前景色(文字颜色)和背景色。m
:表示设置图形再现参数 (Select Graphic Rendition, SGR) 的结束标志。<你的文本内容>
:你希望应用这些格式的实际文本。\033[0m
:这是一个特殊的重置序列,它会清除之前设置的所有格式属性,使后续的文本恢复到终端的默认显示状态。每次使用完特殊格式后,都强烈建议使用此序列来重置,以避免格式污染后续的输出。
ANSI 转义码表
下表列出了一些常用的 ANSI SGR 参数代码:
显示方式 | 代码 | 前景色 | 代码 | 背景色 | 代码 |
---|---|---|---|---|---|
默认 | 0 | 黑色 | 30 | 黑色 | 40 |
高亮/粗体 | 1 | 红色 | 31 | 红色 | 41 |
(通常不使用) | 2 | 绿色 | 32 | 绿色 | 42 |
下划线 | 4 | 黄色 | 33 | 黄色 | 43 |
闪烁 | 5 | 蓝色 | 34 | 蓝色 | 44 |
反白 | 7 | 紫红色 | 35 | 紫红色 | 45 |
不可见 | 8 | 青蓝色 | 36 | 青蓝色 | 46 |
白色 | 37 | 白色 | 47 |
注意:
- 除了上述标准颜色 (30-37, 40-47),现代终端通常还支持高强度颜色 (例如,高亮红色使用
\033[1;31m
或者单独的亮色代码\033[91m
)、256色模式以及 RGB 真彩色模式 (例如\033[38;2;r;g;bm
设置前景色为 RGB(r,g,b))。但这些高级模式的兼容性可能因终端模拟器而异。 - “闪烁”(代码5) 和 “不可见”(代码8) 的支持程度也取决于终端。
实用示例
基本颜色设置
1 | # 红色文字 |
组合使用
可以同时设置显示方式、前景色和背景色,用分号分隔参数。
1 | # 红色文字 + 黄色背景 |
实际应用场景 (封装为 print_utils.py
工具模块)
为了在项目中更方便、更一致地使用彩色打印,通常我们会将这些 ANSI 转义序列封装成常量或函数。
1 | """ |
如何使用这个 print_utils
模块:
- 将上述代码保存为
print_utils.py
文件。 - 在您的其他 Python 脚本中,通过
from print_utils import *
或import print_utils
来使用这些函数。
1 | # 示例:在另一个脚本中使用 print_utils.py |
PyCharm Live Templates 提升编码效率
Live Templates(实时模板或代码片段)是现代集成开发环境 (IDE) 如 PyCharm、VS Code 等提供的一项核心功能。它允许开发者定义常用的代码结构,并通过输入一个简短的缩写 (Abbreviation) 后按下特定按键(通常是 Tab
)来快速插入这些代码块 (Template text)。这些模板通常还支持占位符变量,如 $VAR$
或 $CURSOR$
,在模板展开后,IDE 会引导用户快速填充这些变量或将光标定位到预设位置。
使用 Live Templates 可以:
- 显著减少重复的样板代码输入。
- 提高编码速度和效率。
- 帮助保持代码风格和结构的一致性。
- 减少因手动输入而出错的可能性。
我们需要根据如下步骤去键入模板
1. 基本循环
a. for...in
循环 (遍历序列)
- 模板用途: 快速生成一个遍历可迭代对象的
for
循环。 - 建议缩写:
fori
(或您截图中的iter
) - 描述:
for item in iterable:
循环 - 模板文本:
1
2for $ITEM$ in $ITERABLE$:
$CURSOR$ - 主要占位符说明:
$ITEM$
: 循环中每次迭代的元素变量名。$ITERABLE$
: 要遍历的序列或可迭代对象。$CURSOR$
: 模板展开后光标的初始位置。
b. for...in enumerate
循环 (带索引遍历)
- 模板用途: 快速生成一个同时遍历索引和元素的
for
循环。 - 建议缩写:
forenum
(或您截图中的itere
) - 描述:
for index, item in enumerate(iterable):
循环 - 模板文本:
1
2for $INDEX$, $ITEM$ in enumerate($ITERABLE$):
$CURSOR$ - 主要占位符说明:
$INDEX$
: 循环中每次迭代的索引变量名。$ITEM$
: 循环中每次迭代的元素变量名。$ITERABLE$
: 要遍历的序列或可迭代对象。
c. for...in range
循环 (按次数)
- 模板用途: 快速生成一个按指定次数执行的
for
循环。 - 建议缩写:
forr
- 描述:
for i in range(count):
循环 - 模板文本:
1
2for $VAR$ in range($COUNT$):
$CURSOR$ - 主要占位符说明:
$VAR$
: 循环计数变量名 (通常是i
)。$COUNT$
: 循环的次数。
2. 条件判断
a. if
语句
- 模板用途: 快速生成一个基本的
if
条件判断语句。 - 建议缩写:
ifc
- 描述:
if condition:
语句 - 模板文本:
1
2if $CONDITION$:
$CURSOR$ - 主要占位符说明:
$CONDITION$
:if
语句的条件表达式。$CURSOR$
: 光标位于if
代码块内部。
b. if-else
语句
- 模板用途: 快速生成
if-else
条件判断结构。 - 建议缩写:
ifel
- 描述:
if condition: ... else: ...
语句 - 模板文本:
1
2
3
4
5if $CONDITION$:
$ACTION_IF_TRUE$
else:
$ACTION_IF_FALSE$
$CURSOR$ - 主要占位符说明:
$CONDITION$
,$ACTION_IF_TRUE$
,$ACTION_IF_FALSE$
,$CURSOR$
。
c. if-elif-else
语句
- 模板用途: 快速生成
if-elif-else
多条件判断结构。 - 建议缩写:
ifelifel
- 描述:
if cond1: ... elif cond2: ... else: ...
语句 - 模板文本:
1
2
3
4
5
6
7if $CONDITION1$:
$ACTION1$
elif $CONDITION2$:
$ACTION2$
else:
$ACTION_ELSE$
$CURSOR$ - 主要占位符说明:
$CONDITION1$
,$ACTION1$
,$CONDITION2$
,$ACTION2$
,$ACTION_ELSE$
,$CURSOR$
。
3. 打印与日志
a. print(f"...")
(f-string 打印)
- 模板用途: 快速生成一个使用 f-string 格式化的
print
语句。 - 建议缩写:
prf
- 描述:
print(f"...")
语句 - 模板文本:
1
print(f"$CURSOR$")
- 主要占位符说明:
$CURSOR$
: 光标直接定位在 f-string 的引号内。
b. logger.info
(快速日志记录 - 假设 logger
对象已配置)
- 模板用途: 快速插入一条
logger.info
日志记录。 - 建议缩写:
logi
- 描述:
logger.info(f"...")
- 模板文本:
1
2logger.info(f"$MESSAGE$")
$CURSOR$ - 主要占位符说明:
$MESSAGE$
,$CURSOR$
。 (类似地,可以为debug
,warning
,error
,exception
创建模板)
4. Python 结构与定义
- 模板用途: 快速生成一个带类型注解和文档字符串的函数定义。
- 建议缩写:
defn
- 描述: 带类型注解和文档字符串的函数定义
- 模板文本:
1
2
3
4def $FUNCTION_NAME$($PARAMS$) -> $RETURN_TYPE$:
"""$DOCSTRING$"""
$CURSOR$
return $RETURN_VALUE$ - 主要占位符说明:
$FUNCTION_NAME$
,$PARAMS$
,$RETURN_TYPE$
(可默认为None
),$DOCSTRING$
,$CURSOR$
,$RETURN_VALUE$
(可默认为None
)。
c. 类定义 (基本结构)
- 模板用途: 快速生成一个带
__init__
方法的类定义。 - 建议缩写:
cls
- 描述: 基本类定义 (含
__init__
) - 模板文本:
1
2
3
4
5
6
7
8
9
10
11class $ClassName$:
"""$CLASS_DOCSTRING$"""
def __init__(self, $ARGS$):
"""初始化 $ClassName$ 对象。
Args:
$ARGS_DOC$
"""
$INIT_BODY$
$CURSOR$ - 主要占位符说明:
$ClassName$
,$CLASS_DOCSTRING$
,$ARGS$
,$ARGS_DOC$
,$INIT_BODY$
,$CURSOR$
.
d. @dataclass
类定义
- 模板用途: 快速生成一个使用
dataclasses
模块定义的类。 - 建议缩写:
dtcls
- 描述:
@dataclass
类定义 - 模板文本:
1
2
3
4
5
6
7from dataclasses import dataclass
class $ClassName$:
"""表示 $ENTITY_DESCRIPTION$ 的数据类。"""
$FIELD_NAME$: $FIELD_TYPE$
$CURSOR$ - 主要占位符说明:
$ClassName$
,$ENTITY_DESCRIPTION$
,$FIELD_NAME$
,$FIELD_TYPE$
,$CURSOR$
.
5. 异常处理
a. try-except
基本块
- 模板用途: 快速生成一个基本的
try-except
异常处理块。 - 建议缩写:
tryex
- 描述:
try...except Exception as e:
块 - 模板文本:
1
2
3
4
5
6try:
$TRY_BODY$
except $EXCEPTION_TYPE$ as e:
# logger.exception(f"An error occurred: {e}") # 如果使用日志
print(f"An error occurred ($EXCEPTION_TYPE$): {e}") # 简单打印
$CURSOR$ - 主要占位符说明:
$TRY_BODY$
,$EXCEPTION_TYPE$
(可默认为Exception
),$CURSOR$
.
b. try-except-else-finally
完整块
- 模板用途: 快速生成包含
else
和finally
子句的try-except
块。 - 建议缩写:
tryexelfi
- 描述:
try...except...else...finally:
块 - 模板文本:
1
2
3
4
5
6
7
8
9
10
11
12try:
$TRY_BODY$
except $EXCEPTION_TYPE$ as e:
print(f"An error occurred ($EXCEPTION_TYPE$): {e}")
$EXCEPT_BODY$
else:
print("Operation successful, no exceptions.")
$ELSE_BODY$
finally:
print("Executing finally block.")
$FINALLY_BODY$
$CURSOR$ - 主要占位符说明:
$TRY_BODY$
,$EXCEPTION_TYPE$
,$EXCEPT_BODY$
,$ELSE_BODY$
,$FINALLY_BODY$
,$CURSOR$
.
6. 文件操作
a. with open(...)
上下文管理器
- 模板用途: 快速生成使用
with
语句安全打开和操作文件的代码。 - 建议缩写:
fwith
- 描述:
with open(...) as f:
(安全文件操作) - 模板文本:
1
2
3
4
5
6
7
8try:
with open("$FILEPATH$", mode="$MODE$", encoding="utf-8") as $VARNAME$:
$CURSOR$
# content = $VARNAME$.read()
except FileNotFoundError:
print(f"Error: File '$FILEPATH$' not found.")
except IOError as e:
print(f"Error reading/writing file '$FILEPATH$': {e}") - 主要占位符说明:
$FILEPATH$
,$MODE$
(可默认为'r'
),$VARNAME$
(可默认为f
),$CURSOR$
.
7. 推导式
a. 列表推导式 (List Comprehension)
模板用途: 快速生成列表推导式。
建议缩写:
lc
(或您截图中的compl
/compli
for with if)描述:
[expr for item in iterable if condition]
模板文本 (带if):
1
2[$EXPRESSION$ for $ITEM$ in $ITERABLE$ if $CONDITION$]
$CURSOR$模板文本 (不带if):
1
2[$EXPRESSION$ for $ITEM$ in $ITERABLE$]
$CURSOR$主要占位符说明:
$EXPRESSION$
,$ITEM$
,$ITERABLE$
,$CONDITION$
(可选)。
b. 字典推导式 (Dictionary Comprehension)
- 模板用途: 快速生成字典推导式。
- 建议缩写:
dc
(或您截图中的compd
/compdi
for with if) - 描述:
{key_expr: val_expr for item in iterable if condition}
- 模板文本 (带if):
1
2{$KEY_EXPRESSION$: $VALUE_EXPRESSION$ for $ITEM$ in $ITERABLE$ if $CONDITION$}
$CURSOR$ - 模板文本 (不带if):
1
2{$KEY_EXPRESSION$: $VALUE_EXPRESSION$ for $ITEM$ in $ITERABLE$}
$CURSOR$ - 主要占位符说明:
$KEY_EXPRESSION$
,$VALUE_EXPRESSION$
,$ITEM$
,$ITERABLE$
,$CONDITION$
(可选)。
8. 其他
a. lambda
匿名函数
- 模板用途: 快速创建一个简单的
lambda
函数。 - 建议缩写:
lam
- 描述:
lambda arguments: expression
- 模板文本:
1
2$LAMBDA_VAR$ = lambda $ARGUMENTS$: $EXPRESSION$
$CURSOR$ - 主要占位符说明:
$LAMBDA_VAR$
,$ARGUMENTS$
,$EXPRESSION$
.
b. 注释标记
- 模板用途: 快速插入标准的 TODO, FIXME, NOTE 注释。
- 建议缩写:
todo
/fixme
/note
- 描述:
# TODO: ...
/# FIXME: ...
/# NOTE: ...
- 模板文本 (以
todo
为例):1
2# TODO ($USER$ @ $DATE$): $MESSAGE$
$CURSOR$ - 主要占位符说明:
$USER$
(IDE或可配置),$DATE$
(IDE或可配置),$MESSAGE$
.