Python字符串前綴使用方法技巧總結(jié)
Python 字符串前綴(f, r, b, u 等)提供了強(qiáng)大的字符串處理能力。下面詳細(xì)講解各種前綴的用法和技巧。
1. f-string (格式化字符串)
f-string 是 Python 3.6+ 引入的字符串格式化方法,性能好且易讀。
基礎(chǔ)用法
# 基本變量插入
name = "Alice"
age = 25
print(f"姓名: {name}, 年齡: {age}") # 姓名: Alice, 年齡: 25
# 表達(dá)式計算
a, b = 5, 3
print(f"{a} + = {a + b}") # 5 + 3 = 8
print(f"{a} 的平方是 {a ** 2}") # 5 的平方是 25
# 方法調(diào)用
text = "hello world"
print(f"大寫: {text.upper()}") # 大寫: HELLO WORLD格式化選項(xiàng)
# 數(shù)字格式化
pi = 3.1415926535
print(f"π ≈ {pi:.2f}") # π ≈ 3.14
print(f"π ≈ {pi:8.3f}") # π ≈ 3.142
print(f"整數(shù): {age:04d}") # 整數(shù): 0025
# 百分比
score = 0.856
print(f"正確率: {score:.1%}") # 正確率: 85.6%
# 科學(xué)計數(shù)法
large_num = 123456789
print(f"科學(xué)計數(shù): {large_num:.2e}") # 科學(xué)計數(shù): 1.23e+08高級技巧
# 字典和對象訪問
person = {"name": "Bob", "age": 30}
print(f"姓名: {person['name']}, 年齡: {person['age']}")
class User:
def __init__(self, name, level):
self.name = name
self.level = level
user = User("Charlie", 5)
print(f"用戶: {user.name}, 等級: {user.level}")
# 嵌套 f-string
width = 10
precision = 4
value = 12.34567
print(f"結(jié)果: {value:{width}.{precision}}") # 結(jié)果: 12.35
# 多行 f-string
message = f"""
用戶信息:
姓名: {name}
年齡: {age}
分?jǐn)?shù): {score:.1%}
"""
print(message)
# 條件表達(dá)式
is_admin = True
print(f"權(quán)限: {'管理員' if is_admin else '普通用戶'}") # 權(quán)限: 管理員2. r-string (原始字符串)
r-string 防止轉(zhuǎn)義字符被處理,常用于文件路徑、正則表達(dá)式等。
基礎(chǔ)用法
# 普通字符串中的轉(zhuǎn)義問題
print("C:\new\folder")
# 輸出:
# C:
# ew
# older
# 使用原始字符串
print(r"C:\new\folder") # C:\new\folder
# 正則表達(dá)式中的使用
import re
pattern = r"\d{3}-\d{4}" # 匹配電話號碼
text = "電話: 123-4567"
match = re.search(pattern, text)
print(match.group() if match else "未匹配") # 123-4567實(shí)際應(yīng)用
# 文件路徑處理
import os
# 不使用原始字符串(容易出錯)
path1 = "C:\\Users\\Alice\\Documents\\file.txt"
# 使用原始字符串(更清晰)
path2 = r"C:\Users\Alice\Documents\file.txt"
print(f"路徑1: {path1}")
print(f"路徑2: {path2}")
# Windows 路徑處理
folder = r"C:\Program Files\MyApp"
filename = "config.ini"
full_path = os.path.join(folder, filename)
print(f"完整路徑: {full_path}")
# 正則表達(dá)式模式
email_pattern = r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$"
url_pattern = r"https?://(?:[-\w.]|(?:%[\da-fA-F]{2}))+"注意事項(xiàng)
# 原始字符串的局限性
# print(r"末尾不能有單個反斜杠\") # 語法錯誤
print(r"可以有兩個反斜杠\\") # 可以有兩個反斜杠\\
print(r"但這樣沒問題\ ") # 但這樣沒問題\
# 混合使用技巧
base_path = r"C:\Users\Alice"
file_name = "document.txt"
full_path = fr"{base_path}\{file_name}" # 原始格式化字符串
print(full_path) # C:\Users\Alice\document.txt3. b-string (字節(jié)字符串)
b-string 用于處理二進(jìn)制數(shù)據(jù)。
基礎(chǔ)用法
# 創(chuàng)建字節(jié)字符串
byte_data = b"hello world"
print(byte_data) # b'hello world'
print(type(byte_data)) # <class 'bytes'>
# 字節(jié)與整數(shù)的關(guān)系
for byte in b"ABC":
print(byte, chr(byte))
# 65 A
# 66 B
# 67 C
# 只能包含 ASCII 字符
# b"中文" # 語法錯誤,需要使用編碼
chinese_bytes = "中文".encode('utf-8')
print(chinese_bytes) # b'\xe4\xb8\xad\xe6\x96\x87'實(shí)際應(yīng)用
# 文件讀寫
# 寫入二進(jìn)制數(shù)據(jù)
with open('binary_file.bin', 'wb') as f:
f.write(b'\x00\x01\x02\x03\x04')
# 讀取二進(jìn)制數(shù)據(jù)
with open('binary_file.bin', 'rb') as f:
data = f.read()
print(f"讀取的數(shù)據(jù): {data}") # b'\x00\x01\x02\x03\x04'
# 網(wǎng)絡(luò)編程
import socket
# 模擬網(wǎng)絡(luò)數(shù)據(jù)包
packet_header = b"PKT"
packet_data = b"payload data"
full_packet = packet_header + b"\x00" + packet_data
print(f"完整數(shù)據(jù)包: {full_packet}")
# 編碼解碼
text = "Hello 世界"
encoded = text.encode('utf-8') # 字符串轉(zhuǎn)字節(jié)
decoded = encoded.decode('utf-8') # 字節(jié)轉(zhuǎn)字符串
print(f"編碼后: {encoded}")
print(f"解碼后: {decoded}")4. u-string (Unicode 字符串)
在 Python 3 中,所有字符串默認(rèn)都是 Unicode,u 前綴主要用于兼容 Python 2。
# Python 3 中 u 前綴是可選的 unicode_str1 = u"Hello 世界" unicode_str2 = "Hello 世界" # 效果相同 print(unicode_str1) # Hello 世界 print(unicode_str2) # Hello 世界 print(unicode_str1 == unicode_str2) # True # 處理特殊 Unicode 字符 emoji_str = u"Python is fun! ????" print(emoji_str) # Python is fun! ???? # Unicode 轉(zhuǎn)義序列 unicode_escape = u"\u4e2d\u6587" # 中文 print(unicode_escape) # 中文
5. 組合使用前綴
fr-string (原始格式化字符串)
# 處理包含反斜杠的格式化字符串
username = "Alice"
file_path = fr"C:\Users\{username}\Documents\file.txt"
print(file_path) # C:\Users\Alice\Documents\file.txt
# 正則表達(dá)式模板
base_pattern = r"\d{3}"
full_pattern = fr"{base_pattern}-\d{4}"
text = "電話號碼: 123-4567"
match = re.search(full_pattern, text)
print(match.group() if match else "未匹配") # 123-4567其他組合
# 字節(jié)格式化 (Python 3.5+) name = b"Alice" age = 25 # 注意:字節(jié)字符串的 f-string 有限制 message = b"Name: " + name + b", Age: " + str(age).encode() print(message) # b'Name: Alice, Age: 25'
6. 實(shí)際應(yīng)用案例
配置文件處理
def create_config_template():
"""創(chuàng)建配置文件模板"""
database_host = "localhost"
database_port = 5432
log_path = r"C:\App\Logs"
config_template = f"""
[database]
host = {database_host}
port = {database_port}
username = admin
password = secret
[logging]
path = {log_path}
level = INFO
"""
return config_template
print(create_config_template())路徑構(gòu)建工具
class PathBuilder:
"""路徑構(gòu)建工具類"""
def __init__(self, base_path):
self.base_path = base_path
def file_path(self, filename):
return fr"{self.base_path}\{filename}"
def subfolder_path(self, folder_name, filename):
return fr"{self.base_path}\{folder_name}\{filename}"
# 使用示例
builder = PathBuilder(r"C:\MyApp")
print(builder.file_path("config.ini")) # C:\MyApp\config.ini
print(builder.subfolder_path("logs", "app.log")) # C:\MyApp\logs\app.log數(shù)據(jù)序列化
def serialize_data(data):
"""序列化數(shù)據(jù)為字節(jié)格式"""
header = b"DATA"
version = b"\x01\x00"
# 將數(shù)據(jù)轉(zhuǎn)換為字節(jié)
if isinstance(data, str):
content = data.encode('utf-8')
elif isinstance(data, int):
content = str(data).encode('utf-8')
else:
content = bytes(data)
# 構(gòu)建完整數(shù)據(jù)包
packet = header + version + len(content).to_bytes(4, 'big') + content
return packet
def deserialize_data(packet):
"""從字節(jié)數(shù)據(jù)反序列化"""
if packet[:4] != b"DATA":
raise ValueError("無效的數(shù)據(jù)格式")
content_length = int.from_bytes(packet[6:10], 'big')
content = packet[10:10+content_length]
try:
return content.decode('utf-8')
except UnicodeDecodeError:
return content
# 測試
original_data = "Hello, 世界!"
serialized = serialize_data(original_data)
print(f"序列化: {serialized}")
deserialized = deserialize_data(serialized)
print(f"反序列化: {deserialized}")7. 性能比較
import timeit
def performance_comparison():
"""不同字符串格式化方法的性能比較"""
name = "Alice"
age = 25
score = 95.5
# 測試不同的格式化方法
tests = {
"f-string": 'f"姓名: {name}, 年齡: {age}, 分?jǐn)?shù): {score:.1f}"',
"format()": '"姓名: {}, 年齡: {}, 分?jǐn)?shù): {:.1f}".format(name, age, score)',
"% 格式化": '"姓名: %s, 年齡: %d, 分?jǐn)?shù): %.1f" % (name, age, score)'
}
print("性能比較 (執(zhí)行100,000次):")
for name, code in tests.items():
time_taken = timeit.timeit(code, globals=globals(), number=100000)
print(f" {name}: {time_taken:.4f} 秒")
performance_comparison()8. 最佳實(shí)踐
選擇合適的前綴
def string_prefix_guidelines():
"""字符串前綴選擇指南"""
guidelines = {
"f-string": [
"需要插入變量或表達(dá)式時",
"性能要求高的場景",
"代碼可讀性重要的地方"
],
"r-string": [
"正則表達(dá)式模式",
"Windows 文件路徑",
"包含大量反斜杠的字符串"
],
"b-string": [
"處理二進(jìn)制數(shù)據(jù)",
"網(wǎng)絡(luò)通信",
"文件 I/O 操作"
],
"組合前綴": [
"fr: 需要原始字符串和變量插值",
"根據(jù)實(shí)際需求靈活組合"
]
}
return guidelines
# 打印指南
for prefix, uses in string_prefix_guidelines().items():
print(f"{prefix}:")
for use_case in uses:
print(f" - {use_case}")錯誤處理
def safe_string_operations():
"""安全的字符串操作"""
# f-string 中的錯誤處理
try:
# 可能引發(fā)異常的表達(dá)
result = f"計算: {1/0}"
except ZeroDivisionError:
result = "計算: 錯誤"
print(result)
# 字節(jié)字符串的編碼處理
text = "特殊字符: ?, é, 中文"
try:
# 嘗試 ASCII 編碼(會失?。?
ascii_bytes = text.encode('ascii')
except UnicodeEncodeError:
# 回退到 UTF-8
utf8_bytes = text.encode('utf-8', errors='replace')
print(f"UTF-8 編碼: {utf8_bytes}")
# 路徑安全處理
import os
user_input = "some_file.txt"
# 不安全的方式
# unsafe_path = fr"C:\Program Files\{user_input}"
# 安全的方式
safe_path = os.path.join(r"C:\Program Files", user_input)
print(f"安全路徑: {safe_path}")
safe_string_operations()總結(jié)
到此這篇關(guān)于Python字符串前綴使用方法技巧的文章就介紹到這了,更多相關(guān)Python字符串前綴使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
用Python從零實(shí)現(xiàn)貝葉斯分類器的機(jī)器學(xué)習(xí)的教程
這篇文章主要介紹了用Python從零實(shí)現(xiàn)貝葉斯分類器的教程,樸素貝葉斯算法屬于機(jī)器學(xué)習(xí)中的基礎(chǔ)內(nèi)容、實(shí)用而高效,本文詳細(xì)展示了用Python語言實(shí)現(xiàn)的步驟,需要的朋友可以參考下2015-03-03
使用實(shí)現(xiàn)python連接hive數(shù)倉的示例代碼
這篇文章主要為大家詳細(xì)介紹了使用實(shí)現(xiàn)python連接hive數(shù)倉的相關(guān)知識,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-03-03
Python數(shù)學(xué)建模庫StatsModels統(tǒng)計回歸簡介初識
這篇文章主要為大家介紹了Python數(shù)學(xué)建模庫StatsModels統(tǒng)計回歸的基本概念,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝打擊多多進(jìn)步2021-10-10
Python實(shí)現(xiàn)一個數(shù)組除以一個數(shù)的例子
今天小編就為大家分享一篇Python實(shí)現(xiàn)一個數(shù)組除以一個數(shù)的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07
Django對數(shù)據(jù)庫進(jìn)行添加與更新的例子
今天小編就為大家分享一篇Django對數(shù)據(jù)庫進(jìn)行添加與更新的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07

