【Python】异常处理

Python异常处理 »>思维导图****> »博客园 什么是异常处理? 程序在运行过程中出现了不可预知的错误 并且该错误没有对应的处理机制,那么就会以异常的形式表现出来 造成的影响就是整个程序无法正常运行 异常的结构 1.异常的类型:NAMEERROR 2.异常的信息:name ‘abc’ is not defined 3.异常的位置:Traceback (most recent call last): File “路径”, line 1, in abc 异常的种类: 1.语法错误 是你程序立刻就能解决的,这种错误是不能被容忍的,语法上的错误,发现之后应该立刻解决 2.逻辑错误 这种错误是可以被容忍的,因为一眼看不出来,针对逻辑上的错误,可以采用异常处理机制进行捕获 常见的错误类型 NameError 名字错误 SyntaxError 语法错误 KeyError 健不存在 valueError 值错误 IndexError 索引错误 TypeError 类型错误 异常处理 在你认为可能出现bug的代码块上方try一下 try: 可能出错的代码 except 出错的类型 as e: # 将报错信息赋值给变量e 出错之后的处理机制 注意try内部的代码块越少越好 try后可跟多种except异常类型的捕获,但是不会连续连续捕获,因为有一个错误发生之后,会立刻停止代码的运行,执行该类型错误的except语句 try: name l = [1,2,3] l[111] d = {'name':'jason'} d['password'] except NameError: print('NameError') except IndexError: print('indexerror') except KeyError: print('keyerror') Exception 所有异常的基类,所有异常类型都被捕获 ...

2019年8月8日 · 1 分钟

【Python】反射/元类

Python反射/元类) »>思维导图****> »博客园**** 反射reflect 什么是反射, 其实是反省,自省的意思 反射指的是一个对象应该具备,可以检测,修改,增加自身属性的能力 反射就是通过字符串操作属性 涉及的四个函数,这四个函数就是普通的内置函数 没有双下划綫,与print等等没有区别 hasattr getattr setattr delattr p = Person("jack",18,"man") # if hasattr(p,"name"): # 1.判断某个对象是否存在某个属性 # print(getattr(p,"names",None)) # 2.从对象中取出属性,第三个值位默认值 当属性不存在是返回默认值 # 3.为对象添加新的属性 setattr(p,"id","123") print(p.id) # 4.从对象中删除属性 delattr(p,"id") print(p.id) 使用场景:反射其实就是对属性的增删改查,但是如果直接使用内置的dict来操作,语法繁琐,不好理解 另外一个最主要的问题是,如果对象不是我自己写的是另一方提供的,我就必须判断这个对象是否满足的要求,也就是是否我需要的属性和方法 框架代码 """ 反射被称为框架的基石,为什么 因为框架的设计者,不可能提前知道你的对象到底是怎么设计的 所以你提供给框架的对象 必须通过判断验证之后才能正常使用 判断验证就是反射要做的事情, 当然通过__dict__也是可以实现的, 其实这些方法也就是对__dict__的操作进行了封装 需求:要实现一个用于处理用户的终端指令的小框架 框架就是已经实现了最基础的构架,就是所有项目都一样的部分 """ import plugins # 框架已经实现的部分 def run(plugin): while True: cmd = input("请输入指令:") if cmd == "exit": break # 因为无法确定框架使用者是否传入正确的对象所以需要使用反射来检测 # 判断对象是否具备处理这个指令的方法 if hasattr(plugin,cmd): # 取出对应方法方法 func = getattr(plugin,cmd) func() # 执行方法处理指令 else: print("该指令不受支持...") print("see you la la!") # 创建一个插件对象 调用框架来使用它 # wincmd = plugins.WinCMD() # 框架之外的部分就有自定义对象来完成 linux = plugins.LinuxCMD() run(linux) 插件部分 ...

2019年7月30日 · 2 分钟

【Python】多态

