乱
#__author : 'liuyang' #date : 2019/4/3 0003 上午 8:44 # 6小时 120分 #15: - 18 60分 #19: - 22 40+20分 #简单 #6小时 #60分 +20+20 +20 #60分及格不算 附加题 #60 #简答题 12道 #读程序 #简单编程 #编程题 # 异常处理 #logging 模块 #内置方法 #obj是一个对象,如果我们希望打印对象是可以看的,而不是一个内存地址 #__str__里必须return 必须是str类型的值 #__str__\__repr__ #都是在打印对象或者字符串格式化拼接对象时候自动触发的 #__repr__是备胎 #print(obj) ,format ,%s ,str(obj),f'{obj}'优先使用__str__ #如果 没有__str__,那么以上所有调用__repr__ #__repr__的应用场景 #%r ,repr(obj) 会自动调用__repr__方法, #不会找__str__ 没有repr 打印地址 #__new__ 构造方法 #创建一块属于对象的空间 #new 一定是在init之前执行的 #单例模式 # \__del__ #析构方法 #删除一个对象之前, class A: def __del__(self): print('aaa') obj = A() del obj # del obj.name # del obj.age #__call__ #obj()会自动触发__call__ #with 上下文 管理 #__enter__ #__exit__ # with 类名() as __enter__返回值: #写我们需要的内容了(所有的内容都一块成功和失败) #写我们需要的内容 之前 执行了 enter返回值 #写我们需要的内容 之前 执行了 exit返回值 #上下文管理应用 #文件操作 #并发编程 锁 #django 框架中使用数据库的事务
#__author : 'liuyang' #date : 2019/4/3 0003 上午 9:15 # 两种异常 #一种是语法错误 :空格 缩进 语法规则 # if a<> b 编译的时候就编译不过去 #pass #invalid syntax 尽量避免 #一种是逻辑错误 #应该在程序当中写代码处理 #条件判断 #异常处理 # l = [] # num = int(input()) # l[num] #迭代器 StopIteration #pickele EOFOerror #先认识一下异常 #如何去查异常 \解决异常 ''' import pickle def func(): f = open('test','w') pickle.load(f) #报错 ,load 一个文件读,f 文件是写 所以报错 func() def main(): func() main() ''' ''' Traceback (most recent call last): File "D:/Python/S20/day25/2.两种异常.py", line 24, in <module> func() File "D:/Python/S20/day25/2.两种异常.py", line 23, in func pickle.load(f) io.UnsupportedOperation: not readable''' #io.UnsupportedOperation: not readable # 异常类型 #提示我们为什么会报错 #Traceback 从下往上看的 #常见的异常 #name NameError不定义一个变量就直接使用了 # 1/0 #ZeroDivisionError 不能除以一个零 # l = [] # [][1] #IndexError 超出了索引范围 # int('aaa') #ValueError 强转数据类型 # d = {} # d['key'] #KeyError 没有键 # d = {} # d{'key'} #SyntaxError 非规定的 # class A:pass # A.cou #AttributeError访问一个不存在的 # a = 1 # a() #TypeError 一个不可被调用的模块被调用了 # import aaa #ModuleNotFoundError 找不到你要调用的模块 #默认的 都在这 #异常会导致什么 a = 1 b = 2 # print(c) #报错 程序就无法继续执行了 print(a+b) # 什么是异常处理 点击了没有涉及到的东西 游戏闪退 更新之后修补了这块 #代码不好就 经常闪退 没有预料到的逻辑 #是我们 在运行程序的过程中,如果遇到错误,就去事先处理它 #让我的程序不要因为报错而结束 #提高用户体验 #提高代码的容错性 # d = {'key': 'value'} # d['name'] try : d = {'key':'value'} d['name'] #一旦报错 # print('qqqxing') # 这里不执行 except KeyError: #就被捕获 print('qqqxing') #这样 pass print('wahah')
#__author : 'liuyang' #date : 2019/4/3 0003 上午 9:59 # 要用到异常处理的标志 # 有一个文件 是不确定的 # 从文件里读取 # 从input 接收 # 从一个网页上面取东西 # 用户输入手机号码 发送验证码 # 爬取各种网页, 不存在的网址 # # l = ['apple','banana','umberlla'] # for num,goods in enumerate(l,1): # print(num,goods) # try: # 不能把所有的放在这里 逻辑没问题 # # 效率有问题 每次都判断是否出错 # choose = int(input('asdgasd/')) # print(l[choose-1]) # # except ValueError: # print('请输入一个数字') # 多分支 # l = ['a' , 'b' , 'c'] # for num,goos in enumerate(l,1): # print(num,goos) # try: # choose = int(input('请输入选择')) # print(l[choose-1]) # except ValueError: # print('请输入数字') # except IndexError: # print('您输入的序号不在列表内') # l = ['a' , 'b' , 'c'] # for num,goos in enumerate(l,1): # print(num,goos) # try: # choose = int(input('请输入选择')) # print(l[choose-1]) # a # except (ValueError,IndexError):#输入 异常 单例 # print('请输入正确的序号') # # except NameError: #放上面也可以 但是不规范 这是另一方面的异常 # print('发生了一个NameError') # 不得非得 代码写的少 # 这段bug 代码少 try: # a # [][1] # {}['key'] # 1/0 import aaa except NameError: print("NameError") except IndexError: print("IndexError") except KeyError: print("KeyError") except ZeroDivisionError: print('') except ModuleNotFoundError: print('') ''' # 万能异常 几乎能捕获所有的异常 try: a [][1] {}['key'] 1/0 import aaa except Exception: print('Exception') # 查看异常信息 try: # a # [][1] # {}['key'] # 1/0 import aaa # 没有异常 #IndentationError except Exception as e: # 异常的小祖宗 print('Exception',e) #尽量不要用万能异常 如果你用了 一定要写as 返回错误类型 方便差错 #可能找不到错误类型 不写 e 不知道哪个类型的错 # 这个 和上面差不多 但是没法返回 什么错误 try : aaa except: pass # except (ValueError,IndexError):停在这里 如有特殊 # except Exception #放在最后必须 截留筛漏 # 若万能放前面则 都拦住了 # 单分支 try: 可能发生异常的代码 except 错误类型1: 处理异常 #多分支 except 错误类型2: 处理异常 # except (错误类型1,错误类型2): # 处理异常 #万能异常 except Exception as e: 处理异常,记录异常类型 #万能异常+多分支 try : 可能繁盛异常的的代码 except 错误另行1 处理异常 except 错误类型2: 处理异常 except Exception as e: 处理异常,记录异常类型 '''
#__author : 'liuyang' #date : 2019/4/3 0003 上午 10:36 ''' l = ['a','b','c'] for n , g in enumerate(l,1): print(n,g) # print('执行了') try : cho = int(input('asdga')) print(l[cho-1]) # str(cho) except (ValueError,IndexError)as e:#发邮件 80个人 print(e) print('输入正常的序号') #发错了的失败的 走这里 # else: #成功的 没有任何异常才会进来 # print('执行了') ''' # else:如果try 中的代码顺利的执行完,没有报错,执行else的代码 # 是用来汇报整个try中的代码执行成功用的 # 一般else 里的都是安全的,不会有报错隐患 # finally: # print('值') def func(filename): try: f = open(filename,'r') con = f.read() return con except Exception as e: print(e) finally: #无论如何都要执行 f.close() print('yidinghuizhiixng ') ret = func('test') print(ret) def wrapper(func): def inner(*args,**kwargs): print('before') ret = func() print('after') return ret #等于上 # try: # print('b') # return func() #等待在这 不归还 ()后归还 # finally: # print('af') return inner try : f = open('test') for line in f: a,b = line.split(',') # finally: #出错了也执行 # f.close() # print('执行我了') # else : 如果try中的代码 没有错误就执行 #finally : 必须执行 #遇到return 也先执行 finally 中的代码 #遇到错误也在程序结束之前 执行finally 的代码 ######try except #单分支**** ###### try except except #多分支 **** # try except ...else # try except ...else finally ####### try except ...finally **** #try finally
#__author : 'liuyang' #date : 2019/4/3 0003 上午 11:04 # raise ValueError # 抽象类 # 父类 子类 如果子类没有实现父类的方法就报错 早错早发现早治疗 # 提供给其他程序用的 # 自定义异常 # 继承 Exception 后面写项目 ''' class Taibai(Exception): #__main__.Taibai: 异常 def __init__(self,msg): self.msg = msg super().__init__() #父类的 def __str__(self): return self.msg raise Taibai('具体的异常内容') ''' # 断言 ''' if 1==2 : print(123) else: print('报错') # 不满足 不走了 assert 1 == 2 print(123) ''' # 断言 # assert 条件 ''' import queue q = queue.Queue() # 空 q.get_nowait() class Empty(Exception): def __init__(self,msg): self.msg = msg super().__init__() def __str__(self): return self.msg class 班级: def __init__(self): self.students = ['赵大宝'] def get(self): if not self.students: raise Empty('学生列表已为空') else: return self.students.pop() clas = 班级() stu1 = clas.get() print(stu1) stu2 = clas.get() print(stu2) '''
#__author : 'liuyang' #date : 2019/4/3 0003 上午 11:43 #1.如何看异常 ***** #2.如何处理异常 #try except #try except finally #断言\自定义异常\主动抛异常 #几年后#写一个功能对公司的程序员 #assert 继承Exception raise # 1.异常处理不宜 加在大段代码外面 # try : # 100 行代码 # except : # pass # 2. 不要写太多个except # try : # 三行代码 # except: # pass # 3 . 尽量少的 使用万能异常 ,并且一定不要在万能异常内部用pass # 不知道哪出错 # 4. 在程序米有完成之前 , 不要在程序入口处 加异常处理 # 5. 给代码排错的时候, 一定要考虑 已经添加上的异常处理机制
#__author : 'liuyang' #date : 2019/4/3 0003 上午 11:53 # 日志模块 # 为什么要写日志 #一个卡务系统 :记录时间 地点 金额 #谁在什么时候删掉的 删掉了某一个用户 #某时某刻 登录了系统 #检测代码是不是像我们想象的这样执行的 # 写文件 输出到屏幕 #f.write , print # 时间格式, 级别控制 ,更加便捷 # *** logging 模块不能自动 生成你需要的日志 # logging模块的使用 #简单配置法 *** # 编码问题 (无法转码等) #logger 对象法 ***** import logging logging.basicConfig(level = logging.DEBUG)#都显示 logging.debug('debug message') #调试 logging.info('info message') #普通 logging.warning('warning messaeg') #警告 logging.error('error message') #错误 logging.critical('critical message') #严重错误 ''' WARNING:root:warning messaeg ERROR:root:error message CRITICAL:root:critical message''' logging.basicConfig(level = logging.DEBUG)#都显示 #这里控制 显示什么层次的错误 # 文内里 设置错误 # 把print(mes) 换成 logging.debug(mes) #上面开关控制打不打印 logging.basicConfig(level = logging.WARNING)#上面的就显示 # 替换打印的 #级别控制 # 时间模块 # logging.basicConfig(level = logging.DEBUG, # format(), # datefmt='', # filename= '' # ) # 默认情况下 , 不打印warning 一下级别的信息 # 1.中文显示乱码 # 2. 不能同时 输出到中文 和 。。 #logger 对象的方式来使用logging 模块 # 首先 先创建 logger 对象 # 第二 创建一个文件操作符 # 第三 传建一个屏幕操作符 # 第四 创建一个格式 #logger 绑定 文件操作符 #logger 绑定 屏幕操作符 # 文件操作符 绑定格式 # 屏幕操作符 绑定格式 import logging logger = logging.getLogger() fh = logging.FileHandler('log',encoding='utf-8') sh = logging.StreamHandler() #屏幕操作符 fmt = logging.Formatter(%(asc)) logging.addHandler(fh) logger.addHandler(sh) logger.warning('logger对象的warning') # 选课系统 #登录 #功能 #给你的程序添加必要的日志信息