
自学Python笔记(基础篇)
文章平均质量分 75
专栏记录我从0开始学习Pyrthon的过程每天更新一篇
有一起学习的小伙伴可以订阅!
onepiSya
“路漫漫其修远兮,吾将上下而求索。"
- 离骚
展开
-
101_尾声
写到这里,python 基础的一些语法。包括一些常见的用法,概念我都写完了。后面的话就是一些其他的知识,我相信,大家有了这些基础,后面的知识都可以自学了。我接下来准备写一些稍微进阶一点的。大致如下:正则表达式GUI数据库网络编程多线程和并发协程和异步高阶函数有兴趣的朋友可以关注我的博客。...原创 2020-09-25 19:44:42 · 219 阅读 · 0 评论 -
100_异常
文章目录异常处理traceback 和 异常处理测试自定义异常常见内置异常 - python 官方文档try- 语句陈述 - 官网文档 - 复合语句异常处理一些 示例可以跟着敲一敲# try + finally # it's workIn [1]: try: ...: print("onepis") ...: finally: ...: print("end") ...:onepisend# try + except + finally #原创 2020-09-24 22:29:10 · 243 阅读 · 0 评论 -
98_module(模块)
先 占个 位置。 我写错 顺序 。 先把 包 写了 。 该 先写 模块的。原创 2020-09-22 18:03:40 · 1074 阅读 · 0 评论 -
99_包(package)
文章目录1. 模块化编程的一般流程:2. 包 (package)导入包3. `sys.path`和模块的搜索目录4. venv 就是 虚拟环境5. 模块的发布和安装本地安装模块网站发布【注】上传并远程发布管理你的模块6. 常用第三方库大汇总音频视频 多媒体库ffmpeg1. 模块化编程的一般流程:设计 API,进行功能描述。编码实现 API 中描述的功能。在模块中编写测试代码,并消除全局代码。使用私有函数实现不被外部客户端调用的模块函数。import #导入模块,也就是文件from im原创 2020-09-22 18:01:53 · 961 阅读 · 2 评论 -
97_设计模式_单例模式实现(单例_工厂_结合_整合)
101.设计模式_单例模式实现 单例模式(Singleton Pattern)的核心作用是确保一个类只有一个实例,并且提供一 个访问该实例的全局访问点。 单例模式只生成一个实例对象,减少了对系统资源的开销。当一个对象的产生需要比较 多的资源,如读取配置文件、产生其他依赖对象时,可以产生一个“单例对象”,然后永久 驻留内存中,从而极大的降低开销。 单例模式有多种实现的方式,我们这里推荐重写__new__()的方法。__new__ 特殊方法定制 - python 中文 - 文档因为 __new__()原创 2020-09-21 15:55:08 · 453 阅读 · 0 评论 -
96_设计模式_工厂模式实现(简单实现)
100.设计模式_工厂模式实现 设计模式是面向对象语言特有的内容,是我们在面临某一类问题时候固定的做法,设计 模式有很多种,比较流行的是:GOF(Goup Of Four)23 种设计模式。当然,我们没有 必要全部学习,学习几个常用的即可。 对于初学者,我们学习两个最常用的模式:工厂模式和单例模式。 工厂模式实现了创建者和调用者的分离,使用专门的工厂类将选择实现类、创建对象进 行统一的管理和控制。# 工厂模式# 测试工厂模式class CarFactory: # factory 就是工原创 2020-09-21 15:29:41 · 145 阅读 · 0 评论 -
95_组合(类的套娃,和高阶函数概念差不多)
99.组合 “is-a”关系,我们可以使用“继承”。从而实现子类拥有的父类的方法和属性。“is-a” 关系指的是类似这样的关系:狗是动物,dog is animal。狗类就应该继承动物类。 “has-a”关系,我们可以使用“组合”,也能实现一个类拥有另一个类的方法和属性。” has-a”关系指的是这样的关系:手机拥有 CPU。 MobilePhone has a CPU。(类的套娃,可以理解为高阶函数的 类的实现。高阶函数是 函数作为参数,这里是 类的实例作为参数。)两种方式都可以起到代码 复原创 2020-09-21 15:23:46 · 333 阅读 · 0 评论 -
94_对象的浅拷贝和深拷贝
98.对象的浅拷贝和深拷贝变量的赋值操作 只是形成两个变量,实际还是指向同一个对象。浅拷贝  Python拷贝一般都是浅拷贝。拷贝时,对象包含的子对象内容不拷贝。因此,源对象 和拷贝对象会引用同一个子对象。深拷贝 使用copy模块的 deepcopy 函数,递归拷贝对象中包含的子对象。源对象和拷贝对象 所有的子对象也不同。测试对象的浅拷贝和深拷贝class MobilePhone: def __init__(self, cpu, screen)原创 2020-09-21 15:07:49 · 127 阅读 · 0 评论 -
93_特殊属性
97.特殊属性python - 特殊属性 - 文档Python对象中包含了很多双下划线开始和结束的属性,这些是特殊属性,有特殊用法。这 里我们列出常见的特殊属性:测试代码class A: passclass B: passclass C(B, A): def __init__(self, nn): self.nn = nn def cc(self): print("cc")c = C(3)print(dir(原创 2020-09-20 14:42:31 · 238 阅读 · 0 评论 -
92_特殊方法(魔术方法)和运算符重载
96.特殊方法(魔术方法)和运算符重载python - 特殊方法查找-文档1python - 特殊方法-文档2Python的运算符实际上是通过调用对象的特殊方法实现的。比如:测试代码1a = 20b = 30c = a+bd = a.__add__(b)print("c=", c)print("d=", d)测试代码2class Person: def __init__(self, name): self.name = name def _原创 2020-09-20 14:31:37 · 287 阅读 · 0 评论 -
91_多态
95.多态多态(polymorphism)是指同一个方法调用由于对象不同可能会产生不同的行为。在现实 生活中,我们有很多例子。比如:同样是调用人的休息方法,张三的休息是睡觉,李四的休 息是玩游戏,高淇老师是敲代码。同样是吃饭的方法,中国人用筷子吃饭,英国人用刀叉吃 饭,印度人用手吃饭。关于多态要注意以下2点:多态是方法的多态,属性没有多态。多态的存在有2 个必要条件:继承、方法重写。class Man: def eat(self): print("饿了,吃饭啦!")原创 2020-09-20 14:22:14 · 324 阅读 · 0 评论 -
90_ super()获得父类定义
94.super()获得父类定义在子类中,如果想要获得父类的方法时,我们可以通过 super()来做。super() 代表父类的定义,不是父类对象。spuer方法官方使用手册super-官方中文文档# 测试super(),代表父类的定义,而不是父类的对象class A: def say(self): print("A:", self)class B(A): def say(self): # A.say(self) su原创 2020-09-19 16:44:00 · 498 阅读 · 0 评论 -
89_多重继承
93.多重继承Python支持多重继承,一个子类可以有多个“直接父类”。这样,就具备了“多个父 类”的特点。但是由于,这样会被“类的整体层次”搞的异常复杂,尽量避免使用。# 测试多重继承 class A: def aa(self): print("aa")class B: def bb(self): print("bb")class C(B, A): def cc(self): print("原创 2020-09-19 16:36:52 · 143 阅读 · 0 评论 -
88_object根类
92.object根类object 类是所有类的父类,因此所有的类都有object 类的属性和方法。我们显然有必要深 入研究一下object 类的结构。对于我们继续深入学习Python 很有好处。dir()查看对象属性为了深入学习对象,我们先学习内置函数dir(),他可以让我们方便的看到指定对象所有的 属性。从上面我们可以发现这样几个要点:Person对象增加了六个属性:__dict__ , __module__, __weakref__, age, name, say_ageobject的原创 2020-09-18 15:06:45 · 246 阅读 · 0 评论 -
87_类成员的继承和重写
文章目录91.类成员的继承和重写查看类的继承层次结构91.类成员的继承和重写成员继承:子类继承了父类除构造方法之外的所有成员。方法重写:子类可以重新定义父类中的方法,这样就会覆盖父类的方法,也称为“重写”【操作】继承和重写的案例class Person: def __init__(self, name, age): self.name = name self.__age = age # 私有属性 def say_age(self):原创 2020-09-18 14:52:10 · 324 阅读 · 0 评论 -
86_继承
文章目录90.继承语法格式90.继承 继承是面向对象程序设计的重要特征,也是实现“代码复用”的重要手段。 如果一个新类继承自一个设计好的类,就直接具备了已有类的特征,就大大降低了工作 难度。已有的类,我们称为“父类或者基类”,新的类,我们称为“子类或者派生类”。语法格式Python支持多重继承,一个子类可以继承多个父类。继承的语法格式如下:class 子类类名(父类 1[,父类 2,...]): 类体 如果在类定义中没有指定父类,则默认父类是object类。也就是说,obj原创 2020-09-17 12:36:12 · 143 阅读 · 0 评论 -
85_面向对象进阶
文章目录89.面向对象进阶面向对象三大特征介绍封装(隐藏)继承多态89.面向对象进阶面向对象三大特征介绍Python是面向对象的语言,也支持面向对象编程的三大特性:继承、封装(隐藏)、多态。封装(隐藏) 隐藏对象的属性和实现细节,只对外提供必要的方法。相当于将“细节封装起来”,只 对外暴露“相关调用方法”。 通过前面学习的“私有属性、私有方法”的方式,实现“封装”。Python 追求简洁的 语法,没有严格的语法级别的“访问控制符”,更多的是依靠程序员自觉实现。继承 继承可以让子类具有原创 2020-09-17 11:30:52 · 168 阅读 · 0 评论 -
84_@property装饰器
文章目录88.@property装饰器普通的创建属性的方式使用装饰器创建 属性(增删查改都实现了)88.@property装饰器@property 可以将一个方法的调用方式变成“属性调用”。下面是一个简单的示例,让大 家体会一下这种转变:也就是访问的时候 无需加括号 执行函数。一般用来给我们的属性增加 get# 简单测试 @propertyclass Employee: @property def salary(self): print('salary r原创 2020-09-16 12:05:45 · 170 阅读 · 0 评论 -
83_私有属性和私有方法(实现封装)
87.私有属性和私有方法(实现封装)Python对于类的成员没有严格的访问控制限制,这与其他面向对象语言有区别。关于私有 属性和私有方法,有如下要点:通常我们约定,两个下划线开头的属性是私有的(private)。其他为公共的(public)。类内部可以访问私有属性(方法)类外部不能直接访问私有属性(方法)类外部可以通过“_类名__私有属性(方法)名”访问私有属性(方法)【注】方法本质上也是属性!只不过是可以通过()执行而已。所以,此处讲的私有属性和公 有属性,也同时讲解了私有方法和公有方法的原创 2020-09-15 20:12:10 · 173 阅读 · 0 评论 -
82_方法没有重载(其他语言有,python没有)
86.方法没有重载 在其他语言中,可以定义多个重名的方法,只要保证方法签名唯一即可。方法签名包含 3 个部分:方法名、参数数量、参数类型。 Python中,方法的的参数没有声明类型(调用时确定参数的类型),参数的数量也可以由 可变参数控制。因此,Python中是没有方法的重载的。定义一个方法即可有多种调用方式(参数数量,参数类型,都可变), 相当于(变相的)实现了其他语言中的方法的重载。 如果我们在类体中定义了多个重名的方法,只有最后一个方法有效。建议:不要使用重名的方法!Python中方法没原创 2020-09-14 17:14:58 · 148 阅读 · 0 评论 -
81_ __call__方法和可调用对象
85.__call__方法和可调用对象定义了__call__方法的对象,称为“可调用对象”,即该对象可以像函数一样被调用。可以理解为 实例化 之后的对象 再 加个 括号 。 就可以当做方法调用比如 Student()() 这种方式# __call__方法'''# 定义了__call__方法的对象,称为“可调用对象”,即该对象可以像函数一样被调用。a = 30b = 50c = a+bd = a.__add__b 真正 执行的 是这样的# 测试 可调用方法 __c原创 2020-09-14 16:53:55 · 242 阅读 · 0 评论 -
80_ __del__方法(析构函数)和垃圾回收机制
84.__del__方法(析构函数)和垃圾回收机制 __del__方法称为“析构方法”,用于实现对象被销毁时所需的操作。比如:释放对象 占用的资源,例如:打开的文件资源、网络连接等。 Python实现自动的垃圾回收,当对象没有被引用时(引用计数为 0),由垃圾回收器 调用__del__方法。 我们也可以通过del 语句删除对象,从而保证调用__del__方法。 系统会自动提供__del__方法,一般不需要自定义析构方法。# 简单写一下 析构函数 测试# 析构方法 测试# 用于销毁对象原创 2020-09-14 16:41:13 · 167 阅读 · 0 评论 -
79_类方法
83.类方法类方法是从属于“类对象”的方法。类方法通过装饰器@classmethod来定义,格式如下:@classmethod def 类方法名(cls [,形参列表]) : 函数体 # 可以理解为 无需实例化对象。就可以直接通过 类名.方法名() 来访问的方法 要点如下:@classmethod必须位于方法上面一行第一个cls 必须有;cls指的就是“类对象”本身;(和self指的是实例对象本身有异曲同工之处)调用类方法格式:“类名.类方法名(参数列表)”。 参数列表中原创 2020-09-13 20:28:20 · 230 阅读 · 0 评论 -
78_内存分析实例对象和类对象创建过程(重要)
82.内存分析实例对象和类对象创建过程(重要)我们以下面代码为例,分析整个创建过程,让大家对面向对象概念掌握更加深刻:class Student: company = "海贼王" #类属性 count = 0 #类属性 def __init__(self,name,score): self.name = name #实例属性 self.score = score Student.count = Student.co原创 2020-09-11 09:58:10 · 167 阅读 · 0 评论 -
77_类属性
81.类属性类属性是从属于“类对象”的属性,也称为“类变量”。由于,类属性从属于类对象,可以 被所有实例对象共享。类属性的定义方式:class 类名: 类变量名= 初始值在类中或者类的外面,我们可以通过:“类名.类变量名”来读写。【操作】 类属性的使用测试# 类属性(也就是 模具 的 属性 或者叫 变量, 可以被所有 实例对象(创建的饼干) 共享)class Student_01: # 很重要 很重要 很重要 很重要 company = "haizeiwang"原创 2020-09-11 09:40:20 · 157 阅读 · 0 评论 -
76_类对象(模具本身)
80.类对象 (模具本身)我们在前面讲的类定义格式中,“class 类名:”。实际上,当解释器执行class 语句时, 就会创建一个类对象。【操作】测试类对象的生成# 类对象(创造饼干的 '模具' 本身)# 实例对象就是类创建的饼干,以及 def的函数'''class Student: passprint(type(Student)) # 模具本身的对象类型 是 模具类 type, type类型也是一个对象 类型print(id(Student))Stu2 =原创 2020-09-11 09:26:17 · 166 阅读 · 0 评论 -
75_实例属性和实例方法
78.实例属性和实例方法实例属性实例属性是从属于实例对象(创建的饼干)的属性,也称为“实例变量”。他的使用有如下几个要点:实例属性一般在__init__()方法中通过如下代码定义:self.实例属性名 = 初始值在本类的其他实例方法中,也是通过self 进行访问:self.实例属性名创建实例对象后,通过实例对象访问:obj01 = 类名() # 创建对象,调用__init__()初始化属性obj01.实例属性名 = 值 # 可以给已有属性赋值,也可以新加属性实例方法原创 2020-09-11 09:22:07 · 628 阅读 · 0 评论 -
74___init__构造方法和__new__方法
77.__init__构造方法和__new__方法(重要)__init__ 这一类下滑线的 我认为是魔术方法,也叫特殊方法。具体可以查询此文档python -特殊方法-文档类是抽象的,也称之为“对象的模板”。我们需要通过类这个模板,创建类的实例对象,然 后才能使用类定义的功能。现在,我们可以更进一步的说,一个 Python 对象包含如下部分:1.id(identity 识别码)2. type(对象类型)3. value(对象的值)1) 属性(attribute)2) 方法(method)原创 2020-09-10 08:42:01 · 315 阅读 · 0 评论 -
73_类的定义
76.类的定义我们通过类定义数据类型的属性(数据)和方法(行为),也就是说,“类将行为和状态打 包在一起”. 对象是类的具体实体,一般称为“类的实例”。(比如一个 Student 类 创造了一个 实体 叫做 小李 。 小李 是一个学生。 就是这个 Student类的实例化对象。)类看做“饼干模具”,对象就是根据这个“模 具”制造出的“饼干”。 从一个类创建对象时,每个对象会共享这个类的行为(类中定义的方法),但会有自己的属 性值(不共享状态)。更具体一点:“方法代码是共享的,属性数据不共享”原创 2020-09-10 08:27:51 · 306 阅读 · 0 评论 -
72_面向对象初步
文章目录75.面向对象初步面向对象和面向过程区别面向过程(Procedure Oriented)思维面向对象(Object Oriented)思维面向对象思考方式面向对象和面向过程的总结75.面向对象初步 面向对象(Object oriented Programming,OOP)编程的思想主要是针对大型 软件设计而来的。面向对象编程使程序的扩展性更强、可读性更好,使的编程可以像搭 积木一样简单。 面向对象编程将数据和操作数据相关的方法封装到对象中,组织代码和数据的方式 更加接近人的思维,从原创 2020-09-10 08:14:08 · 147 阅读 · 0 评论 -
71_LEGB规则_python名称查找规则_变量名查找规则
74.LEGB规则Python在查找“名称”时,是按照LEGB规则查找的:Local-->Enclosed-->Global-->Built inLocal 指的就是函数或者类的方法内部Enclosed 指的是嵌套函数(一个函数包裹另一个函数,闭包)Global 指的是模块中的全局变量Built in 指的是Python为自己保留的特殊名称。如果某个name映射在局部(local)命名空间中没有找到,接下来就会在闭包作用域 (enclosed)进行搜索,如果闭包作用域也原创 2020-09-04 20:02:28 · 299 阅读 · 0 评论 -
70_nonlocal关键字 (和global有点像)
73.nonlocal关键字 (和global有点像)nonlocal 用来声明 外层的局部变量。global 用来声明全局变量。【操作】使用 nonlocal 声明外层局部变量# 测试nonlocal ,glabal 的 关键字 用法a = 100def outer(): b = 10 def inner(): nonlocal b # 需要nonlocal 来声明外部函数 (outer) 的局部变量 print('inner read outer原创 2020-09-03 22:02:27 · 119 阅读 · 0 评论 -
69_嵌套函数(内部函数)(闭包前奏)
69.嵌套函数(内部函数)(闭包前奏)嵌套函数: 在函数内部定义的函数!【操作】嵌套函数定义def f1(): print('f1 running...') def f2(): print('f2 running...') f2() f1()执行结果:f1 running... f2 running...小示例def outer(): print('outer running') # (f2 只为原创 2020-09-02 21:13:47 · 218 阅读 · 0 评论 -
68_递归函数
文章目录68.递归函数123使用递归计算n的阶乘结果(5!=5*4*3*2*1)测试递归算法树形递归(裴波那契)尾递归链表实现68.递归函数71递归函数指的是:自己调用自己的函数,在函数体内部直接或间接的自己调用自己。递归类 似于大家中学数学学习过的“数学归纳法”。 每个递归函数必须包含两个部分:终止条件 表示递归什么时候结束。一般用于返回值,不再调用自己。递归步骤 把第 n步的值和第 n-1步相关联。递归函数由于会创建大量的函数对象、过量的消耗内存和运算能力。在处理大量数据时,谨 慎原创 2020-08-28 15:14:31 · 459 阅读 · 0 评论 -
67_eval()函数
67.eval()函数功能:将字符串str当成有效的表达式来求值并返回计算结果。70参数:source:一个 Python表达式或函数 compile()返回的代码对象globals:可选。必须是dictionarylocals:可选。任意映射对象代码测试:1# 测 试 e v a l ( ) 函 数s = "print('abcde')" eval(s)a = 10 b = 20 c = eval("a+b")2eval("print('abcd')") # 注意引原创 2020-08-27 04:56:36 · 143 阅读 · 0 评论 -
66_lambda 匿名函数
文章目录66.lambda表达式和匿名函数66.lambda表达式和匿名函数69个人体会:可以结合推导式,map,zip 函数使用效果更佳lambda表达式可以用来声明匿名函数。lambda 函数是一种简单的、在同一行中定义函数 的方法。lambda函数实际生成了一个函数对象。lambda表达式只允许包含一个表达式,不能包含复杂语句,该表达式的计算结果就是函数 的返回值。lambda表达式的基本语法如下:lambda arg1,arg2,arg3... : <表达式>arg原创 2020-08-25 20:59:29 · 209 阅读 · 0 评论 -
65_可变参数
文章目录65.可变参数在类 class 里面 的常见 用法 **kwargs强制命名参数简单示例:另外教一个快速转换元组的方式(也是利用可变参数解包)以及后面加逗号 转换元组关于 * 可变参数 的实验`列表等分` 的巧妙 实现65.可变参数68可变参数指的是“可变数量的参数”。分两种情况:*param(一个星号),将多个参数收集到一个“元组”对象中。**param(两个星号),将多个参数收集到一个“字典”对象中。一般我们这样写*args 和 **kwargs【操作】测试可变参数处理(元原创 2020-08-25 01:15:22 · 261 阅读 · 0 评论 -
64_参数的几种类型
文章目录64.参数的几种类型位置参数默认值参数命名参数测试代码64.参数的几种类型67位置参数函数调用时,实参默认按位置顺序传递,需要个数和形参匹配。按位置传递的参数,称为: “位置参数”。【操作】测试位置参数def f1(a,b,c): print(a,b,c) f1(2,3,4) f1(2,3) #报错,位置参数不匹配执行结果:2 3 4 Traceback (most recent call last): File "E:\PythonExec原创 2020-08-25 00:58:18 · 283 阅读 · 0 评论 -
63_传递不可变对象包含的子对象是可变的情况
63.传递不可变对象包含的子对象是可变的情况66代码测试'''传递 不可变对象 里面包含了 子对象 是可变的则方法内修改了这个可变对象,源对象 也发生了变化 浅拷贝 含可变子对象'''import copya = (10, 20, [5, 6])print('a:', id(a))# 此函数 子对象 [5,6] (可变) 被改变 但是 a 和 m 依然是指向相同的对象def test07(m): print(id(m)原创 2020-08-25 00:54:12 · 149 阅读 · 0 评论 -
62_浅拷贝和深拷贝
62_浅拷贝和深拷贝(很重要)帮助我们更深刻的理解参数传递为了更深入的了解参数传递的底层原理,我们需要讲解一下“浅拷贝和深拷贝”。我们可以 使用内置函数:copy(浅拷贝)、deepcopy(深拷贝)。浅拷贝:不拷贝子对象的内容,只是拷贝子对象的引用。对子对象的修改会影响源对象深拷贝:会连子对象的内存也全部拷贝一份,对子对象的修改不会影响源对象浅拷贝:不拷贝子对象的内容,只是拷贝子 对象的引用. 相当于拷贝了个体深拷贝:会连子对象的内存也全部拷贝一份,对子对象的修改不会影响源对象 相当原创 2020-08-23 23:43:49 · 128 阅读 · 0 评论