Python多态 »>思维导图****> »博客园******** 多态 概念 :一种事物具备多种 不同的形态 例如 :水“固态”、“液态”、“气态” 官方解释 :多个不同类的对象可以响应同一个方法,产生不同的结果 首先强调多态不是一种特殊的语法,而是一种状态、特性(即多个不同对象可以响应同一个方法,产生不同结果) 好处 :对于使用者而言,大大的降低了使用难度 实现多态 :接口、抽象类、鸭子类型都可以写出具备多态的代码,最简单的就是鸭子类型 案例 """ 要管理 鸡 鸭 鹅 如何能够最方便的 管理,就是我说同一句话,他们都能理解 既它们拥有相同的方法 """ class JI: def bark(self): print("哥哥哥") def spawn(self): print("下鸡蛋..") class Duck: def bark(self): print("嘎嘎嘎") def spawn(self): print("下鸭蛋") class E: def bark(self): print("饿饿饿....") def spawn(self): print("下鹅蛋..") j = JI() y = Duck() e = E() def mange(obj): obj.spawn() mange(j) mange(y) mange(e) # python中到处都有多态 a = 10 b = "10" c = [10] print(type(a)) print(type(b)) print(type(c)) isinstance ...

2019年7月29日 · 2 分钟

【Python】封装

Python封装 »>思维导图****> »博客园**** 封装 什么是封装? 就是将复杂的丑陋的,隐私的细节隐藏到内部,对外提供简单的使用接口 对外隐藏内部实现细节,并提供访问的接口 什么时候应该封装? 当有一些数据不希望外界可以直接修改时 当有一些函数不希望给外界使用时 为什么需要封装 ? 1.为了保证 关键数据的安全性 2.对外部隐藏实现细节,隔离复杂度 语法 class Person: def __init__(self,id_number,name,age) self.__id_number = id_number self.name = name self.age = age p = Person("1111111111111","jack",29) p.id_number = "222" 被封装的内容的特点: 1.外界不能直接访问 2.内部依然可以使用 权限 学习了封装后就可以控制属性的权限 在python只要两种权限 1.公开的.默认就是公开的 2.私有的,只能由当前类自己使用 在外界访问私有的内容 属性虽然被封装了,但是还是需要使用的,在外界如何访问 通过定义方法类完成对私有属性的修改和访问 """ 这是一个下载器类,需要提供一个缓存大小这样的属性 缓存大小不能超过内存限制 """ class Downloader: def __init__(self,filename,url,buffer_size): self.filename = filename self.url = url self.__buffer_size= buffer_size def start_download(self): if self.__buffer_size <= 1024*1024: print("开始下载....") print("当前缓冲器大小",self.__buffer_size) else: print("内存炸了! ") def set_buffer_size(self,size): #可以在方法中添加额外的逻辑 if not type(size) == int: print("大哥 缓冲器必须是整型") else: print("缓冲区大小修改成功!") self.__buffer_size = size def get_buffer_size(self): return self.__buffer_size d = Downloader("葫芦娃","http://www.baicu.com",1024*1024) # 通过函数取修改内部封装的属性 d.set_buffer_size(1024*512) # 通过函数访问内部封装的属性 print(d.get_buffer_size()) d.start_download() 这样一来我们可以在外界修改这个关键数据时,做一些限制 ...

2019年7月27日 · 2 分钟

【Python】继承

Python继承 ****> »思维导图************************> »博客园******** 什么是继承? 继承是一种关系,描述两个对象之间,什么是什么的关系 例如麦兜,佩奇,猪刚鬣 都是猪啊, 在程序中,继承描述的是类和类之间的关系 例如a继承了b, a就能直接使用b已经存在的方法和属性 a称之为子类,b称之为父类,也称之为基类 为什么要使用继承 继承的一方可以直接使用被继承一方已经有的东西 其目的是为了重用已经有的代码,提高重用性 如何使用继承 语法 class 类名称(父类的名称): 类的内容 #在python中 一个子类可以同时继承多个父类 抽象 不具体,不清晰,很模糊,看不懂 将多个子类中相同的部分,进行抽取,形成一个新的类,这个过程也称之为抽象的过程 正确的使用继承: 1.先抽象在继承 2.继承一个已经现存的类,扩展或是修改原始的功能 属性的查找顺序 class A: text = "haha" class B(A): text = "heihei" pass b = B() b.text = "xixi" print(b.text) 对象自己的 - > 所在类中 -> 找父类 - >父类的父类 ->Object 派生 当一个子类中出现了与父类中不同的内容时,这个子类就称之为派生类 通常子类都会写一些新的代码,不可能和父类完全一样 , 既通常都是派生类, 所以派生类指的就是子类 覆盖 ...

