
Python基础
文章平均质量分 79
深入浅出玩Python
云崖先生
持续分享Python、Golang、JavaScript、MySQL、Redis、Elasticsearch、MongoDB等相关知识。
Ps:高产似母猪
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Python系列 69 异常处理
异常介绍异常分类程序中难免出现错误,总共可分为两种。1.逻辑错误2.语法错误对于刚接触编程的人来说,这两个错误都会经常去犯,但是随着经验慢慢的积累,语法错误的情况会越来越少反而逻辑错误的情况会越来越多(因为工程量巨大)。不论多么老道的程序员都不可避免出现这两种错误。异常信息异常其实就是程序运行时发生错误的信号,我们写代码的过程中不可避免也最害怕的就是出现异常,然而当程序抛出异常时实际上会分为三部分,即三大信息。常见异常在Python中一切皆对象,异常本身也是由一个类生成的,Name原创 2021-07-06 11:49:34 · 381 阅读 · 1 评论 -
Python系列 68 元类编程
一切皆对象函数是对象Python中一切皆对象,故函数也是一个实例对象。通过function.__class__,可以拿到创建出函数这个实例对象的类:>>> func = lambda : 1>>> print(func.__class__)<class 'function'>我们还可以为函数实例对象增添实例属性,虽然没人会这样做:>>> func.attr = "intance attribute">>>原创 2021-07-06 11:48:52 · 255 阅读 · 0 评论 -
Python系列 67 描述符类
描述符类我们在之前接触了代理属性@property装饰器,它其实就是一个描述符,本质上而言是一个新式类。如果想自定义一个描述符类,则必须实现以下三种双下方法的任意一个或多个:__get__():获取描述符类实例时,触发该方法__set__():设置描述符类实例时,触发该方法__delete__():删除描述符类实例时,触发该方法于此同时还需要注意在定义描述符类时的2点细节:描述符类本身应该定义成新式类,被代理的类也应该是新式类必须把描述符实例定义成这个类的类属性,不能定义到__init原创 2021-07-06 11:48:08 · 301 阅读 · 0 评论 -
Python系列 66 双下大全
特殊的双下在Python中有很多特殊的方法函数,如__init__()、__new__()等。除此之外,也有很多特殊的属性变量,如__base__,__class__等。这些属性变量或者方法函数经常被人称其为“魔法方法”,个人并不是很喜欢这种叫法。我更喜欢称呼他们为双下方法或者双下属性,因为“魔法”一词总是带有玄幻的色彩,但在计算机领域中如果你觉得一个知识点过于玄幻,说明你并未真正的理解它。言归正传,那么它们具体有什么作用呢?如下所示:双下方法:在满足某一特定的条件下进行自动调用双下属性:本原创 2021-07-06 11:46:50 · 198 阅读 · 0 评论 -
Python系列 65 自省反射
自省反射自省和反射是两个比较专业化的术语,释义如下:自省是指获取对象的能力反射是指操纵对象的能力由于Python是一门强类型的动态解释型语言,所以它的自省和反射使用非常简单。我们在某些时候并不知道对象中具有的属性与方法,尤其是接手别人的项目时这种情况更加明显。在这种情况下,我们不能直接通过Object.__dict__来获取其对象的属性与方法(因为这样获取不到继承的属性),而应当先使用自省来获取对象信息后,再使用反射来操纵对象,故自省和反射的学习显得尤为重要。以下举例常见自省与反射的函数:原创 2021-07-05 06:45:56 · 225 阅读 · 2 评论 -
Python系列 64 抽象基类
抽象基类接口(interface)和抽象基类(abstract base class)是非常相似的,Python中并未提供真正意义上的接口,但是提供了抽象基类的使用。它们的作用在于:约束子类实现,子类必须实现抽象基类中的某一个方法才能被实例化,否则将不可被实例化举个例子,羊(Sheep)和狼(Wolf)都属于哺乳类(Breastfeeding),那么它们都至少具有1个方法名为哺乳(feeding),如果没有该方法,则该类不能被实例化。其实说白了,抽象基类的作用就是规范子类实现,所以:抽象基原创 2021-07-05 06:44:44 · 371 阅读 · 0 评论 -
Python系列 63 多态
oop多态多态更多的是指的一种思想,而非具体技术。因为继承的存在,从而引发了多态,举个例子,所有的生物都是由一个单细胞生物不断演化而来,迄今为止它们的差异越来越大,这就是多态的体现。多态的定义其实更准确的说法是:在不同类中实例化得到的不同对象调用一个相同方法时,它们的实现过程并不一样。Python本身就实现了多态,其中len()方法就是最好的多态体现,2个不同类的实例化对象调用相同方法,该方法内部的处理是完全不同的:lst = [i for i in range(10)]tpl = tuple(原创 2021-07-05 06:43:59 · 144 阅读 · 0 评论 -
Python系列 62 继承
oop继承继承介绍继承作为oop三大特性之一,可以说是最难的一章知识点,但是用的非常多。继承是指创建类的一种方式,极大程度上规避了类与类之间代码的重复问题。在Python中,是支持多继承的,即一个类可以继承多个类,这是其他大多数语言中所不支持的。被继承的类可以称为父类,超类或者基类继承的类可以称为子类或者派生类派生类可以使用父类所有的属性及方法,但是父类是不能使用派生类的属性或方法的。以下是语法格式:class 类标示符(父类1, 父类2): ...举一个简单的例子原创 2021-07-05 06:43:27 · 120 阅读 · 0 评论 -
Python系列 61 封装
oop封装封装是oop思想中最重要的一个,也是所有面向对象程序设计中始终绕不开的话题,说白了就是将数据和功能整合到一起。类本身就属于封装,如定义一个类,该类中的属性以及方法只有该类或者其实例化对象才能调用,这就是类封装的体现。除此之外,oop封装中还有2个十分重要的名词,即:私有属性公有属性私有属性类的私有属性是指在类中以_下划线开头,或者以__下划线开头命名的标示符。它们都是指将该标示符属性隐藏,仅用于类的内部调用,不希望甚至不支持在类的外部访问这些属性。单下封装单下封装是指在类中原创 2021-07-05 06:42:55 · 104 阅读 · 0 评论 -
Python系列 60 属性代理
属性代理属性代理是指通过@property描述符装饰器来规定用户对类或者实例中某一属性的操作做出行为限制的方式。类似于JavaScript中的代理器,Vue中的计算属性等,Python中则称之为描述符。计算获取BMI指数是用来衡量一个人的体重与身高对健康影响的一个指标,计算公式为:BMI指数计算公式: BMI = 体重(kg) / (身高m**2)BMI正常值在20至25之间,超过25为超重,30以上则属肥胖身高或体重是不断变化的,因而每次想查看BMI值都需要通过计算才能得到,但很明显BM原创 2021-07-05 06:42:15 · 204 阅读 · 0 评论 -
Python系列 59 类的方法
实例方法实例方法是存储在类的__dict__字典中,实例方法都有一个固定的参数名为self,位于第一个位置。实例方法通常会通过实例对象调用,当实例对象调用实例方法时,会自动的将自身传递给self。如下所示:class Student: def __init__(self, name): self.name = name def show(self): return "my name is %s"%self.nameif __name__ == "原创 2021-07-05 06:41:36 · 164 阅读 · 2 评论 -
Python系列 58 类与对象
类和对象类是一个抽象的概念,而对象是一个实体的存在。对象由类创造而出,每个对象之间互相独立互不影响,一个对象只能由一个类创建,但是一个类可以创建出多个对象,而实例化就是指通过某个类创建出对象的过程。类与对象的关系类似于模具与产品,必须先有模具,然后才能根据这个模具制作出各式各样的产品。基础介绍定义类Python中定义类,使用class关键字,具体语法如下:class 类标示符(继承类): # ❶ """ 类的描述文档 # ❷ """ 标示符原创 2021-07-05 06:40:56 · 215 阅读 · 2 评论 -
Python系列 57 编程范式
编程范式编程范式只是一种程序设计思维,本身并无优劣之分。与任何语言都无关,不要觉得面向对象就一定比面向过程好,实际上恰恰相反。面向过程才是所有代码在内存中最终的状态。面向过程面向过程(OPP)编程思想的重点是将注意力放在事物本身上,更多的是关心下一步操作该怎么做,以正在发生为目的。将1个大的问题逐步拆解成多个小问题,一旦问题解决后代码上线将很少有改动的场景。特性:模块化、流程化优点:代码可读性高,并且性能高缺点:不利于维护与扩展著名的以面向过程思想为指导的设计产品有Linux内核,g原创 2021-07-05 06:40:21 · 249 阅读 · 0 评论 -
Python系列 56 模块包库框架的区别
模块Python中1个.py文件就是一个模块。模块是指为了解决某一单独功能而专门诞生的。如用户登录注册功能中包含验证码发送,针对这一个小功能可以单独拎出来做一个模块。verification_code.py包包其实就是一个包含有__init__.py的文件夹。一个包中可以包含另一个包,包的基础单元是由模块构成。包将一些近似功能的模块组合到一起,如登录注册这2个大功能可以形成一个顶级包,可分为登录包、注册包、功能包3个子包:login_register/ # 顶级原创 2021-07-05 06:39:06 · 179 阅读 · 0 评论 -
Python系列 55 内置模块:functools
functools简介functools是非常强大的内置模块,它提供了许多装饰器与函数,适用于对所有可调用对象的应用。官方文档这里主要着重介绍2种常用的函数与装饰器,它们适用于绝大部分的场景。函数/装饰器描述partial()冻结可调用对象的某些参数,因此该函数也被称为偏函数@lru_cache为函数提供缓存功能,当某一函数的两次调用参数均一致,则直接返回前一次调用的结果在该模块中,我们之前也已经接触过它所提供的redue()与@warps装饰器,所以这里不再进行原创 2021-07-04 14:00:20 · 221 阅读 · 2 评论 -
Python系列 54 内置模块:itertools
itertools简介itertools是Python内置模块,提供了大量为高效循环而创建的迭代器函数,当你有以下一些特殊需求时就可以使用它们,而不必再自己动手造轮子。官方文档由于提供的迭代器众多,故不可能每个都记得,这里放上摘自官网的迭代器一览表。首先是无穷迭代器如下表所示,即能够无限被迭代的迭代器:迭代器实参结果示例count()start, [step]start, start+step, start+2*step, …count(10) --> 10 1原创 2021-07-04 13:59:43 · 234 阅读 · 0 评论 -
Python系列 53 内置模块:collections
collections简介collections模块提供了许多容器的数据类型,是Python内置数据类型的一种升级。官方文档collections模块所提供的内置容器或者基类如下所示:容器/基类描述namedtuple()创建命名元组子类的工厂函数deque类似列表(list)的容器,实现了在两端快速添加(append)和弹出(pop)ChainMap类似字典(dict)的容器类,将多个映射集合到一个视图里面Counter字典的子类,提供了可哈希对象的计原创 2021-07-04 13:58:43 · 202 阅读 · 0 评论 -
Python系列 52 内置模块:importlib
importlib简介importlib模块作为Python内置模块,提供了更多导入模块的方式。官方文档常用方法:importlib.import_module(str):根据字符串导入1个模块,该字符串以.为路径分割,如"package.module"项目示例假设我的项目之中包含了多个中间件,并且这些中间件会在项目正式启动之前先行启动。我该如何集中式的管理这些中间件,让它们在需要的时候能够快速加上,不需要的时候能够快速去除呢?使用importlib模块是最明智的选择,整个项目目录如下:原创 2021-07-04 13:58:00 · 304 阅读 · 0 评论 -
Python系列 51 内置模块:re
re简介正则表达式其本身就是一种小型的,高度专业化的编程语言。在Python中,它被内嵌在了re模块里面,正则表达式模式被编译成一系列的字节码,然后由用C编写的匹配引擎执行。官方文档本文仅针对可能用到的方法进行描述,对不常用的方法等进行了筛选。方法一览符号大全以下是正则表达式的符号大全:符号中文名称释义.通配符匹配除\n之外的任意字符,如果想匹配\n可更换匹配模式为re.S或re.DOTALL^开始符匹配以特定字符开始的字符串,在检测时只会检测开头第一个字原创 2021-07-04 13:56:36 · 454 阅读 · 0 评论 -
Python系列 50 内置模块:logging
logging简介Python内置模块logging提供了日志记录相关功能,是一款非常强大且常用的模块。官方文档它的使用如果刨根问底可能比较复杂,所以里仅介绍1种最方便的使用方式,其他的使用方式日常开发中基本不会用到,故不进行介绍。简单了解logging模块中规定日志拥有6个级别,每个级别都有单词、数字2种表现形式,如下表所示:levelnumber描述logging.critical50致命错误logging.error40常规错误logging.wa原创 2021-07-04 13:55:56 · 137 阅读 · 0 评论 -
Python系列 49 内置模块:subprocess
subprocess简介subprocess模块最早在Python2.4中引入,它会生成一个子进程,该子进程可以执行shell命令,并且会监听系统的标准输入管道、标准输出管道、标准错误管道,在命令执行完毕后,将结果进行返回到对应的管道中。官方文档如下图所示:它的功能虽然看上去十分单一,但是应用是非常广泛的。试想,你是一名运维人员,编写了1个脚本,每天定时定点的在100台机器上获得它们的状态信息,就可以用到该模块。让脚本在宿主机上通过该模块执行命令,并且拿到命令的返回结果,再通过网络返回结果并对原创 2021-07-04 13:55:09 · 394 阅读 · 0 评论 -
Python系列 48 内置模块:configparser
configparser简介configparser模块是Python的内置模块,提供了配置文件创建、解析、修改等功能。官方文档值得注意的是,在Python2中,它的命名是驼峰式的,为ConfigParser。认识配置文件配置文件常以.ini或者.cfg作为后缀,注释方式有2种。#注释与;注释,一个配置项是以键值对方式进行存储,通过:或者=分割。[regulator]user_name : Yunyaage = 21sex = maleis_admin = truesalary =原创 2021-07-04 13:54:04 · 385 阅读 · 2 评论 -
Python系列 47 内置模块:hashlib
hashlib简介密码学是一个庞大的领域,总体来说可将该领域中的加密方式分为2大类:对称加密:可通过加密值反解出内容非对称加密:不可通过加密值反解出内容而今天介绍的hashlib模块是Python3中所独有的,提供了一系列的非对称加密算法:hash算法。在Python2中hashlib模块被拆分成了md5模块和sha模块,它们提供的功能和Python3的hashlib模块相同。官方文档以下是该模块提供的部分常用方法及属性:属性/方法描述hashlib.algorith原创 2021-07-04 13:53:16 · 445 阅读 · 2 评论 -
Python系列 46 内置模块:json&pickle&shelve
序列化序列化是指将在内存中的数据变成为可存储或者可传输的数据。Python中称序列化为pickling,而其他编程语言中则称之为serialization、marshalling、flattening等等,都是一个意思。序列化最重要的目的是数据持久化保存,以及数据跨平台传输:持久化保存:数据无法在内存中长期驻留,因此可以将其转变为某种格式并写入到磁盘之中跨平台传输:不同的编程语言中对于数据的表示都是不同的,如Python中的set在很多语言中就不具备,故可以将数据进行序列化,变为一种大家都认识的原创 2021-07-04 13:52:33 · 196 阅读 · 0 评论 -
Python系列 45 内置模块:sys
sys简介sys模块是Python内置模块,提供了各种系统相关的参数和函数。官方文档以下举例部分常用方法和属性:方法/属性描述sys.platform返回操作系统平台名称sys.version获取Python解释程序的版本信息sys.builtin_module_names获取内置的所有模块名,元组形式返回sys.modules返回以加载至内存之中的模块及路径sys.path返回模块在硬盘中的搜索路径sys.stdinPython标准输入原创 2021-07-03 13:52:04 · 623 阅读 · 0 评论 -
Python系列 44 内置模块:os
os简介os模块是Python内置模块,提供了各种使用Python对操作系统提供操纵的接口。官方文档以下举例部分常用方法和属性:方法/属性描述os.curdir总是返回一个字符串,“.”,代指当前目录os.pardir总是返回一个字符串,“…”,代指当前父级目录os.sep返回当前平台下的路径分隔符,Windows下为“\”,Unix下为“/”os.linesep返回当前平台下的行终止符,Windows下为“\r\n”,Unix下为“\n”os.p原创 2021-07-03 13:51:31 · 369 阅读 · 0 评论 -
Python系列 43 内置模块:random
random简介random模块是Python自带的模块,该模块实现了各种分布的伪随机数生成器。官方文档以下举例部分常用方法:方法描述random.randint(1, 3)从1-3之间随机生成一个整数random.randrange(1, 3)从1-2之间随机生成一个整数random.random()生成大于0且小于1的浮点数random.uniform(1, 3)生成大于1且小于3的浮点数random.choice(seq)从序列中随机取出1原创 2021-07-03 13:51:02 · 275 阅读 · 0 评论 -
Python系列 42 内置模块:datetime
datetime简介datetime模块是Python内置模块,相比于time模块能够更加方便的操纵时间。官方文档以下举例部分常用方法:方法描述datetime.datetime()实例化返回一个datetime的对象datetime.datetime.now()获取本地时间,返回一个datetime的对象datetime.datetime.utcnow()获取世界时间,返回一个datetime的对象datetime.datetime.fromtimest原创 2021-07-03 13:50:29 · 259 阅读 · 0 评论 -
Python系列 41 内置模块:time
time简介time模块是Python自带的模块,提供了时间的访问和转换功能。官方文档time模块中,对时间的表示包含3个概念:时间戳形式:从1970.1.1 08:00:00(Unix纪元)开始到现在所经历的毫秒数,它int类型结构化形式:以元组包裹的形式进行时间的展示,它tuple类型字符串形式:以字符串的形式进行时间的展示,它是str类型3种表示时间的方式之间可以互相转换,如下图所示:时间获取获取时间的方法:方法描述表现形式time.time()获取时原创 2021-07-03 13:50:00 · 612 阅读 · 0 评论 -
Python系列 40 包相关
Python包包是一个含有__init__.py的文件夹(Python2中必须拥有,Python3中可以省略)。包的基础单元是模块,当然一个包中也可以包含其他的包,是一组模块的集合。包的导入当导入一个包时,将会先执行包下__init__.py文件,于此同时会产生一个包的命名空间。而在__init__中定义的标识符都会丢入到这个命名空间中。现在,我们定义了一个包:├── package # 顶级包│ ├── __init__.py│&nb原创 2021-07-03 13:49:27 · 109 阅读 · 0 评论 -
Python系列 39 模块相关
Python模块Python中的模块是一系列功能的集合体,总计可分为3大类:内置模块:Python自带的一些内置库,开箱即用第三方模块:通过pip命令下载到的模块,无需自己定义,Python拥有海量的第三方模块自定义模块:一个.py文件就是一个模块,所以自己编写的.py文件也可以当做模块使用,例如文件名为m.py的文件就是一个名为m的自定义模块自定义模块自定义模块即自己写的模块,好处如下:将相同功能的代码进行分类降低代码耦合度,减少代码冗余使整个程序组织结构更清晰,便于后期维护结原创 2021-07-03 13:48:59 · 170 阅读 · 0 评论 -
Python系列 38 目录规范
目录规范为了提高程序的可读性与可维护性,我们应该为软件设计良好的目录结构,这与规范的编码风格同等重要。软件的目录规范并无硬性标准,只要清晰可读即可。但是有一些规范还是十分合理的,我们应当予以遵守:目录层次不超过5层目录尽量以复数形式命名,如imgs而不是img目录命名尽量清晰易懂目录说明bin目录级别:一级目录目录作用:通常用于存放项目启动脚本其他命名:暂无注意事项:如果拥有此目录,则启动脚本需要考虑模块导入路径的问题core目录级别:一级目录目录作用:存放主程序、业务逻辑原创 2021-07-03 13:48:22 · 311 阅读 · 0 评论 -
Python系列 37 生成器
生成器生成器(generator)是迭代器的一种特殊实现方式,有2种方式可以创建,一种是通过生成器函数创建,另一种是生成器表达式进行创建。生成器继承了迭代器的一切优点,简而言之是迭代器的一种升级版本。在前面的迭代器一章节中介绍过,如果要想获取一个迭代器,必须要先创建一个可迭代对象,然后调用其下的__iter__()方法才能拿到一个迭代器,这样做会产生一些问题,如下所示:我们只想要一个迭代器,并不需要可迭代对象的前提下该怎么办可迭代对象中的数据项会占据大量内存空间,如果要想获取1个含有1000万个原创 2021-07-03 13:47:37 · 410 阅读 · 0 评论 -
Python系列 36 迭代器
迭代器迭代是什么迭代指的是一个重复的过程,每次重复都必须基于上一次的结果而继续,单纯的重复并不是迭代,如Python中的for循环就是一个非常好的迭代例子。for item in range(10): print(item)迭代必须向前推进,不能后退,如下所示:# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]# ------------------------------>下面这种方式就不属于迭代:# [0, 1, 2, 3, 4, 5, 6, 7, 8,原创 2021-07-03 13:47:01 · 202 阅读 · 0 评论 -
Python系列 35 装饰器
装饰器开闭原则根据设计模式中的6大设计原则中的开闭原则来说,一个良好的项目应该具有以下2个特性:对扩展开放:项目应当具有良好的扩展性对修改关闭:当项目需要做功能变更时,不应该修改源代码,而应该增添新的功能,达到热插拔的效果装饰器装饰器(decorator)的功能就是在不违背开闭原则的前提下为一个原有功能增加上一些新的功能。但是原有功能的调用、源代码都不会被修改,类似于一种在外部打补丁的方式。装饰器有函数装饰器,类装饰器等分别,这里介绍函数装饰器,其实它们的运行原理都是相同的。功能需求原创 2021-07-02 13:57:36 · 111 阅读 · 1 评论 -
Python系列 34 内置函数
查看方式Python3中常用的内置函数可通过导入builtins模块查看:print(builtins.__dict__)下面将挑选常用的且以前很少使用的内置函数进行示例。基础常用函数:函数返回值描述关注度help()None打印对象下的doc文档注释信息5hash()int返回不可变对象的hash表现形式5id()int返回对象在内存中的标识,即地址空间编号5print()None向终端输入一则信息5input()st原创 2021-07-02 13:57:06 · 212 阅读 · 1 评论 -
Python系列 33 匿名函数
匿名函数匿名函数即没有名字的函数,最早出现在LISP语言中,Python对其进行了引用。匿名函数的作用就是在不丧失代码可读性的前提下为精简代码提供的一种方式,以下是定义匿名函数的语法,通过lambda关键字进行定义。注意!函数不管有名没名,都必须先定义后使用语法如下:lambda 形参1, 形参2 ... : 返回值# ❶ ❷❶:形参可以有多个,也可以没有❷:返回值不用跟return,直接写逻辑语句即可,将会自动的把逻辑语句的结果进行返回定原创 2021-07-02 13:56:32 · 859 阅读 · 0 评论 -
Python系列 32 递归函数
递归函数递归的特性递归(recursion)是一种函数的调用方式,简而言之就是自己调用自己。递归可以将一个大规模的问题分解成更小的相同问题,经过持续分解到最后问题规模小到可以用非常简单直接的方式来解决,或者将一个问题拆分成不同的各个部分,达到分而解决分而治之的目的。一个递归函数必须要满足3要素:必须有一个基本结束条件必须能改变问题规模必须调用自身如下所示,这就是一个标准的递归函数:def function(count): if count: print(coun原创 2021-07-02 13:55:57 · 242 阅读 · 0 评论 -
Python系列 31 高阶函数
高阶函数在Python中函数是一等公民,它与普通的数据项对象并没有什么区别,唯一的区别可能在于函数是能被调用的吧。这意味着,Python中的函数可以做下面的事情:可以赋值可以将一个函数对象传递给另一个函数对象的形参一个函数中可以返回另一个函数可以将函数当做容器类型中的一个数据项元素赋值函数标识符本来仅是一个贴纸,指向了函数体代码在内存中的位置。那么我们可以再加上一个贴纸标识符,让它与函数标识符指向内存中相同的位置,如下所示:def function(): print("fun原创 2021-07-02 13:55:25 · 151 阅读 · 0 评论 -
Python系列 30 命名空间
Python之禅传奇的Python核心开发者,Tim Peters为我们总结了Python核心思想点,收录在了内置模块this中:>>> import thisThe Zen of Python, by Tim PetersBeautiful is better than ugly.Explicit is better than implicit.Simple is better than complex.Complex is better than complicated原创 2021-07-02 13:54:52 · 110 阅读 · 0 评论