首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python错误即特性:7种常见错误助你精进编程技能

Python已成为许多数据专业人士处理数据和进行机器学习的主要工具,因为它易于上手。该编程语言几乎已成为数据社区的黄金标准。

如果你已经熟悉Python,那么在编写语法错误或违反Python规则时,经常会遇到错误信息。这是Python设计哲学的一部分,强调错误需要被显式地展示,遵循“先执行后请求原谅”(EAFP, Easier to Ask Forgiveness than Permission)的原则,即让你先执行代码,再判断是否出错。

需要注意的是,部分Python错误并不是“漏洞”,而是帮助用户提升Python技能的特性。如果我们有意识地将这些错误作为工作指导,理解这些错误就变得至关重要。为帮助学习,本文将探讨7种作为特性的Python错误。

让我们开始吧。

1. 语法错误(Syntax Error)

当Python解析器遇到不符合Python语法逻辑的无效代码时,就会引发语法错误。任何不规范的代码都会被显示为错误,这也是Python设计中的一项基本特性。来看下面的示例代码:

if True print("hello")

上面的代码会抛出如下语法错误:

Cell In[6], line 1

  if True print("hello")

          ^

SyntaxError: invalid syntax

该错误表明我们没有遵循Python的语法规范。语法错误的设计是有意为之,它本质上表明对标准的任何偏离都需要被修正。Python不会运行任何不符合语言语法的代码,也不会试图猜测你的意图。

语法错误确保我们的代码始终清晰明确。这对于协作也大有裨益,因为无论在哪里运行Python语言,标准都是一致的。

2. 索引错误(Index Error)

对于使用Python的人来说,我们经常会用到诸如列表(list)或元组(tuple)这样的序列对象。访问这些序列对象中的数据时需要用到索引。

那么,如果我们使用了超出范围的索引会发生什么?Python会抛出错误信息。请看实际代码示例:

lst = [1, 2, 3]

print(lst[5])

上面的代码会抛出如下错误:

IndexError                                Traceback (most recent call last)

Cell In[2], line 2

    1 lst = [1, 2, 3]

----> 2 print(lst[5])

IndexError: list index out of range

此错误为索引错误,提示你索引超出了范围。这种设计是有意的,表明Python不允许静默填充(即在超出边界访问数据时自动用占位符扩展结构)。

如果允许静默填充,可能会引入难以察觉的漏洞,尤其在更复杂的流程中会导致更多问题。例如,循环访问Python序列时,一旦索引超界,循环会被打断;如果没有索引错误,循环就不会终止,可能引发逻辑混乱。

3. 键错误(Key Error)

众所周知,字典对象将键映射到其存储的值。与索引错误类似,当查找的键在字典中不存在时,就会发生键错误。来看Python代码示例:

d = {'a': 1}

print(d['b'])

上述代码会抛出如下错误:

KeyError                                  Traceback (most recent call last)

Cell In[3], line 2

    1 d = {'a': 1}

----> 2 print(d['b'])

KeyError: 'b'

键错误是因为字典中没有‘b’这个键。Python显式抛出该错误,是为了防止在键不存在时静默使用占位值而导致意外行为。

通过键错误,我们可以在访问字典时及时发现语法或逻辑上的错误,而不是去猜测键是否存在。结合try/except语法,还可以在键不存在时创建新键,使编程更具灵活性。

4. 名称错误(Name Error)

名称错误发生在调用一个未被定义的变量时。还有一种类似的错误叫做Unbound Local Error(未绑定本地错误),是名称错误的子类,指在函数内部访问一个尚未被赋值的本地变量。请看如下代码:

print(x)

输出如下错误:

NameError                                 Traceback (most recent call last)

Cell In[5], line 1

----> 1 print(x)

NameError: name 'x' is not defined

出现该错误是因为‘x’变量尚未定义。再看Unbound Local Error的示例:

def foo():

  x = x + 1

foo()

输出如下错误:

Cell In[4], line 2, in foo()

    1 def foo():

----> 2     x = x + 1

UnboundLocalError: cannot access local variable 'x' where it is not associated with a value

这两类错误的产生都是因为需要遵循Python的作用域规则,防止误用未定义的变量。这样的错误设计可以让你及时发现拼写错误或逻辑漏洞,而不是让Python静默创建变量,避免影响程序正常运行。

5. 类型错误(Type Error)

当对对象执行不适用的操作时,会引发类型错误。来看下面的Python代码:

next([1, 2, 3])

会抛出如下错误:

TypeError                                 Traceback (most recent call last)

Cell In[7], line 1

----> 1 next([1, 2, 3])

TypeError: 'list' object is not an iterator

类型错误的原因是不能将一个列表对象直接传递给next函数,next只能用于迭代器对象。

Python的设计鼓励我们以正确的方式使用对象。类型错误有助于防止潜在的隐性漏洞,确保函数按预期工作。

6. 值错误(Value Error)

与类型错误不同,值错误在函数接收到正确类型但不合适的参数值时发生。举例如下:

int("abc")

会抛出如下错误:

ValueError                                Traceback (most recent call last)

Cell In[8], line 1

----> 1 int("abc")

ValueError: invalid literal for int() with base 10: 'abc'

这里,虽然参数类型正确(字符串),但其内容无法转换为整数,因此触发值错误。Python故意显示该错误,而不是忽略或自动填充占位值,以避免干扰后续代码执行。

7. 断言错误(Assertion Error)

断言错误发生在使用assert语句且条件未被满足时。该特性有助于调试和强制程序假设的前提。来看示例代码:

assert 2 + 2 == 5, "It's not right"

会抛出如下错误:

AssertionError                            Traceback (most recent call last)

Cell In[13], line 1

----> 1 assert 2 + 2 == 5, "It's not right"

AssertionError: It's not right

表达式2 + 2 == 5的结果为False,因此触发断言错误。你还可以像上面一样在assert语句中添加详细的错误信息。

断言错误让开发者在调试过程中可以灵活地设定条件,建立错误捕获机制,便于排查问题,并能根据实际需要精细控制断言行为。

结论

Python被大量数据专业人士使用。该语言抛出的许多错误其实是特性。我们需要时刻关注这些错误,通过查看回溯栈追踪问题。

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OG0zd_2C3P11JSKiuRMWTFcQ0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券