2019年7月25日 · 1 分钟

【Python】面向对象

Python面向对象 »>思维导图****> »博客园 面向对象编程思想OOP 什么是面向对象 [os-copy] 面向对象是一种编程思想,是前辈们总结出的经验,指导程序员如何编写出更好的程序,核心是对象,程序就是一系列对象的集合,程序员负责调度控制这些对象来交互着完成任务 案例1 把大象装进冰箱? 面向过程: 1.打开冰箱 2.装入大象 3.关闭冰箱 面向对象: 找个具备装大象的技能的对象 在面向对象中程序员的角度发生改变,从具体的操作者变成了指挥者 强调:对象不是凭空产生的,需要我们自己设计 案例2 西天取经 如来有一堆破书要传出去,他没有自己干, 而是找了五个对象帮他去干, 如来只要负责控制调度的对象即可, 如果某个对象发生变化,也不会影响其他的对象 , 扩展性 案例3 曹操吟诗 喝酒吃肉,人生真爽 喝酒吃肉,人生几何 对酒当歌,人生几何 [/os-copy] 面向对象三大优点 [os-copy] 1.扩展性 2.灵活性 3.重用性 [/os-copy] 缺点 [os-copy] 1.程序的复杂度提高了 2.无法准确预知结果 [/os-copy] 使用场景: 对扩展性要求较高,通常是直接面向用户的,例如:QQ,微信 面向过程编程思想 [os-copy] 关注的核心是过程,过程是就是一步一步的执行步骤,既先干啥在干啥 优点:逻辑清晰 , 复杂问题简单化,流程化 缺点: 扩展性差,可维护性差 使用场景:对扩展性要求较低的程序例如:系统内核,git,计算器 记住:不是所有程序都要面向对象,得分析具体需求 [/os-copy] 类和对象 类 :即类型,类别,是一种抽象概念,是一系列具备相同特征和相同行的对象的集合 对象 :就是具体存在的某个事物,具备自己的特征和行为,对象就是特征和技能的结合体 类和对象的关系 [os-copy] 类包含一系列对象,对象属于某个类 在生活中是先有对象再有类,而在程序中是先有类才能有对象,我们必须先告诉计算机这类的对象有什么特征有什么行为 总结出一个结论:在使用面向对象编程时,第一步就是思考需要什么样的对象,对象具备什么样的特征和行为,从而根据 这些信息总结出需要的类型 [/os-copy] 创建类和对象 定义类的语法 ...

2019年7月24日 · 1 分钟

【Python】深浅拷贝/hashlib/logging/openpyxl模块

深浅拷贝/hashlib/logging/openpyxl模块 »>思维导图> »博客园 模块与包 模块 """ 三种来源 1.内置的 2.第三方的 3.自定义的 四种表示形式 1.py文件(******) 2.共享库 3.文件夹(一系列模块的结合体)(******) 4.C++编译的连接到python内置的 """ 导入模块 """ 先产生一个执行文件的名称空间 1.创建模块文件的名称空间 2.执行模块文件中的代码 将产生的名字放入模块的名称空间中 3.在执行文件中拿到一个指向模块名称空间的名字 """ 什么是包 """ 什么是包? 它是一系列模块文件的结合体,表示形式就是一个文件夹 该文件夹内部通常会有一个__init__.py文件 包的本质还是一个模块 """ 导入包 先产生一个执行文件的名称空间 1.创建包下面的__init__.py文件的名称空间 2.执行包下面的__init__.py文件中的代码 将产生的名字放入包下面的__init__.py文件名称空间中 3.在执行文件中拿到一个指向包下面的__init__.py文件名称空间的名字 在导入语句中 .号的左边肯定是一个包(文件夹) 当你作为包的设计者来说 1.当模块的功能特别多的情况下 应该分文件管理 2.每个模块之间为了避免后期模块改名的问题 你可以使用相对导入(包里面的文件都应该是被导入的模块) # 研究模块与包 还可以站另外两个角度分析不同的问题 # 1.模块的开发者 # 2.模块的使用者 研究模块与包还可以站另外两个角度分析不同的问题 1.站在包的开发者 如果使用绝对路径来管理的自己的模块 那么它只需要永远以包的路径为基准依次导入模块 2.站在包的使用者 你必须得将包所在的那个文件夹路径添加到system 注意 python2如果要导入包 包下面必须要有__init__.py文件 python3如果要导入包 包下面没有__init__.py文件也不会报错 当你在删程序不必要的文件的时候 千万不要随意删除__init__.py文件 相对导入与绝对导入 ...

