关闭

Python 中九个常见字典与异常处理错误与解决方案

发表于:2024-8-29 09:21

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:手把手PythonAI编程    来源:手把手PythonAI编程

  今天,我们将一起发现并解决在使用字典时遇到的15个常见陷阱,让你的编程之旅更加顺畅。
  第一部分:字典基础与常见错误
  1. 创建字典的误解
  错误场景:尝试用列表推导式创建字典时,键重复导致覆盖。
  # 错误示范
  keys = ['a', 'b', 'a']
  values = [1, 2, 3]
  my_dict = {k: v for k, v in zip(keys, values)}
  print(my_dict)  # 输出可能不是预期,因为'a'键被覆盖了
  解决方案:使用collections.defaultdict避免键冲突。
  from collections import defaultdict
  my_dict = defaultdict(list)
  for k, v in zip(keys, values):
      my_dict[k].append(v)
  print(my_dict)  # {'a': [1, 3], 'b': [2]}
  2. 字典访问未初始化键
  错误场景:
  my_dict = {}
  value = my_dict['not_here']  # KeyError
  解决方案:使用get方法安全访问。
  value = my_dict.get('not_here', '默认值')
  print(value)  # 输出 '默认值'
  3. 字典更新时的键冲突
  错误理解:
  dict1 = {'x': 1}
  dict2 = {'x': 2, 'y': 3}
  dict1.update(dict2)
  # 预期dict1中'x'的值不变
  正确做法:更新操作会覆盖键值。
  print(dict1)  # {'x': 2, 'y': 3} 注意'x'的值已被覆盖
  异常处理入门
  4. 不处理异常的危险
  问题:运行时错误未被捕获。
  num = 'one'
  result = num + 1  # TypeError
  引入try-except:
  try:
      result = num + 1
  except TypeError:
      print("不能将字符串与数字相加")
  5. 使用finally清理资源
  无论是否发生异常,finally块都会执行。
  try:
      # 假设这是打开文件的操作
      file = open('example.txt', 'r')
      print(file.read())
  except FileNotFoundError:
      print("文件不存在")
  finally:
      file.close()  # 确保文件被关闭
  第二部分:高级技巧与实战案例
  6. 字典推导式的高级用法
  高级示例:创建一个映射,将字符串转换为它们的长度。
  words = ['apple', 'banana', 'cherry']
  lengths = {word: len(word) for word in words}
  print(lengths)  # {'apple': 5, 'banana': 6, 'cherry': 6}
  7. Python 3.5+:字典解构合并
  新特性:利用解构简化字典合并。
  dict1 = {'x': 1, 'y': 2}
  dict2 = {'y': 3, 'z': 4}
  merged = {**dict1, **dict2}  # Python 3.5+
  print(merged)  # {'x': 1, 'y': 3, 'z': 4}
  8. 异常链:提供更详细的错误信息
  深入异常处理:
  try:
      raise ValueError("Something wrong!")
  except ValueError as ve:
      raise KeyError("This happened because of a value error.") from ve
  这样可以保留原始异常信息,增强调试能力。
  9. 自定义异常
  提升代码质量:
  class CustomError(Exception):
      pass
  try:
      raise CustomError("这是一个自定义错误")
  except CustomError as ce:
      print(ce)
  实战案例:数据分析预处理
  假设我们需要处理一份数据,其中包含一个字典列表,每个字典代表一条记录,但数据不完全或有格式错误。我们的任务是清洗数据,处理缺失值,并捕获任何转换过程中的异常。
  data = [
      {"name": "Alice", "age": 30},
      {"name": "Bob", "missed_age": 25},  # 错误键名
      {"name": "Charlie"},  # 缺失年龄
  ]
  cleaned_data = []
  for record in data:
      try:
          # 确保记录中有'age'键
          age = record.get('age', None)
          if age is None:
              raise ValueError("Age is missing.")
          
          # 正确处理记录
          cleaned_record = {
              "name": record["name"],
              "age": int(age),  # 强制类型转换,可能引发ValueError
          }
          cleaned_data.append(cleaned_record)
      except KeyError as ke:
          print(f"Key error in record: {ke}")
      except ValueError as ve:
          print(f"Value error in record: {ve}")
  print(cleaned_data)
  在这个实战案例中,我们结合了字典操作和异常处理,展示了如何优雅地处理数据清洗过程中常见的问题。通过使用try-except结构,我们能够捕获并妥善处理异常,保证程序的健壮性。
  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2024软件测试行业从业人员调查问卷》,您的见解,行业的声音!

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号