
python学习
卖火柴的可可萝
这个作者很懒,什么都没留下…
展开
-
协程
协程 协程简单的说就是在单线程下实现并发的效果的状态。协程实际是并不存在的事物,这是人们通过模拟cpu运行的方式,让单线程也能实现并发而创造的。 我们可以想一下cpu在遇到多个任务时是怎么做的。其实本质就是在多个任务之间来回的进行切换,由于cpu的切换速度过快,导致我们感受到仿佛一直在工作,现在我们就要模仿这个过程,让一个线程在遇到io操作的时候进行切换 ,去完成另一个任务,这与线程和进程的做法是一致的,唯一的区别就是这是由我们认为控制的,而线程于进程是由操作系统帮助我们控制的。 值得一提的是,原创 2020-08-26 08:28:39 · 124 阅读 · 0 评论 -
python线程
线程 若将进程比喻为一个工厂,那么线程就是其中的一个工人。 那么之前我们为了解决问题创建的多进程就等于创建了多个工厂,而每个工厂里面却只放入了一个工人,毫无疑问,这是一种非常浪费资源的现象。 接下来我们就来了解一下线程。首先我们来具体的了解下线程与进程的区别线程与进程的区别1.线程与进程相比占用的系统资源小很多2.线程共用进程的空间,进程则有自己的内存空间3.线程可以直接访问他们的父进程的数据,进程则是对他们的父进程进行了数据的副本复制4.线程与线程可以直接进行通讯,进程则必须使用进原创 2020-08-26 08:27:39 · 142 阅读 · 0 评论 -
python进程中队列的使用方法与生产者消费者模型
队列进程彼此之间本身是相互隔离的,如果要实现进程间通信,multiprocessing模块支持两种形式:队列和管道我们一般都以队列的方式去实现我们进程之间的通讯Queue(maxsize)#可以在初始化的时候设置最大能存几条数据q.put#存放数据的方式,每调用一次就可以存放一次 #两个参数 1.blocked#(阻塞) 配合timeout等使用,一般默认为True 2.timeout#若blocked为true,你设置该参数后,在一定时间内若队列为满,导致你的put()中的数无法原创 2020-08-24 14:41:49 · 406 阅读 · 0 评论 -
僵尸进程与孤儿进程(理论)
僵尸进程与孤儿进程(了解) 僵尸进程(有害): 僵尸进程的含义是在子进程死亡后的一个过程。僵尸进程本意是为了让父进程可以在任意时刻去查看子进程的状态信息,因此在子进程死亡后不会直接清除他的所有数据,会保留他的部分数据以及端口号。 但是这也导致了若是父进程是一个不断循环的进程的时候,端口被占用的情况会越来越多,这也导致我们可以使用的端口会变的越来越少。那么我们应该如何解决这个问题。 1.父进程死亡的时候,系统会让init接管这些子进程,并杀死这些僵尸进程,因此我们可以使用把父进程结束的方原创 2020-08-24 14:39:52 · 148 阅读 · 0 评论 -
守护进程&互斥锁
守护进程 守护进程的含义就是,有一个子进程,若是父进程优先该子进程结束,那么该子进程会在父进程结束的同时结束自己。这一般用于父进程结束后子进程的运行便无意义的情况 ps:守护进程的内部是无法在创建一个子进程的#守护进程from multiprocessing import Processimport timedef test(): print('====>test') time.sleep(2) print('====>test_end')if _原创 2020-08-24 14:39:15 · 149 阅读 · 0 评论 -
python创建进程的方式
多进程操作 在我们了解了进程的部分理论后,我们如何在程序中使用多进程呢。在python中提供了一个multiprocessing模块可以帮助我们使用多进程解决问题。 再multiprocessing模块中有一个类Process,它是我们这次的主角,下面是对这个类的参数介绍from multiprocessing import Process'''group=None, 为日后开发新功能准备 target=None, 目标任务name=None, 进程的姓名args=(), 目标任务原创 2020-08-24 14:37:27 · 417 阅读 · 0 评论 -
并发编程理论
并发编程什么是进程? 进程:正在进行的任务,负责执行任务的就是cpu进程与程序的区别 程序是一个具体的概念,例如qq就是一个程序。而进程则更像是一个抽象的概念。我们找不到一个具体的事物去描述它,它更像是一种过程。例如qq在运行的过程就可以被称为一个进程并发与并行 先不论并发与并行的具体过程,并发与并行在表现的形式上是一致的,在用户看起来都是同时运行的。 但是并发其实是用一种方法使人们看起来达到了并行的效果,本质还是一个cpu处理多个任务 并行则是同时处理任务,需要多个cpu才能实现原创 2020-08-24 14:34:41 · 154 阅读 · 0 评论 -
利用socketsever实现的TCP/UDP并发编程
socketseversocketsever模块的本质就是利用了并发的socket模块,客户端本身是不需要并发的,我们只要让服务端支持并发即可import socketserver#基于TCP协议class MySever(socketserver.BaseRequestHandler): def handle(self): while True: print('start') msg = self.request.recv(1原创 2020-08-18 15:37:49 · 248 阅读 · 0 评论 -
套接字的使用以及粘包问题的解决
套接字的使用socket的工作流程套接字工作流程如上图,我们可以很清晰的理解socket的工作流程服务器端: 1.首先我们初始化一个socket对象 2.其次与socket的接口绑定 3.我们使用listen()方法监听,(由于我们的项目在运行的时候可能会有多个客户端项目将数据传入,因此这个方法专门用来挂起不同的客户端对象) 4.准备接受客户端发来的连接请求(程序会一直暂停直到有客户端连接) 5.接受客户端的消息 6.回送给客户端消息 7.关闭连接或重复5,6两步客户原创 2020-08-18 08:02:31 · 507 阅读 · 0 评论 -
网络编程的理论概念
网络编程的理论概念什么是网络 网络:物理链接介质+各种通讯协议c/s架构(client/sever) 我们生活中处处都是c/s架构,b/s架构(Browser/Server)也是c/s架构的一种,这种架构简单的说就是服务器端与客户端的交互 而socket就是为了完成c/s架构的开发我们所使用的一种方式。osi七层osi七层分为哪几层呢: 应用层:(应用层,表示层,会话层合并为一层)http、ftp、自定义协议 传输层:tcp或udp协议(端口port) 网络层:ip协议(原创 2020-08-18 08:00:57 · 151 阅读 · 0 评论 -
深拷贝与浅拷贝
深拷贝与浅拷贝深拷贝只得是对一个数进行完全得拷贝,类似于备份得效果,在python中我们使用copy模块进行深copyimport copya=['aa',2,3,4,[1,2]]b = copy.copy(a)#浅copyc = copy.deepcopy(a)print(id(a[4]))print(id(b[4]))print(id(c[4]))>>>19618312>>>19618312>>>19773384原创 2020-08-11 08:39:41 · 86 阅读 · 0 评论 -
python反射
反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力例如我以前曾使用过: if type(test) == list: #填写代码 上述过程也就是一个反射的过程 在程序运行的时候,我们若获得一个不知道有何种属性的对象,如果想操作其内部属性,我们可以先通过一个内置函数dir()来获得任意一个类的各种属性以及方法class Student: def __init__(self,name,age):原创 2020-08-10 10:18:40 · 123 阅读 · 0 评论 -
继承与派生与多态性
继承与派生 在python中,新建的类可以继承一个或多个父类(有些语言不能继承多个父类),这种类可以被称为子类或派生类,父类则可以被称为基类或超类经典类与新式类 在python2中有经典类与新式类之分,然而在python3中则没有这种区分,统一为新式类。新式类与经典类最大的区别就是有无继承object类,在python3中不论是否显示继承object类,默认都是继承object类的class Parent: passclass Sub(Parent): passprint(S原创 2020-08-10 10:17:50 · 462 阅读 · 0 评论 -
封装_绑定方法
封装 综上所述:面向对象共有三种方法,继承与派生,多态性,以及最后的封装。封装指的是什么? 封装其实就是将数据与功能的整合,以及我们可以通过封装做到将封装对象的属性以及方法进行隐藏。如何隐藏 python中的Class通过使用双下划线的方式将属性隐藏class Test: def __init__(self,name,age): #本质是一种变形操作_self__name self.__name = name # _Test__name原创 2020-08-06 08:47:29 · 331 阅读 · 0 评论 -
面向对象
面向对象 首先,所有的程序都是由数据与功能两部分组成的。 因此编写程序的本质就是定义一系列的数据,然后定义一系列对应的功能对其操作 在我们学习面向对象之前,数据与功能是分开的# 数据:name、age、sexname='lili'age=18sex='female'# 功能:tell_infodef tell_info(name,age,sex): print('<%s:%s:%s>' %(name,age,sex))# 此时若想执行查看个人信息的功能,需原创 2020-08-06 08:45:31 · 138 阅读 · 0 评论 -
day15 生成器与迭代器以及面向过程的思想
迭代器 迭代:一次次对过程进行重复获得其中的结果,然后把该结果作为下一次运行的初始值,其中一次重复被称为一次迭代 例如下面的while循环,一次循环便被称为一次迭代。goods=['mac','lenovo','acer','dell','sony']index=0while index < len(goods): print(goods[index]) index+=1可迭代对象 个人理解:可以进行迭代操作的对象被称为可迭代对象迭代器对象 调用obj.i原创 2020-07-22 21:59:28 · 92 阅读 · 0 评论 -
day14 闭包&装饰器
闭包理解:按我个人的理解闭包就是一个内嵌函数在调用外面一个函数的变量名时被引用,那么这个内嵌函数就被称为闭包函数,简称闭包闭:代表函数是一个内嵌函数包:指的是该函数访问了一个来自于外层函数的变量为函数体传参的方式方案一:直接使用参数的形式传递方案二:把函数体想要的参数包给他闭包的用途理解:闭包主要运于在你无法动之前已经写的代码下,你想要为原函数传参,就可以使用闭包import requestsdef page(url): def get(): requests.原创 2020-07-21 18:32:49 · 136 阅读 · 0 评论 -
day12函数
函数函数的语法def: 定义函数的关键字;函数名:函数名指向函数内存地址,是对函数体代码的引用。函数的命名应该反映出函数的功能;括号:括号内定义参数,参数是可有可无的,且无需指定参数的类型;冒号:括号后要加冒号,然后在下一行开始缩进编写函数体的代码;“”“文档描述”"": 描述函数功能,参数介绍等信息的文档,非必要,但是建议加上,从而增强函数的可读性;与注释功能相同函数体:由语句和表达式组成;return 值:定义函数的返回值,return是可有可无的。函数原创 2020-07-20 09:47:00 · 105 阅读 · 0 评论 -
day11文件处理
文件处理#1.打开文件,由程序向系统调用open()方法,由操作系统打开文件,将硬盘的一部分分配给它,最后将一个文件对象赋值给f(等于那个被打开的文件)f = open('a.txt','r',encoding='utf-8')#三个参数含义分别为1.你需要打开的文件2.读写权限3.编码类型data = f.read()#文件对象的读方法,会被操作系统转换为读的操作f.close()#向操作系统发起关闭文件的请求,回收系统资源print(data)>>>qaqwith关键字原创 2020-07-16 20:47:20 · 110 阅读 · 0 评论 -
day09集合与字符编码
集合集合主要作用有:去重、关系运算s = {1,2,3,4}本质s = se({1,2,3,4})t与字典相比少了键值对,并且集合它本身并不存在索引a = {} 默认是字典而不是集合a=set() 这才是集合与字典,元组,列表一样 但是集合内的值必须是不可变类型的值集合内的元素也是无序的集合的关系运算#1.合集/并集(|)代表并集,两者没有交集的部分+重复的部分会保留一个a = {1,2,3,4}b={3,4,5,6}print(a|b)>>>{1, 2, 3, 4原创 2020-07-14 20:47:57 · 100 阅读 · 0 评论 -
day08列表,字典等的使用方法
了解系列a='sadnesspineapple'#center()两个参数,第一个为总参数,第二个是不够时填得字符串print(a.center(30,'-'))>>>-------sadnesspineapple-------#ljust()同上,不过是填得左边。print(a.ljust(30, '-'))>>>sadnesspineapple--------------#rjust,填右边#zfill,只有一个参数,用来填宽度。若字符串长度不够原创 2020-07-13 22:11:58 · 110 阅读 · 0 评论 -
day07字符串的常用操作
可变类型与不可变类型可变数据类型:值发生改变时,id不变,证明只是改变了原值—》id与值不绑定,可以任意的修改值不可变类型:值发生改变时,id发生改变 ,证明是产生了新的值 —》id与值绑定,id变化的同时代表变量绑定了一个新的对象,与原对象无关ps:即改变值得同时id也变化得则是不可变数据类型,改变值的时候id不变的则是可变数据类型数据类型可变/不可变整型不可变字符串不可变元组不可变列表可变集合可变字典可变基本数据类型及内置方法原创 2020-07-10 18:47:59 · 134 阅读 · 0 评论 -
day05逻辑运算符等内容
链式赋值 例如x=y=z=10交叉赋值例如m=10,n=6m,n=n,m(6,10)解压赋值 把列表中的多个值取出来依次赋给多个变量名,可以使用此方法 设nums=[1,2,2,2,2,2,3] a,b,c,d,e,f,g=numsPS:等号左边的变量名个数必须与右边包含的值相同,否则会报错若只想取头尾值可以用*_替换例子: nums=[1,2,3,4,6,5] a,*__,b=nums _放开头代表废弃 print(a,b) >>>1,原创 2020-07-08 17:26:13 · 121 阅读 · 0 评论 -
day04 常量与基本数据类型等内容
语言的类型 1.强类型动态语言————数据类型不可以被忽略的语言 即变量的数据类型一旦被定义,就不会改变,除非进行强转。 2.弱类型动态语言————数据类型可以被忽略的语言 比如Linux中的shell定义一个变量,是随着调用方式的不同,数据类型是可以随时变化的动态型或静态型动态语言————即在变量赋值时,才确定变量的数据类型,不用事先给变量指定数据类型静态语言————需要事先给变量进行数据类型定义PS:python是解释型的强类型动态语言常量 不会改变的值,程序运行时不应该被改变的值原创 2020-07-08 17:25:26 · 97 阅读 · 0 评论 -
运行python程序的两种方式
运行python程序的两种方式 交互式 特点:敲一行代码回车会立刻执行,立即看到结果 作用:用于调试程序 脚本的方式 把程序写到文件中永久保存 然后使用命令行运行 运行python的三个步骤 1.先启动python解释器 2.python解释器将文件内容读入内存 3.python解释器开始解释执行读入内存的内容,开始识别python内容变量1.什么是变量? 量:事物的状态 变:事物的状态是可以被改变的2.为何要用变量 为了让计算机原创 2020-07-08 17:24:56 · 1734 阅读 · 0 评论 -
day02-计算机硬件基础知识普及与操作系统
day02-计算机硬件基础知识普及与操作系统1.计算机硬件基础知识RAM:可读可写的内存ROM:只读内存 存储BIOS程序CMOS:可充当硬盘,断电数据丢失,但耗电量极低PS:CPU,ROM,CMOS用来运行BIOS程序BIOS是操作系统硬盘详解7200转/60s重点:转一圈花费:8ms平均延迟:4ms寻道延迟:5msIO设备一般包括两个部分:设备控制器和设备本身(就是指可以与计算机进行数据传输的硬件)设备控制器:设备控制器是计算机中的一个实体,其主要职责是控制一个或多个I/O设原创 2020-07-08 17:24:28 · 183 阅读 · 0 评论 -
## day01 计算机硬件组成与工作原理
什么是编程语言?人类与计算机沟通的语言。什么是编程?人类把做事的逻辑与计算机用编程语言沟通的过程。什么是程序?存放有程序代码的文件就是程序。为什么要编程?为了让计算机帮助人类工作,解放人力。计算机有五大组成部分1.控制器用来控制计算机其他组件的运行2.运算器是计算机的运算功能,用来做算数运算和逻辑运算3.存储器存储器用来存储数据。主要分为内存和外存内存相当于人短期记忆。断电数据丢失外存(磁盘)断电数据不会丢失,用来永久保存数据内存存取速度要远远高于外存4.输入设备计算机原创 2020-07-08 17:22:03 · 132 阅读 · 0 评论