2019年7月19日 · 5 分钟

【Python】时间/序列化/sys/os模块

Python****时间/序列化/sys/os模块 »>思维导图****> »博客园**************** collections模块 collections模块在内置的数据类型,比如:int、str、list、dict等基础之上额外提供了几种数据类型。 1.namedtuple(): 生成可以使用名字来访问元素内容的tuple子类 2.deque: 双端队列,可以快速的从另外一侧追加和推出对象 3.Counter: 计数器,主要用来计数 4.OrderedDict: 有序字典 5.defaultdict: 带有默认值的字典 ****具名元组(namedtuple) tuple是一个不可变的集合,namedtuple是一个函数,她用来构建一个自定义的tuple对象, 并且规定了tuple元素的个数,可通过属性而不是索引来引用tuple的某个元素。 我们可以通过namedtuple很方便的自定义一个数据类型,它具有tuple 的不变属性又可以根据属性来引用。 ****想表示空间坐标点x为1, y为2,z为5的坐标 from collections import namedtuple point = namedtuple('坐标',['x','y','z']) # 第二个参数既可以传可迭代对象 point1 = namedtuple('坐标','x y z') # 也可以传字符串 但是字符串之间以空格隔开 p = point(1,2,5) p1 = point1(2,3,6)print(p,p.x,p.y,p.z) # 坐标(x=1, y=2, z=5) 1 2 5print(p1,p1.x,p1.y,p1.z) # 坐标(x=2, y=3, z=6) 2 3 6 想表示一张黑桃A的扑克牌 card = namedtuple('扑克牌','color number') card1 = namedtuple('扑克牌',['color','number']) A = card('♠','A') B = card1('♠','A')print(A.color,A.number,A) # ♠ A 扑克牌(color='♠', number='A')print(B.color,B.number,B) # ♠ A 扑克牌(color='♠', number='A') 想表示一个城市 ...

2019年7月18日 · 5 分钟

【Python】正则表达式与re模块

Python正则表达式与re模块************> »转到****思维导图************************************> »转到********博客园**** 正则表达式与re模块的关系 1.正则表达式是一门独立的技术,任何语言均可使用 2.python中要想使用正则表达式需要通过re模块 正则表达式应用场景 推荐书籍:正则指引 1.爬虫 2.数据分析 字符组概念 在同一个位置可能出现的各种字符组成了一个字符组,在正则表达式中用[]表示(一个字符组每次只能匹配一个字符) 小例子 匹配0-9数字([0123456789]也支持简写[0-9])(如果想匹配横杠,转义即可) 匹配A-Z字母(依据上面的简写规则[A-Z]) 匹配a-z字母(依据上面的简写规则[a-z]) ps:这种上面到上面的范围必须是从小到大[a-Z]不行,[A-z]可以(但是内部有几个特殊符号),因为内部对应的asicc码A在所有字母里面最小,z在所有字母里面最大 正则 待匹配字符 匹配结果 说明 [0123456789] 8 True 在一个字符组里枚举合法的所有字符,字符组里的任意一个字符 和"待匹配字符"相同都视为可以匹配 [0123456789] a False 由于字符组中没有"a"字符,所以不能匹配 [0-9]| 7| True| 也可以用-表示范围,[0-9]就和[0123456789]是一个意思 [a-z]| s| True| 同样的如果要匹配所有的小写字母,直接用[a-z]就可以表示 [A-Z]| B| True| [A-Z]就表示所有的大写字母 [0-9a-fA-f]| e| True| 可以匹配数字,大小写形式的a~f,用来验证十六进制字符 字符 元字符 | 匹配内容 —|— . | 匹配除换行符以外的任意字符 \w| 匹配字母或数字或下划线 \s| 匹配任意的空白符 \d| 匹配数字 \n| 匹配一个换行符 \t| 匹配一个制表符 \b| 匹配一个单词的结尾 ^| 匹配字符串的开始 $| 匹配字符串的结尾 \W| 匹配非字母或数字或下划线 ...

