
Python基础
weixin_43989215
这个作者很懒,什么都没留下…
展开
-
Python网络通信socket
一 客户端/服务器架构1.硬件C/S架构(打印机)2.软件C/S架构互联网中处处是C/S架构例如淘宝网站是服务端,你的浏览器是客户端(B/S架构也是C/S架构的一种)腾讯作为服务端为你提供视频,你得下个腾讯视频客户端才能看它的视频)C/S架构与socket的关系:我们学习socket就是为了完成C/S架构的开发二 osi七层引子:须知一个完整的计算机系统是由硬件、操作系统、应用软件三者组成,具备了这三个条件,一台计算机系统就可以自己跟自己玩了(打个单机游戏,玩个扫雷啥的)如果你要跟别人一原创 2020-07-17 21:11:37 · 326 阅读 · 0 评论 -
python并发编程-协程
一 引子本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态cpu正在运行一个任务,会在两种情况下切走去执行其他的任务(切换由操作系统强制控制),一种情况是该任务发生了阻塞,另外一种情况是该任务计算的时间过长或有一个优先级更高的程序替代了它ps:在介绍进程理论时,提及进程的三种执行状态,而线程才是执行单位,所以也可以将上图理解为线程的三种状态一:其中第二种情况并不能提升效率,只是为了让cpu能够雨露均沾,实原创 2020-07-17 00:39:22 · 129 阅读 · 0 评论 -
Python-元类
python中一切皆对象,所有的对象都是实例化或者调用类得到。那么我们创建的类也是一个对象,创建类的类就称为元类class Person(object): def __init__(self,name): self.name = namep = Person("jack")print(p) # <__main__.Person object at 0x0000000000692198>动态的创建类"""定义创建类的函数create_class如果给cr原创 2020-07-13 18:58:16 · 96 阅读 · 0 评论 -
Python-通过属性描述符管理实例属性
上一篇博客中,我们通过@property装饰器来管理实例的属性,这使得我们不仅可以通过obj.attr的方式来访问,并且可以设置属性的存储规则。并且由于@property和@attr.setter装饰器的存在,我们也很容易能够找到处理业务逻辑相关的函数。但当大量的属性都需要相同的存储逻辑来进行控制时,使用@property装饰器仍然无法避免代码的重复。例如:学生类的age和grades属性都必须是整数并且大于0.下面通过属性描述符的形式来管理实例属性,看看有什么区别class IntField(obje原创 2020-07-12 21:29:22 · 179 阅读 · 0 评论 -
Python-管理实例属性
在实际面向对象编程的过程中,实例对象的属性通常都有一定的存储逻辑。例如,学校管理系统中,学生的信息管理。我们需要记录学生的姓名,年龄,各科的成绩。然后还要根据各科的来判断该学生是否能够正常毕业。定义一个学生类可以这样:class Student(object): def __init__(self,name,age,grades): self.name = name self.age =age self.grades =grades de原创 2020-07-12 05:05:21 · 124 阅读 · 0 评论 -
Python中的__getattr__和__getattriute__的区别
一般情况下我们都是通过下面的方法访问对象的属性class Student(object): def __init__(self,name): self.name = names = Student("jack")print(s.name) # 通过s.name 访问对象s的name属性print(s.age) # 属性age不存在,抛出异常AttributeError: 'Student' object has no attribute 'age'在一个类中重写了__g原创 2020-07-12 03:24:18 · 711 阅读 · 0 评论 -
Python中与类比较相关的魔术方法
1 用于比较的魔术方法class Square(object): """ 比较长方形的面积大小 """ def __init__(self,width,height): self.width = width self.height = height def res_area(self): return self.width * self.height def __eq__(self, other): # =原创 2020-07-11 22:08:31 · 172 阅读 · 0 评论 -
Python中的上下文管理器-with语句
我们在读写文件的时候经常会用到with语句,那么到底什么是上下文管理器呢?可以简单的理解为我们现在有2个需要成对出现的操作。例如我们操作文件的时候,先要打开文件,然后执行文件相关的操作,最后在关闭文件。这里打开文件和关闭文件是成对出现的。还有一个常见的就是在多线程中的加锁与解锁操作。上下文管理器: 当我们在一个类中实现了__enter__和__exit__方法,那么这个类的实例就是一个上下文管理器class OpenFile(object): def __init__(self,file_na原创 2020-07-11 20:34:00 · 318 阅读 · 0 评论 -
python中__dict__,dir()和__slots__的区别
1 __dict__class Person(object): is_alive = True country = "China" def __init__(self,name,age): self.name = name self.age = ageclass Teacher(Person): school = "哈佛" def __init__(self,name,age,subject): super()原创 2020-07-10 21:04:31 · 310 阅读 · 1 评论 -
Python中type和isinstance的区别
在Python中,我们经常通过type和isinstance来判断某个对象的类型,下面我们通过一个简单的例子来分析2个方法的区别class Animal(object): def __init__(self,name): self.name = nameclass Dog(Animal): def __init__(self,name): self.name = namedog = Dog("dog1")print(type(dog)) # &l原创 2020-07-10 17:53:57 · 161 阅读 · 0 评论 -
Python面向对象-封装
封装可以认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。要访问该类的代码和数据,必须通过严格的接口控制。封装的优点隐藏信息,实现细节。可以对成员变量进行更精确的控制。类内部的结构可以自由修改。良好的封装能够减少耦合。在Python中,我们通过在属性的前面添加双下划线的方式将类的属性隐藏起来,但这仅仅只是一种变形操作。类中所有双下划线开头的属性和方法都会在类的定义阶段、检测语法的时候修改为“_类名__属性名”的形式。class Animal(object): de原创 2020-06-29 05:11:47 · 91 阅读 · 0 评论 -
Python面向对象-继承
1 继承的概念继承是面向对象中的一个概念,如果B类继承A类,那么我们称A类为B类的父类(超类),B类为A类的子类。继承使得子类拥有父类的属性和方法,这样就可以减少代码的重复。当子类对父类的方法不满意时,还可以重写该方法,即覆盖掉父类的方法,这样就可以实现同父类不一样的功能。当然,我们还可以在子类中添加新的属性和方法。Python3中我们所写的类都默认继承object类。Python中既支持单继承,也支持多继承。2 继承的特点减少了重复的代码增加了类的耦合性使代码更加规范,合理3 继承的使用原创 2020-06-28 23:44:27 · 457 阅读 · 0 评论 -
Python-面向对象编程
1 面向对象的相关的概念类(Class):是用来描述具有相同属性和方法的对象的集合。定义了每个对象所共有的属性和方法,对象就是类的实例对象:一个对象即是一个类的实例化后实例,一个类必须经过实例化后方可在程序中调用,一个类可以实例化多个对象,每个对象亦可以有不同的属性,就像人类是指所有人,每个人是指具体的对象,人与人之前有共性,亦有不同封装:在类中对数据的赋值、内部调用对外部用户是透明的,这使类变成了一个胶囊或容器,里面包含着类的数据和方法继承:一个类可以派生出子类,在这个父类里定义的属性、方法自动原创 2020-06-28 23:11:01 · 78 阅读 · 0 评论 -
Python中的进程池与线程池
前面我们了解到,可以通过多进程、多线程来提高程序的执行效率。但是随着进程数、线程数的增多,服务器的压力也会越来越大,甚至可能会瘫痪。因此,为了是服务器能够长时间正常运行,我们有必要对程序的并发数进行控制。这时候就会用到进程池和线程池。池的功能就是控制进程数和线程数。下面以线程池(进程池的用法同线程池一样)为例:异步提交任务from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutorimport os,random,time原创 2020-06-28 18:11:19 · 153 阅读 · 0 评论 -
Python并发编程-Event事件和Timer计时器
Python中每个线程都是独立运行的。如果程序中的其他线程需要根据某个线程的状态来确定自己下一步的操作,这时线程同步问题就会变得很麻烦。为此我们可以使用threading库中的Event对象。该对象包含一个可由线程设置的信号标志,它允许线程等待某些事件的发生。在 初始情况下,Event对象中的信号标志被设置为False。如果有线程等待一个Event对象, 而这个Event对象的标志为假,那么这个线程将会被一直阻塞直至该标志为True。一个线程如果将一个Event对象的信号标志设置为True,它将唤醒所有等待原创 2020-06-27 08:01:28 · 817 阅读 · 0 评论 -
python多线程中的死锁与递归锁
Python中的多线程是共享所在进程的资源和内存地址的,因此当多个线程同时操作同一个数据的时候,就容易出错。如下from threading import Thread,currentThreadimport timedef task(): global n tem = n time.sleep(0.01) # 在此处休息0.01秒,足够开启所有的线程,他们所获取到的n都是0,这就导致了最后输出的n为1 tem = tem + 1 n = tem pri原创 2020-06-27 07:11:13 · 237 阅读 · 0 评论 -
Python中的多线程
1 开启线程的2中方式开启线程和开启进程的方法基本是一样的,如下from threading import Threadimport timedef task1(name): print("%s 开始执行" % name) time.sleep(3) print("%s 执行完毕" % name)if __name__ == '__main__': thre=Thread(target=task1, args=("线程1",)) thre.start()原创 2020-06-22 04:11:15 · 106 阅读 · 0 评论 -
Python中多线程的相关概念
1 线程的概念在Python中,每一个进程都有独立的内存空间地址,默认有一个控制线程。进程就像一个车间,把各个资源整合到一起,而线程就像是车间的一条流水线,完成某个特定的任务。线程是CPU的最小执行单位,而进程则是整个车间的工作过程,是一个资源的集合。多线程就是一个车间的多条流水线,共用该车间的资源,即共享进程的内存空间地址2 创建线程开销小创建进程就像创建一个车间,需要申请一块内存空间,然后还需要创建一个控制线程。而创建线程,只需要在该车间内建一条流水线,故创建线程的开销比创建进程的开销小3原创 2020-06-22 03:22:55 · 112 阅读 · 0 评论 -
Python多进程队列(Queue)和生产者消费者模型
Python中每个进程的内存是相互隔离的,那么如何实现进程之间的通信了,multiprocessing模块提供了队列和管道2种方式来实现进程之间的消息传递。队列的底层就是通过管道和锁来实现的。队列相关的方法from multiprocessing import Process,Queueq = Queue([maxsize]) # 创建一个队列,maxsize表示队列的大小,即可以存放几条数据,如果省略则可以存放无穷多条数据,取决于你内存空间的大小q.put(data,block=True,t原创 2020-06-22 02:15:26 · 1797 阅读 · 0 评论 -
Python多进程中的互斥锁(Lock)和信号量(Semaphore)
多个进程之间的内存空间是隔离的,但是硬盘,数据库,打印终端都是共享的 。因此当多个进程同时修改硬盘中的同一个文件,或者修改数据库中的同一条记录时,就存在资源竞争的问题,容易出错。以抢票为例:from multiprocessing import Processimport time,jsondef find(name): time.sleep(1) # 模拟网络延迟 dic=json.load(open('ticket.txt')) print('%s 剩余票数 %s原创 2020-06-21 07:16:04 · 661 阅读 · 0 评论 -
Python中的多进程
1 multiprocessing模块Python中的多线程无法利用多核优势,如果想要充分利用多核CPU的资源,大部分情况需要使用多进程。multiprocessing模块可以用来开启子进程,并且提供了许多功能组件,Process,Lock,Queue,Pipe。2 Process的用法开启子进程的2种方式from multiprocessing import Processimport timedef task1(name): print("%s 开始执行" % name)原创 2020-06-21 06:27:48 · 145 阅读 · 0 评论 -
Python多进程的相关概念
1 进程的概念进程是指一个正在执行任务的过程,而负责执行任务的则是cpu。2 进程与程序程序只是程序员写的代码,而进程则是指程序的运行过程3 并发、并行和串行并发;你现在有做作业的任务,打游戏的任务,看电视剧的任务。但你同时只能做一件事情(cpu同一时间只能执行一个任务)。那如何才能产生并发的效果了?可以先做一会作业,再看一会电视剧,在打一会游戏,然后又做一会作业,再看一会电视剧。这样看起来就好像你同时在干多件事情。现在cpu有5个任务要执行,cpu同一时间只能执行一个任务。由于cpu的速度非常快原创 2020-06-21 03:58:26 · 143 阅读 · 0 评论 -
Python中sys模块的常用方法
import syssys.version # 返回Python解释程序的版本信息sys.platform # 返回操作系统名称sys.exit(n) # 退出程序,n为0时正常退出sys.path # 返回模块的搜索路径原创 2020-06-20 06:22:41 · 140 阅读 · 0 评论 -
Python中os模块的常用方法
os.getcwd() # 获取当前py文件所在的文件夹路径os.mkdir(path) # 创建一个单层级文件夹os.makedirs(path) # 创建一个多层级的文件夹os.rmdir(path) # 删除一个单层级的空文件夹,若文件夹不为空则报错os.removedirs(path) # 删除一个空文件夹(非空文件夹报错),然后递归返回该文件夹的上一级文件夹,如果上一级文件夹为空,则删除,然后重复之前的操作,直到上一级文件夹不为空os.listdir(path) # 以列表的形式返原创 2020-06-20 06:13:02 · 131 阅读 · 0 评论 -
Python中random模块的常用方法
Python中random模块的常用方法如下:import randomprint(random.randint(1,10))# 返回一个1-10之间的随机数,包含10print(random.randrange(1,10,2))#返回一个1-10之间的随机数,不包含10,第3个参数2表示步长print(random.random())#返回一个0-1之间的随机浮点数print(random.uniform(2,8)) # 返回一个2-8之间的随机浮点数print(random.choice(原创 2020-06-18 11:27:37 · 344 阅读 · 0 评论 -
Python中time模块的常用方法
Python中的time模块主要是用来处理时间和转换时间格式的具体的方法如下:import time#时间戳 从1970年1月1日开始,至现在经过了多少秒 返回float类型print(time.time()) # 1592449734.7376492# 上述也就是struct_time。这种结构具有如下属性:# 序号 属性 值# 0 tm_year 2008# 1 tm_mon 1 到 12# 2 tm_mday 1 到原创 2020-06-18 11:16:52 · 275 阅读 · 0 评论 -
Python中datetime模块的常用方法
Python中的datetime模块主要是针对时间的格式和操作,一些常用的方法如下:import datetimeprint(datetime.datetime.now()) # 格式化当前的时间 2020-06-18 08:19:13.357307print(datetime.datetime.fromtimestamp(1111111)) # 将一个时间戳转化为格式化的时间 1970-01-14 04:38:31 对时间进行加减print(datetime.datetime.now(原创 2020-06-18 08:25:57 · 545 阅读 · 0 评论 -
Python中的三元运算符、列表生成式、生成器表达式
1 三元运算符语法:条件成立返回值 if 条件 else 条件不成立返回值def max(a,b): return a if a > b else bprint(max(1,4)) # 结果为4 2 列表生成式列表生成式就是一种简化的生成列表的语法语法:表达式 for item in iterable if 条件生成1到10之间所有偶数平方的列表li = [i*i for i in range(1,10) if i%2==0 ]print(li) # [4,原创 2020-06-18 07:23:55 · 218 阅读 · 0 评论 -
Python中yield表达式
在函数中,我们可以通过yield不断的向外返回值,那如果我们想不断向函数内部传值应该怎么做了,Python中就可以通过yield表达式来实现。def speak(name): print("%s is begin" % name) while True: word = yield 111 print("%s say: %s" % (name,word))g = speak("LeiJun") # 返回生成器对象print(g.send(None)) #原创 2020-06-18 06:42:31 · 155 阅读 · 0 评论 -
Python中的生成器与yield
在Python中使用了yield关键字的函数称之为生成器。当我们调用该函数时并不会执行函数代码,而是返回一个生成器对象。在调用生成器运行的过程中,每次遇到yield函数就会暂停并保存当前的信息,返回yield值,并在下次执行next()时,从此处开始继续运行。from collections.abc import Iterable,Iteratordef lis(snum,enum,step): while snum <= enum: yield snum # 函数运行到原创 2020-06-18 06:24:22 · 119 阅读 · 0 评论 -
Python中的迭代器
1、什么是迭代器迭代,简单理解就是重复的做一些事。迭代器通过__next__()方法访问可迭代对象,从第一个元素开始访问,直到所有的元素都被访问才结束。迭代器只能前进不能后退。使用迭代器不需要事先准备好整个迭代过程中的所有元素。迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后元素可以不存在或者被销毁。因此迭代器适合遍历一些数量巨大序列。2、可迭代对象在Python中,内置有__iter__()或者__getitem__()方法的对象都可以称为可迭代对象。iter()的作用是可以通过for循环原创 2020-06-18 05:43:37 · 143 阅读 · 0 评论 -
Python中的闭包
当我们在定义嵌套函数的时候,内部函数可以访问所在外部函数中的局部变量和参数。当我们把内部函数返回到外面,在外面调用内部函数时,内部函数仍然会优先访问其所在外部函数中的局部变量,这种现象就称之为闭包。num = 2def outer(): num = 1 def inner(): print("num的值为",num) return innerres = outer()res() # 这里相当于执行了inner()输出结果为“num的值为 1”。这说明返原创 2020-06-18 00:03:26 · 80 阅读 · 0 评论 -
Python中的命名空间和作用域
1 命名空间命名空间是用来存放名字与对象绑定关系的。比如a=1,Python会申请内存空间存放对象1,然后将x与1的绑定关系存放在命名空间中。Python的命名空间是相互独立的。同一命名空间中不能有重名,不同的命名空间中可以有重名。就像同一个文件夹下不能存在相同的文件名,但不同的文件夹下可以存在相同的文件名。Python中的三种命名空间内置命名空间(built-in):存放Python的内置函数全局命名空间(global):模块中定义的变量,函数,类局部命名空间(local):函数中定义的变量原创 2020-06-17 23:45:10 · 126 阅读 · 0 评论 -
Python中的super()函数
在继承关系中,我们通常重写某一方法来覆盖父类的方法。但有时候又需要使用父类中的方法,super()函数就派上用场了。class Animal(object): def __init__(self,name,age,height,weight): self.name = name self.age = age self.height = height self.weight = weightclass Dog(Animal):原创 2020-06-09 20:08:40 · 122 阅读 · 0 评论 -
抽象基类——abc模块
抽象基类就是定义各种方法而不做具体实现的类,任何继承自抽象基类的类必须实现这些方法,否则无法实例化。抽象基类不能被实例化(不能创建对象),通常是作为基类供子类继承,子类中重写虚函数,实现具体的接口。import abcclass Animal(metaclass=abc.ABCMeta): @abc.abstractmethod def eat(self): pass @abc.abstractmethod def run(self):原创 2020-06-09 19:17:29 · 160 阅读 · 0 评论 -
Python中的反射
反射在Python中我们可以简单的理解为通过字符串来操作对象的属性和方法。Python中有4个与反射相关的方法getattr 获取属性值或者方法的内存地址setattr 设置属性或者方法hasattr 判断对象是否有某个属性或者方法,返回一个bool值delattr 删除对象的属性或者方法class Animal(object): def __init__(self, name, age): self.name = name s原创 2020-06-08 23:07:27 · 140 阅读 · 0 评论 -
Python中的类方法classmethod、静态方法staticmethod和属性方法property
1 类方法classmethodPython中可以通过装饰器@classmethod将一个方法变成类方法,类方法只能访问类变量,不能访问实例变量class Animal(object): name = "kitty" def __init__(self, name, age): print(self) self.name = name self.age = age @classmethod def run(self):原创 2020-06-08 22:01:42 · 216 阅读 · 0 评论 -
Python中函数的使用
函数是用来实现特定功能的一段代码块,可以重复利用,提高编程速度1 如何定义一个函数函数使用def关键字定义 ,后面接函数的名称和():,传入的参数放在()里面,如果没有参数则可以不传参数函数体由第二行起,并且要缩进如果需要返回值则在使用return关键字,如果没有return则默认返回Nonedef funcname(args): 函数体 return 返回值2 函数的调用语法: 函数名(args)如果函数没有参数,则括号内不用传参数def add(a,b) print('原创 2020-06-08 17:04:36 · 105 阅读 · 0 评论 -
Python中的序列化模块pickle和json
1 序列化的概念:序列化是指把内存当中的数据转换成bytes类型,使其能够存入硬盘或者通过网络进行传输2 序列化的应用场景:一个简单的例子就是我们打游戏的时候,如果碰到急事,需要暂停,或者关闭游戏,等事情解决完之后再继续游戏。这样就不用重新开始玩。这时就需要我们把当前游戏中相关的数据存储在硬盘中,等下次游戏开始的时候再从硬盘中把这些数据读取出来。3 pickle模块import pickledic = { "name":"zhangsan", "age":22}li = [原创 2020-06-05 07:11:22 · 134 阅读 · 0 评论 -
Python中的多态的理解
Python中的多态类具有继承关系,子类类型可以向上转型看做是父类类型class Animal(object): def __init__(self,name): self.name = name def speak(self): print("animal is speaking")class Dog(Animal): def __init__(self,name): self.name = name def sp原创 2020-06-04 22:22:05 · 329 阅读 · 0 评论