Python花式错误集锦

width="330" height="86" src="//music.163.com/outchain/player?type=3&id=2056760367&auto=1&height=66" border="0">

Python是一门灵活的,有意思的,用途广泛的语言。近些年来,受到越来越多的重视。也有越来越多的人来学习这门语言。于是,问题来了,对于初学者,往往在写代码的过程中,出现这样或那样的错误,导致程序运行报错。这些错误或简单,或复杂,或诡异,或神奇,要么令人抓耳挠腮,要么让人恼羞成怒,要么让人难以忘怀。但是,在学习编程的过程中,就是这些错误让我们成长,让我们逐渐从采坑再爬坑的过程中,感受到编程的魅力。到底有哪些错误呢,请看DE8UG给你带来的"Python花式错误集锦",如果你遇到了Python开发中的错误,从本文搜索关键词并得到解决,那是我的荣幸。语法错误篇缩进IndentationError这是在复制粘贴代码,或者不熟悉Python代码结构时候,经常范的错误。Python中要求同一逻辑的代码块使用同样的缩进(常用4个空格)。看这段:def test():
a = 1
b = 2
return a + b运行后,立马报错 File “”, line 4
return a + b
^
IndentationError: unindent does not match any outer indentation level解决方法,很简单,把缩进调整为统一的4个空格就好。标点符号SyntaxError这里情况就比较多了,常见的为冒号错误逗号错误小括号缺失或不匹配来看看具体错误样式def test():
pass

File “”, line 1
def test():
^
SyntaxError: invalid character in identifier

print(1,2,3,4,5,6)
File “”, line 1
print(1,2,3,4,5,6)
^
SyntaxError: invalid character in identifier

def test_a(a):
return a * 2

def test_b(b):
return b + 3

def test_c©:
return c - 4

x = 5
test_c(test_b(test_a))

TypeError Traceback (most recent call last)
in ()
9
10 x = 5
—> 11 test_c(test_b(test_a))

in test_b(b)
3
4 def test_b(b):
----> 5 return b + 3
6
7 def test_c©:

TypeError: unsupported operand type(s) for +: ‘function’ and ‘int’

还可能这样