2019年7月17日 · 2 分钟

【Python】模块

Python模块******> »转到**思维导图********************> »转到博客园************ 1.什么是模块? 1模块就是一系列工能的结合体 2模块的三种来源: 1.内置的(python解释器自带) 2.第三方的(别人写的) 3.自定义的(你自己写的) 3模块的四种表现形式 1.使用python编写的py文件(也就意味着py文件也可以称之为模块:一个py文件也可以称之为一个模块) 2.已被编译为共享库或DLL的C或C++扩展(了解) 3.包好一组模块的包:把一系列模块组织到一起的文件夹(文件夹下有一个__init__.py文件,该文件夹称之为包) 包:一系列py文件的结合体 4.使用C编写并链接到python解释器的内置模块 2.为什么要用模块**?** 1.从文件级别组织程序,更方便管理。 当多个文件中都需要使用相同的方法的时候 可以将该公共的方法写到一个py文件中,其他的文件以模块的形式导过去直接调用即可 2.拿来主义,提升开发效率 3如何使用模块? 1.import的使用 模块可以包含可执行的语句和函数的定义,这些语句的目的是初始化模块,它们只在模块名第一次遇到导入import语句时才执行 2.在第一次导入模块时会做三件事,重复导入会直接引用内存中已经加载好的结果 1.首先创建一个执行文件(run.py)的名称空间,执行模块文件 在模块中定义的函数和方法若是使用到了global时访问的就是这个名称空间 2.运行模块文件(md.py)中的代码将产生的名字与值存放到执行文件(run.py)的名称空间中 在新创建的命名空间中执行模块中包含的代码 3.在执行文件中产生一个执行指向名称空间的名字(md) 创建名字来引用该命名空间 3from...import...句式缺点: 1.访问模块中的名字不需要加模块名前缀 2.在访问模块中的名字可能会与当前执行文件中的名字冲突 4补充知识点: __name__ 当文件被当做执行文件执行的时候__name__打印的结果是__main__ 当文件被当做模块导入的时候__name__打印的结果是模块名(没有后缀) __all__ __all__可以指定当所在py文件被当做模块导入的时候,可以限制导入者能够拿到的名字个数 from md1 import * 一次性将md1模块中的名字全部加载过来 不推荐使用 并且你根本不知道到底有哪些名字可以用 异常有两大类 1.语法结构错误:需要你当场修改 异常捕获没法完成 2.逻辑错误:异常捕获可以处理 4.循环导入 1.如果出现循环导入问题 那么一定是你的程序设计的不合理。循环导入问题应该在程序设计阶段就应该避免。 2.解决循环导入问题的方式 1.方式1:将循环导入的句式写在文件最下方() 2.方式2:函数内导入模块 5.模块的查找顺序 1.先从内存中找 2.再从内置中找 3.最后环境变量(sys.path)中找 一定要分清楚谁是执行文件谁是被导入文件sys.path返回的是一个大列表,里面放了一对文件路径,第一个路径永远是执行文件所在的文件夹注意:py文件名不应该与模块名(内置的,第三方)冲突 6.绝对导入与相对导入 1绝对导入 绝对导入必须依据执行文件所在的文件夹路径为准 绝对导入无论在执行文件中还是被导入文件都适用 2相对导入 .代表的当前路径 ..代表的上一级路径 ...代表的是上上一级路径 注意相对导入不能再执行文件中使用 相对导入只能在被导入的模块中使用,使用相对导入就不需要考虑执行文件到底是谁,只需要知道模块与模块之间路径关系 7.软件开发规范 ...

2019年7月16日 · 1 分钟