Python字符串前缀使用方法技巧总结

作者:

文章目录
  • f-string 是 Python 3.6+ 引入的字符串格式化方法,性能好且易读。
  • r-string 防止转义字符被处理,常用于文件路径、正则表达式等。
  • b-string 用于处理二进制数据。
  • 在 Python 3 中,所有字符串默认都是 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 转义序列 unicode_escape = u”u4e2du6587″ # 中文 print(unicode_escape) # 中文
  • import timeit def performance_comparison(): “””不同字符串格式化方法的性能比较””” name = “Alice” age = 25 score = 95.5 # 测试不同的格式化方法 tests = { “f-string”: ‘f”姓名: {name}, 年龄: {age}, 分数: {score:.1f}”‘, “format()”: ‘”姓名: {}, 年龄: {}, 分数: {:.1f}”.format(name, age, score)’, “% 格式化”: ‘”姓名: %s, 年龄: %d, 分数: %.1f” % (name, age, score)’ } print(“性能比较 (执行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()
  • 到此这篇关于Python字符串前缀使用方法技巧的文章就介绍到这了,更多相关Python字符串前缀使用内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客! 您可能感兴趣的文章: Python实现查找字符串数组最长公共前缀示例 python 实现求解字符串集的最长公共前缀方法 Python求一批字符串的最长公共前缀算法示例
  • 目录
    • 1. f-string (格式化字符串)
      • 基础用法
      • 格式化选项
      • 高级技巧
    • 2. r-string (原始字符串)
      • 基础用法
      • 实际应用
      • 注意事项
    • 3. b-string (字节字符串)
      • 基础用法
      • 实际应用
    • 4. u-string (Unicode 字符串)
      • 5. 组合使用前缀
        • fr-string (原始格式化字符串)
        • 其他组合
      • 6. 实际应用案例
        • 配置文件处理
        • 路径构建工具
        • 数据序列化
      • 7. 性能比较
        • 8. 最佳实践
          • 选择合适的前缀
          • 错误处理
        • 总结 

          Python 字符串前缀(f, r, b, u 等)提供了强大的字符串处理能力。下面详细讲解各种前缀的用法和技巧。

          f-string 是 Python 3.6+ 引入的字符串格式化方法,性能好且易读。

          # 基本变量插入
          name = "Alice"
          age = 25
          print(f"姓名: {name}, 年龄: {age}")  # 姓名: Alice, 年龄: 25
          
          # 表达式计算
          a, b = 5, 3
          print(f"{a} + {b} = {a + b}")  # 5 + 3 = 8
          print(f"{a} 的平方是 {a ** 2}")  # 5 的平方是 25
          
          # 方法调用
          text = "hello world"
          print(f"大写: {text.upper()}")  # 大写: HELLO WORLD

          # 数字格式化
          pi = 3.1415926535
          print(f"π ≈ {pi:.2f}")        # π ≈ 3.14
          print(f"π ≈ {pi:8.3f}")       # π ≈    3.142
          print(f"整数: {age:04d}")      # 整数: 0025
          
          # 百分比
          score = 0.856
          print(f"正确率: {score:.1%}")  # 正确率: 85.6%
          
          # 科学计数法
          large_num = 123456789
          print(f"科学计数: {large_num:.2e}")  # 科学计数: 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"结果: {value:{width}.{precision}}")  # 结果:     12.35
          
          # 多行 f-string
          message = f"""
          用户信息:
            姓名: {name}
            年龄: {age}
            分数: {score:.1%}
          """
          print(message)
          
          # 条件表达式
          is_admin = True
          print(f"权限: {'管理员' if is_admin else '普通用户'}")  # 权限: 管理员

          r-string 防止转义字符被处理,常用于文件路径、正则表达式等。

          # 普通字符串中的转义问题
          print("C:newfolder")  
          # 输出:
          # C:
          # ew
          # older
          
          # 使用原始字符串
          print(r"C:newfolder")  # C:newfolder
          
          # 正则表达式中的使用
          import re
          pattern = r"d{3}-d{4}"  # 匹配电话号码
          text = "电话: 123-4567"
          match = re.search(pattern, text)
          print(match.group() if match else "未匹配")  # 123-4567

          # 文件路径处理
          import os
          
          # 不使用原始字符串(容易出错)
          path1 = "C:\Users\Alice\Documents\file.txt"
          # 使用原始字符串(更清晰)
          path2 = r"C:UsersAliceDocumentsfile.txt"
          
          print(f"路径1: {path1}")
          print(f"路径2: {path2}")
          
          # Windows 路径处理
          folder = r"C:Program FilesMyApp"
          filename = "config.ini"
          full_path = os.path.join(folder, filename)
          print(f"完整路径: {full_path}")
          
          # 正则表达式模式
          email_pattern = r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}$"
          url_pattern = r"https?://(?:[-w.]|(?:%[da-fA-F]{2}))+"

          # 原始字符串的局限性
          # print(r"末尾不能有单个反斜杠")  # 语法错误
          print(r"可以有两个反斜杠\")     # 可以有两个反斜杠\
          print(r"但这样没问题 ")         # 但这样没问题 
          
          # 混合使用技巧
          base_path = r"C:UsersAlice"
          file_name = "document.txt"
          full_path = fr"{base_path}{file_name}"  # 原始格式化字符串
          print(full_path)  # C:UsersAlicedocument.txt

          b-string 用于处理二进制数据。

          # 创建字节字符串
          byte_data = b"hello world"
          print(byte_data)           # b'hello world'
          print(type(byte_data))     # <class 'bytes'>
          
          # 字节与整数的关系
          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'xe4xb8xadxe6x96x87'

          # 文件读写
          # 写入二进制数据
          with open('binary_file.bin', 'wb') as f:
              f.write(b'x00x01x02x03x04')
          
          # 读取二进制数据
          with open('binary_file.bin', 'rb') as f:
              data = f.read()
              print(f"读取的数据: {data}")  # b'x00x01x02x03x04'
          
          # 网络编程
          import socket
          
          # 模拟网络数据包
          packet_header = b"PKT"
          packet_data = b"payload data"
          full_packet = packet_header + b"x00" + packet_data
          print(f"完整数据包: {full_packet}")
          
          # 编码解码
          text = "Hello 世界"
          encoded = text.encode('utf-8')  # 字符串转字节
          decoded = encoded.decode('utf-8')  # 字节转字符串
          print(f"编码后: {encoded}")
          print(f"解码后: {decoded}")

          在 Python 3 中,所有字符串默认都是 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 转义序列
          unicode_escape = u"u4e2du6587"  # 中文
          print(unicode_escape)  # 中文

          # 处理包含反斜杠的格式化字符串
          username = "Alice"
          file_path = fr"C:Users{username}Documentsfile.txt"
          print(file_path)  # C:UsersAliceDocumentsfile.txt
          
          # 正则表达式模板
          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

          # 字节格式化 (Python 3.5+)
          name = b"Alice"
          age = 25
          # 注意:字节字符串的 f-string 有限制
          message = b"Name: " + name + b", Age: " + str(age).encode()
          print(message)  # b'Name: Alice, Age: 25'

          def create_config_template():
              """创建配置文件模板"""
              
              database_host = "localhost"
              database_port = 5432
              log_path = r"C:AppLogs"
              
              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())

          class PathBuilder:
              """路径构建工具类"""
              
              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:MyAppconfig.ini
          print(builder.subfolder_path("logs", "app.log"))  # C:MyApplogsapp.log

          def serialize_data(data):
              """序列化数据为字节格式"""
              
              header = b"DATA"
              version = b"x01x00"
              
              # 将数据转换为字节
              if isinstance(data, str):
                  content = data.encode('utf-8')
              elif isinstance(data, int):
                  content = str(data).encode('utf-8')
              else:
                  content = bytes(data)
              
              # 构建完整数据包
              packet = header + version + len(content).to_bytes(4, 'big') + content
              return packet
          
          def deserialize_data(packet):
              """从字节数据反序列化"""
              if packet[:4] != b"DATA":
                  raise ValueError("无效的数据格式")
              
              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}")

          import timeit
          
          def performance_comparison():
              """不同字符串格式化方法的性能比较"""
              
              name = "Alice"
              age = 25
              score = 95.5
              
              # 测试不同的格式化方法
              tests = {
                  "f-string": 'f"姓名: {name}, 年龄: {age}, 分数: {score:.1f}"',
                  "format()": '"姓名: {}, 年龄: {}, 分数: {:.1f}".format(name, age, score)',
                  "% 格式化": '"姓名: %s, 年龄: %d, 分数: %.1f" % (name, age, score)'
              }
              
              print("性能比较 (执行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()

          def string_prefix_guidelines():
              """字符串前缀选择指南"""
              
              guidelines = {
                  "f-string": [
                      "需要插入变量或表达式时",
                      "性能要求高的场景",
                      "代码可读性重要的地方"
                  ],
                  "r-string": [
                      "正则表达式模式",
                      "Windows 文件路径",
                      "包含大量反斜杠的字符串"
                  ],
                  "b-string": [
                      "处理二进制数据",
                      "网络通信",
                      "文件 I/O 操作"
                  ],
                  "组合前缀": [
                      "fr: 需要原始字符串和变量插值",
                      "根据实际需求灵活组合"
                  ]
              }
              
              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:
                  # 可能引发异常的表达
                  result = f"计算: {1/0}"
              except ZeroDivisionError:
                  result = "计算: 错误"
              print(result)
              
              # 字节字符串的编码处理
              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()

          到此这篇关于Python字符串前缀使用方法技巧的文章就介绍到这了,更多相关Python字符串前缀使用内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!

          您可能感兴趣的文章:

          • Python实现查找字符串数组最长公共前缀示例
          • python 实现求解字符串集的最长公共前缀方法
          • Python求一批字符串的最长公共前缀算法示例

          站内搜索