Python09
Python09bug的由来及分类python的异常处理机制python中常见的异常类型python异常处理--traceback模块两大编程思想面向过程面向对象两者共同点类与对象类对象动态绑定属性和方法
bug的由来及分类
-
bug的常见类型
-
粗心导致的语法错误
-
末尾冒号
-
缩进错误
-
英文符合
-
字符串和数字拼接
-
没有定义变量
-
==与=的混用
-
-
知识不熟练导致的错误
-
索引越界问题
-
append方法不熟练
-
-
思路不清导致的问题解决方案
-
使用print打印输出
-
使用#注释代码
-
-
被动掉坑:代码没有错误,由于用户输入而导致曝错
-
解决方案:python提供了异常处理机制,可以再异常出现时及时捕获,然后内部‘消化',让程序继续运行
-
try: a = int(input('请输入第一个整数')) b = int(input('请输入第一个整数')) result = a/b print('结果为:', result) except ZeroDivisionError: print('对不起,除数不能为0') print('程序结束')-
多个except结构:捕获异常的顺序按照先子类后父类的顺序,为了避免遗漏可能出现的异常,可以再最后增加BaseException
try: a = int(input('请输入第一个整数')) b = int(input('请输入第一个整数')) result = a/b print('结果为:', result) except ZeroDivisionError: print('对不起,除数不能为0') except ValueError: print('只能输入数字串') except BaseException: print('error') print('程序结束') -
-
-
python的异常处理机制
-
try...except...else结构:如果try块中没有抛出异常,则执行else块,如果try中抛出异常,则执行except块
try:
a = int(input('请输入第一个整数'))
b = int(input('请输入第一个整数'))
result = a/b
print('结果为:', result)
except BaseException as e:
print('error', e)
else:
print('result=', result)
-
try...except...else...finally结构:finally块无论是否发生异常都会被执行,能常用来释放try块中申请的资源
try:
a = int(input('请输入第一个整数'))
b = int(input('请输入第一个整数'))
result = a/b
print('结果为:', result)
except BaseException as e:
print('error', e)
else:
print('result=', result)
finally:
print('thank you welcome')
python中常见的异常类型
-
ZeroDivisionError: division by zero 除0异常
-
IndexError: list index out of range 索引异常
-
KeyError:映射中没有这个键
-
NameError:未申明变量
-
SyntaxError:语法错误
-
ValueError:传入无效参数
python异常处理--traceback模块
-
使用traceback模块打印异常信息
import traceback
try:
print('--------------------')
print(1/0)
except:
traceback.print_exc()
两大编程思想
面向过程
-
事物比较简单,可以用线性思维解决
面向对象
-
事物比较复杂,使用简单的线性思维无法解决
两者共同点
-
两者都是解决实际问题的一种思维方式
-
两者相辅相成,并不是相互独立。解决复杂问题,通过面向对象方式便于我们从宏观上把握事物之间的复杂关系,方便我们分析整个系统;具体到微观操作,仍然使用面向过程方式来处理
类与对象
类
-
是多个类似事物组成的群体的统称、能够帮助我们快速理解和判断事物的性质
-
类的创建
class Student: # Student为类的名称,简称类名,有一个或多个单词组成,每个单词的首字母大写,其余小写 pass # python中一切皆对象 Student是对象吗?内存有开空间吗? print(id(Student)) print(type(Student)) print(Student)
-
类的组成
-
类属性
-
类中方法外的变量称为类属性,被该类的所有对象所共享
-
-
实例方法
-
静态方法
-
使用@staticmethod修饰的方法,使用类名直接访问的方法
-
-
类方法
-
使用@classmethod修饰的方法,使用类名直接访问的方法
-
-
class Student:
native_place = '宁夏' # 直接写在类里的变量,称为类属性
def __init__(self,name,age):
self.name = name # self.name 称为实体属性,进行了一个赋值的操作,将局部变量的name的值赋给实例属性
self.age = age
# 实例方法
def eat(self):
print('student is eating...')
# 静态方法
@staticmethod
def method():
print('我使用了staticmethod进行修饰,所以我是静态方法')
# 类方法
@classmethod
def cm(cls):
print('我是类方法,因为我使用了classmethod进行修饰')
# 在类之外定义的称为函数,在类之内定义的称为方法
def drink():
print('drink...')
对象
-
python中一切皆对象
-
对象的创建又称为类的实例化
-
意义:有了实例,就可以调用类中的内容
class Student:
native_place = '宁夏' # 直接写在类里的变量,称为类属性
def __init__(self,name,age):
self.name = name # self.name 称为实体属性,进行了一个赋值的操作,将局部变量的name的值赋给实例属性
self.age = age
# 实例方法
def eat(self):
print('student is eating...')
# 静态方法
@staticmethod
def method():
print('我使用了staticmethod进行修饰,所以我是静态方法')
# 类方法
@classmethod
def cm(cls):
print('我是类方法,因为我使用了classmethod进行修饰')
# 在类之外定义的称为函数,在类之内定义的称为方法
def drink():
print('drink...')
# 创建student类的对象
stu1 = Student('zhangsan',20)
stu1.eat() # 对象名.方法名()
print(stu1.name)
print(stu1.age)
print(id(stu1))
print(type(stu1))
print(stu1)
print('-----------------------')
print(id(Student))
print(type(Student))
print(Student)
print('-----------------------')
Student.eat(stu1) # 类名.方法名(类的对象)----实际上就是方法定义处deself
动态绑定属性和方法
-
python是动态语言,在创建对象之后,可以动态的绑定属性和方法
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
def eat(self):
print(self.name+'eat')
stu1 = Student('zhangsan',20)
stu2 = Student('lisi',30)
print(id(stu1))
print(id(stu2))
print('------------------为stu2动态绑定性别属性----------')
stu2.gender = 'nv'
print(stu1.name,stu1.age)
print(stu2.name,stu2.age,stu2.gender)
print('------------------------')
stu1.eat()
stu2.eat()
def show():
print('定义在类之外的,称为函数')
stu1.show = show()
stu1.show








