- 博客(52)
- 问答 (1)
- 收藏
- 关注
原创 Day31 Socketserver
如何创建一个socketserver:1. 创建一个请求处理的类,并且这个类要继承BaseRequestHandler class ,并且还要重写父类里handle()方法(handle方法默认结束后断开链接继续监听)2. 必须实例化 TCPServer,并且传递server IP和上面创建的请求处理类,给这个TCPServer;3. Server对象调用server.handle_requese()(只处理一个请求)或server.server_forever()(处理多个一个请求,永远执行)。
2023-07-17 14:46:59
97
原创 Day30 Socket原理和粘包
综上所述,粘包出现的原因是在于接收端不能对这些数据包进行正确切割,因为接收端并不知道这些0101字节流的分界在哪,切多切少都会产生粘包,所以说解决办法的思路就是让接收端可以根据其他信息来识别出数据的边界,从而正确还原回原始消息。应用层交给UDP多长的报文,UDP都会一次发送,即使长度过长,也不考虑,因为IP层会出手。在前面也讲到TCP把数据发过去的时候,接收端可能没来得及接收导致数据粘连,类似的情况也会发生在UDP身上,但如果UDP添加了一个长度字段,等于有了一个数据边界,就不会产生粘包了。
2023-07-10 17:54:05
144
原创 Day29 网络基础
在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。(还有AF_INET6被用于ipv6,还有一些其他的地址家族,不过,他们要么是只用于某个平台,要么就是已经被废弃,或者是很少被使用,或者是根本没有实现,所有地址家族中,AF_INET是使用最广泛的一个,python支持很多种地址家族,但是由于我们只关心网络编程,所以大部分时候我么只使用AF_INET)
2023-07-01 21:44:19
109
原创 Day29 异常处理
class EgonException(BaseException): # 必须继承BaseException类try:raise EgonException('类型错误') # 主动触发异常print(e)只有在有必要的时候才定义我们自己的错误类型。如果可以选择Python已有的内置错误类型,尽量使用Python内置的错误类型。raise语句如果不带参数,就会把当前错误原样抛出。在except中raise一个Error,可以把一种类型的错误转化为另一种类型(只要是合理的转换逻辑)。
2023-07-01 20:45:55
87
原创 Day28 描述符应用与类的装饰器
属性的方法名不要和实例变量重名,通过实例.方法调用的时候,会首先转换为方法调用,但在执行return self.gender时,又视为访问self的属性,于是又转换为方法调用,造成无限递归,最终导致栈溢出报错RecursionError。type()函数既可以返回一个对象的类型,又可以创建出新的类型,比如,我们可以通过type()函数创建出Hello类,而无需通过class Hello(object)...的定义。它可以控制类的创建,可以控制类的属性和方法,还可以控制类的继承。
2023-06-30 23:48:00
63
原创 Day27 面向对象进阶
如果产生的对象仅仅只是python程序级别的(用户级),那么无需定义__del__,如果产生的对象的同时还会向操作系统发起系统调用,即一个对象有用户级与内核级两种资源,比如(打开一个文件,创建一个数据库链接),则必须在清除对象的同时回收系统资源,这就用到了__del____slots__定义的属性仅对当前类实例起作用,对继承的子类是不起作用的,除非子类也定义了__slots__,这样,子类实例允许定义的属性就是自身的__slots__加上父类的__slots__更多的是用来作为一个内存优化工具。
2023-06-29 00:12:56
32
原创 Day26 多态、封装、反射
但对于Python这样的动态语言来说,则不一定需要传入Animal类型,只需要保证传入的对象有这个方法就可以,如Animal中有一个方法run(),创建一个新对象Timer(不继承于Animal),也有一个run()方法,也是可以调用。封装的真谛在于明确地区分内外,封装的属性可以直接在内部使用,而不能被外部直接使用,然而定义属性的目的终归是要用,外部要想用类隐藏的属性,需要我们为其开辟接口,让外部能够间接地用到我们隐藏起来的属性。四个可以实现自省的函数,可以直接操作一个类或对象的状态。
2023-06-27 12:07:41
52
原创 Day24 面向对象与实例属性
实例化的过程实际就是执行__init__的过程,这个函数内部只是为实例本身即self设定了一堆数据,所以实例只有数据属性,给实例绑定属性的方法是通过实例变量,或者通过self变量。直接在class中定义属性,这种属性是类属性,归类所有,但类的所有实例都可以访问到。实例化:由类生产对象的过程称之为实例化,类实例化的结果是一个对象或一个实例。类:把一类事物的相同特征和动作整合到一起的就是类,类是一个抽象的概念。通过点.来调用得到的要么是实例属性,要么是类属性。对象:就是基于类而创建的一个具体的事物。
2023-06-16 15:37:35
46
原创 Day22 常用模块
出现这种情况的时候,如果想要在bin.py中调用my_module包中的模块,可以首先通过sys.path查看文件模块搜索路径(pycharm会添加day21_lesson的路径),在其他环境中不一定添加有该路径,所以可能需要在bin中添加day21_lesson的路径,使用sys.path.append(r'路径\day21_lesson')但这样不易于移植,使用os.path.dirname(basename则是获取文件名)来获取当前文件的上级目录的绝对路径。
2023-06-15 17:13:10
46
原创 Day21 模块与包
把函数中具有相同功能的部分抽离出来作为新的函数,提高可读性和代码可维护性一个python文件有两种使用方法1.直接作为脚本执行 python xx.py2.在其他Python脚本中导入作为模块调用执行 import xx文件中最好只写功能,可执行部分都放到 if __name__ == '__main__'中当.py文件以模块形式被导入时,if __name__ == '__main__'之下的代码块不被运行。
2023-06-13 14:24:38
53
原创 Day20 函数闭包与装饰器
并且同时使用*args和**kwargs时,必须*args参数列要在**kwargs前,像foo(a=1, b='2', c=3, a', 1, None, )这样调用的话,会提示语法错误“SyntaxError: non-keyword arg after keyword arg”。:在函数嵌套的前提下,内部函数使用了外部函数的变量,并且外部函数返回了内部函数,则把这个使用外部函数变量的内部函数称之为闭包。在闭包函数内部,想要修改外部函数的局部变量,则使用nonlocal关键字。使用高阶函数实现装饰器。
2023-06-11 16:06:40
69
原创 Day19 生成器
生成器就是迭代器:自动实现迭代器(必须提供Next()方法)协议,所以通过next()方法进行取值。只要函数内部包含有yield关键字,那么函数名()的到的结果就是生成器,并且不会执行函数内部代码。x = yield另外一个特性:接收send传送过来的值,赋值给上一次停留的yield。yield:相当于return,可以保存函数运行状态。优点一:延迟计算,对于大数据量处理友好,节省内存。【return方法占空间大,效率低】【eval()可以把类型转换字典】
2023-06-10 20:46:31
63
原创 Day18 文件处理与三元运算
迭代器协议:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代(只能往后走,不能往前走)字符串、列表、元组、字典、集合、文件对象等这些都不是可迭代对象,只不过在for循环时,调用了他们内部的__iter()__方法,把他们变成了可迭代对象。:常规函数定义,但是用yield语句返回结果,一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次从它离开的地方继续执行。sum()、min()、max()等内置函数也是实现了迭代器协议。
2023-06-07 14:11:01
41
原创 Day16 函数式编程与内置函数
1.作用域即范围2.作用域关系是在函数定义阶段就已经固定的,与函数的调用位置无关3.查看作用域,LEGB 代表名字查找顺序: locals -> enclosing function -> globals -> __builtins__
2023-06-06 14:40:59
34
原创 Day8 Linux软件包管理
删除:yum erase 包名yum makecache:制作缓存,下一次不需要重新读取多个源\mv * /tmp/bak/ : \不用任何提示yum网络源进行下载安装后,会自动把软件包清理,若需要保存软件包,则修改下面文件源码安装步骤:下载包——>解包——>运行config脚本,添加编译参数,编译(gcc glibc) make——>make install 安装./configure --prefix=/usr/local/python3.5 指定安装地址。
2023-06-05 14:42:12
66
原创 Day7 Linux ip地址虚拟网络
ifconfig:查看已激活网卡的信息给网卡配置IP地址service network restart:重启网络服务网卡信息文件】依次是如果想要永久配置IP地址则修改后要重启网络服务才能生效(把ONBOOT改为yes),同时把守护进程关闭但这个守护进程下一次开机的时候还是默认开启chkconfig命令:主要用来更新(启动或停止)和查询系统服务的运行级信息。谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接。
2023-06-05 14:26:33
73
原创 Day6 Linux磁盘管理
此时还不能真正使用,还需要格式化mkfs.ext4(centos 6)制作文件系统,到这里还只是对硬件进行处理,实际使用中我们是使用目录对文件进行操作,所以需要把对应盘映射到某个目录中,对目录进行操作就是对对应盘进行操作,这个就叫做挂载。dd写数据,输入文件是/dev/zero,输出文件是/sdb5/test,大小是1个G,总计1个文件,可以用来写数据,也可以用来测试硬盘写入速度。mount /dev/sdb1 /sdb1:将分区/dev/sdb1挂载到指定目录/sdb1。
2023-06-05 14:08:26
49
原创 Day5 Linux文件操作进程管理
实现数据的重复使用,速度慢的设备需要通过缓存将经常要用到的数据缓存起来,缓存下来的数据可以提供高速的传输速度给速度快的设备。内存在用的时候就是使用buffer和cache,第一行中的used就是分配给buffer和cache的量,后面的buffers和cached是已经分配但还没使用的,第二行的used才是真正的目前内存使用量。grep 是查找含有指定文本行的意思,比如grep 'test' 就是查找含有test的文本的行。进程使用的、未被换出的物理内存大小,单位kb。
2023-06-04 18:10:25
55
原创 Day4 Linux用户权限与组
每个用户的初始组只能有一个,通常就是将和此用户的用户名相同的组名作为该用户的初始组。比如说,我们手动创建用户 odysee,在建立用户odysee同时,就会建立odysee组作为odysee用户的初始组。每个用户只能有一个初始组,除初始组外,用户再加入其他的用户组,这些用户组就是这个用户的附加组。附加组可以有多个,而且用户可以有这些附加组的权限。用户在被创建的时候会同时创建一个同名的组,组密码存放在/etc/gshadow。用户可以加入多个其他的用户组,并拥有这些组的权限。chown 属主.属组 参数。
2023-06-04 17:47:26
60
原创 Day14 集合与函数
参数收集所有未匹配的位置参数组成一个tuple对象,局部变量args指向此tuple对象**参数收集所有未匹配的关键字参数组成一个dict对象,局部变量kwargs指向此dict对象。
2023-05-27 18:10:23
46
转载 Linux命令(十)学习笔记
一.df命令linux 中 df 命令的功能是用来检查 linux 服务器的文件系统的磁盘空间占用情况。可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息。df 命令是 disk free 的缩写。(1)命令格式df [选项] 文件(2)常用参数参数 描述 -a 全部文件系统列表 -h 方便阅读方式显示 -i 显示 i...
2018-08-03 20:45:56
185
转载 Linux命令(九)学习笔记
一.comm命令通常比较文本文件的内容很有帮助。对于系统管理员和软件开发者来说,这个尤为重要。一名系统管理员可能,例如,需要拿现有的配置文件与先前的版本做比较,来诊断一个系统错误。同样的,一名程序员经常需要查看程序的修改。comm 命令将逐行比较已经排序的两个文件。显示结果包括 3 列:第 1 列为只在第一个文件中找到的行,第 2 列为只在第二个文件中找到的行,第 3 列为两个文件的共有行...
2018-08-03 20:30:35
230
转载 Linux命令(八)学习笔记
一.sort命令同文本文件打交道时,总避不开排序,那是因为对于文本处理任务而言,排序(sort)可以起到不小的作用。sort 命令能够帮助我们对文本文件和 stdin 进行排序操作。通常,它会结合其他命令来生成所需要的输出。(1)命令格式sort [选项] [文件名](2)常用参数参数 描述 -n 基于字符串的长度来排序,使用此选项允许根据数字值排序,而不是...
2018-08-03 19:05:51
232
原创 git基本命令小结
git config:配置相关信息 git clone:复制仓库 git init:初始化仓库 git add:添加更新内容到索引中 git diff:比较内容 git status:获取当前项目状况 git commit:提交 git branch:分支相关 git checkout:切换分支 git merge:合并分支 git reset:恢复版本 git log:查看...
2018-08-02 18:11:24
218
转载 Linux命令(七)学习笔记
一.cut命令cut 命令是一个将文本按列进行切分的小工具,它可以指定分隔每列的定界符。如果一行数据包含多个字段(多列),现在想要提取其中的一列或多列,这是 cut 命令就可以大显身手了。(1)命令格式cut [选项] [文件名](2)常用参数参数 描述 -b 以字节为单位进行分割 -c 以字符为单位进行分割 -d 自定义分隔符,默认...
2018-08-02 17:01:45
176
转载 Linux命令(六)学习笔记
一.wc命令wc 命令是一个统计的工具,主要用来显示文件所包含的行、字和字节数。wc 命令是 word count 的缩写。(1)命令格式wc [选项] [文件](2)常用参数参数 描述 -c 统计字节数 -l 统计行数 -m 统计字符数,这个标志不能与 -c 标志一起使用 -w 统计字数,一个字被定义为由空白、跳格或换行字...
2018-08-02 16:33:45
204
转载 Linux命令(五)学习笔记
一.find命令find 命令(一)find 命令主要作用是沿着文件层次结构向下遍历,匹配符合条件的文件,并执行相应的操作。Linux 下 find 命令提供了相当多的查找条件,功能很强大,对应的学习难度也比较大。(1)命令格式find [选项] [搜索路径] [表达式]默认路径是当前目录,默认表达式为-print。表达式可能由下列成份组成:操作符、选项、测试表达式以及...
2018-08-02 11:54:49
304
转载 Linux命令(四)学习笔记
1.which命令which 命令的作用是,在 PATH 变量指定的路径中搜索可执行文件的所在位置。它一般用来确认系统中是否安装了指定的软件。(1)命令格式which 可执行文件名称什么是命令?命令可以是下面四种形式之一: 是一个可执行程序,就像我们所看到的位于目录/usr/bin 中的文件一样。 属于这一类的程序,可以编译成二进制文件,诸如用 C 和 C++语言写成...
2018-08-02 11:18:23
162
转载 Linux命令(三)学习笔记
一.more命令more 命令,功能类似 cat ,cat 命令是将整个文件的内容从上到下显示在屏幕上。 more 命令会一页一页的显示,方便使用者逐页阅读,而最基本的指令就是按空白键(space)往下一页显示,按 b 键就会往回(back)一页显示,而且还有搜寻字串的功能 。more 命令从前向后读取文件,因此在启动时就加载整个文件。(1)命令格式more [选项] 文件(2...
2018-07-20 22:28:54
300
转载 Linux命令(二)学习笔记
一.mkdir命令mkdir 命令用来创建指定名称的目录,要求创建目录的用户在当前目录中具有写权限,并且指定的目录名不能是当前目录中已有的目录。 mkdir 命令是 make directory 的缩写。(1)命令格式mkdir [选项] 目录(2)常用参数参数 描述 -m --mode=模式 设定权限<模式> -p --parents ...
2018-07-19 11:49:46
402
空空如也
新手求教关于STL stack应用问题
2017-05-01
TA创建的收藏夹 TA关注的收藏夹
TA关注的人