test_c(test_b(test_a())

File “”, line 11
test_c(test_b(test_a())
^
SyntaxError: unexpected EOF while parsing
修改方式很简单,代码里的标点符号都是英文,出现语法错误好好检查看看标点符号的宽度,我的简单记法是中文的都比较胖,英文的都是瘦子。另外,对于括号的问题,首先是要英文,其次呢写的时候,养成一种上来先把成对()写好的习惯,然后再填内容。变量应用篇命名错误最需要禁止的是使用Python自带的关键词来命名,比如list,dict等,会导致类型错误。a = (2,5,8)
a_list = list(a) # 第一次可以用list转换
list = list(a) # 如果把list当作变量名,会引起后续代码再用list转换时候报错
b = (3,5,7)
b_list = list(b)
TypeError Traceback (most recent call last)
in ()
1 b = (3,5,7)
----> 2 b_list = list(b)

TypeError: ‘list’ object is not callable
2b = c
File “”, line 1
2b = c
^
SyntaxError: invalid syntax

a-2 = 1
File “”, line 1
a-2 = 1
^
SyntaxError: can’t assign to operator命名时候,建议使用下划线_连字符,或者theName,或者TheName这种首字母大写的驼峰法。
而且,不建议使用0(数字零)或者l(小写的L)来命名,否则容易引起下面的使用错误。使用错误这里最常见的是使用容易混淆的字母来命名,造成似乎用时候出错,或者是使用时候完全用错了变量。name_l = ‘de8ug’
print(name_1)
NameError Traceback (most recent call last)
in ()
1 name_l = ‘de8ug’
----> 2 print(name_1)

NameError: name ‘name_1’ is not defined

name_0 = ‘de8ug’
print(name_o)

NameError Traceback (most recent call last)
in ()
1 name_0 = ‘de8ug’
----> 2 print(name_o)

name = ‘de8ug’
print(f’name’)
print(f’{de8ug}’)
print(f’{name}’)
NameError Traceback (most recent call last)
in ()
1 name = ‘de8ug’
2 print(f’name’)
----> 3 print(f’{de8ug}’)
4 print(f’{name}’)

NameError: name ‘de8ug’ is not defined
编码错误篇Python3中,最常见的编码错误是在网络应用中,有时候得到的数据是bytes,但是我们实际需要str,这时候就需要转换编码。这里需要注意bytes和str的转换,其中 encoding='utf-8’是默认的参数name = “de8ug”
print(type(name)) # str
print(type(name.encode())) # bytes, S.encode(encoding=‘utf-8’, errors=‘strict’) -> bytes

name = b"de8ug"
print(type(name)) # bytes
print(type(name.decode())) # str, decode(encoding=‘utf-8’, errors=‘strict’) --> str
导入模块篇没有提前导入这种情况经常发生在使用某些模块的功能,但是py文件头部忘记导入json.loads(’{“name”:“de8ug”, “city”:“beijing”}’)

NameError Traceback (most recent call last)
in ()
----> 1 json.loads(’{“name”:“de8ug”, “city”:“beijing”}’)

NameError: name ‘json’ is not defined这种情况经常出现在学习某些新内容,学习(chao)完代码开始运行时候,发现啥啥啥没defined,这时候就需要去检查是不是最开始没有import的问题了。当加入 import json后,可得到正确结果{‘name’: ‘de8ug’, ‘city’: ‘beijing’}运行py文件时候报错ModuleNotFoundError: No module named ‘xxx’这种情况一般是,运行的那个py文件又需要导入自己定义的其他模块,
但此时系统不知道哪些模块的存在,解决办法是在运行的第一个py文件头部,添加如下代码:
这种情况适用于有个project项目,里面又bin,conf,app等目录,当bin里面的py文件又需要引入conf,app等目录的模块时候,需要让系统本身知道project这目录的存在,先有爷爷,然后才能有孙子啊。import os
import sys
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(file)))
sys.path.append(BASE_DIR)
函数使用篇作用域问题Python在函数中使用变量的时候,会按照LEGB(Local(本地),Enclosing(封闭),Global(全局),Built-in(内置))这种作用域的顺序来查找变量。如果有赋值(给同名的变量)操作,需要确保当前作用域下已经有这个变量。因为这时候Python认为函数内部和外部有同名的变量,会把外部的屏蔽。name = ‘de8ug’
def say_name():
print(f’name is: {name}’)

say_name() # 这时候正常, name is: de8ug

name = ‘de8ug’
def say_name():
name = name.capitalize() # 把名字大写,并赋值给name
print(f’name is: {name}’)

say_name()


UnboundLocalError Traceback (most recent call last)
in ()
4 print(f’name is: {name}’)
5
----> 6 say_name()

in say_name()
1 name = ‘de8ug’
2 def say_name():
----> 3 name = name.capitalize() # 把名字大写,并赋值给name
4 print(f’name is: {name}’)
5

UnboundLocalError: local variable ‘name’ referenced before assignment
这时候提示错误,name作为局部变量,在赋值前被引用了。因为和外部变量同名,此时name.capitalize()引用name的时候,在函数内部还没有name这个变量的具体内容,所以报错。
修改方式:
直接引用外部变量,使用相应的方法,或者采用不同的变量名print(f’name is: {name.capitalize() }’) # 直接打印

cap_name = name.capitalize()
类似的还有+=的时候,这时候相当于两部操作,先=后+,但,如果函数内部变量和函数外相同,就会出现类似上面的错误。你感受一下:n = 10
def add():
n += 8
print(n)

add()

UnboundLocalError Traceback (most recent call last)
in ()
4 print(n)
5
----> 6 add()

in add()
1 n = 10
2 def add():
----> 3 n += 8
4 print(n)
5

UnboundLocalError: local variable ‘n’ referenced before assignment
小结ok,最后我们总结一下,常见的错误有这么几种,语法错误变量应用编码错误导入模块函数作用域

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值