复习:之前的内容
一、报错后的解决方法:
报错如何解决:
try: print(111) l = [] l[2] int('a') print(222)except ValueError: print('报错了')
except IndexError: print('baocuole')
结果:
111
baocuole
try: print(111) l = [] l[2] int('a') print(222)except ValueError as e :print(e)except IndexError :print('索引不存在')#list index out of range
报错解决:
总结:try
excpet
except as
找到一个满足条件的其他分支都不走了
预料不到的是万能异常:
try: print(111) l = [] l[2] int('a') print(222)except: print('出错了')
第二种写法:
缺点:不知道那里出问题了可以加上as 推荐使用
try: print(111) l = [] l[2] int('a') print(222)except Exception as e : print(e) #list index out of range
具体的异常处理+万能的异常:
#能够提前预料到的异常都应该具体的异常处理, 剩下的其他异常用万能异常控制
#万能异常应该卸载最后
except和else是互斥的如果执行了except那么else将不执行
try: l = [1] num = int(input('num:')) l[num]except ValueError:print('请输入一个数字')except IndexError:print('您要找的项目不存在')except Exception as e :print(e) #万能异常要写在最下面
else: print('执行else了')#num:0 #执行else了 #如果执行try中的代码没有报错,那么就执行else中的代码了
例如发邮件成功之后
def func(): try: f = open('aaa','w') ret = f.read() return ret except: print('error') finally: f.close()
finally优先级高于return一定会关闭,多用于关闭程序减轻内存
Raise 主动抛异常
不常用,这个方法
Raise ValueError
断言:
assert 1 ==2 # if条件判断
类似 if not 1==2:exit()
assert 1==2# assert 1==2 如果是1==1就可以了#AssertionError
总结:
try except else finally
raise 错误类型 自定义异常 自定义一个类继承BaseExecption
断言 看源码
二、模块的使用和定义:
定义:就是py文件的导入 import 导入就能用的
导入模块:
起一个别名:
从一个模块同时导入多个模块:
导入所有的
*和 __all__联合使用的,比如不想让使用某个功能,all中的是可以使用的
总结:
From import
任然会执行行整个文件
文件中的名字会被存储在一块独立的内存空间中
Import 后面的名字会出现在全局
相当于对独立命名空间中的一个引用
From import也支持as 导入多个名字
From import * 相当于导入所有名字 *和__all__配合使用是互相影响的
三、包的定义和使用:
一组py文件组成的文件夹,在这个文件夹里有一个__init__.py的包
四、网络编程:
服务器端
import socketsk = socket.socket() #买手机sk.bind(('198.9.6.115',9000))#安装电话卡sk.listen()#开机conn,addr = sk.accept() # 等待来电话conn.send(b'hello') #说了一句话helloconn.close() # 挂断电话sk.close() # 关机
客户端
import socketsk = socket.socket()sk.connect(('198.9.6.115',9000))print(sk.recv(1024)) #接受一个数据大小sk.close()
双向发送和接收
Server端:
import socketsk = socket.socket() #买手机sk.bind(('198.9.6.115',9000))#安装电话卡sk.listen()#开机conn,addr = sk.accept() # 等待来电话conn.send(b'hello\n world') #说了一句话helloprint(conn.recv(1024)) #接受conn.close() # 挂断电话sk.close() # 关机
Client端:
import socketsk = socket.socket()sk.connect(('198.9.6.115',9000))print(sk.recv(1024)) #接受一个数据大小sk.send(b'bye') # 发送sk.close()
服务端:
import socketsk = socket.socket() #买手机sk.bind(('198.9.6.115',9000))#安装电话卡sk.listen()#开机conn,addr = sk.accept() # 等待来电话 三次握手while True: msg = input('>>>') conn.send(msg.encode('utf-8')) #说了一句话hello if msg =='q':break ret = conn.recv(1024).decode('utf-8') if ret =='q':break print(ret)conn.close() # 挂断电话sk.close() # 关机
客户端:
import socketsk = socket.socket()sk.connect(('198.9.6.115',9000))while True: ret = sk.recv(1024).decode('utf-8')#接受一个数据大小 if ret =='q':break print(ret) msg = input('>>>') sk.send(msg.encode('utf-8')) # 发送 if msg =='q':breaksk.close()
如果要和另外一个聊就需要在家一个while True在服务端
Server端:
import socketsk = socket.socket() #买手机sk.bind(('198.9.6.115',9001))#安装电话卡sk.listen()#开机while True: conn,addr = sk.accept() # 等待来电话 三次握手 while True: msg = input('>>>') conn.send(msg.encode('utf-8')) #说了一句话hello if msg =='q':break ret = conn.recv(1024).decode('utf-8') if ret =='q':break print(ret) conn.close() # 挂断电话sk.close() # 关机
客户端:
import socketsk = socket.socket()sk.connect(('198.9.6.115',9001))while True: ret = sk.recv(1024).decode('utf-8')#接受一个数据大小 if ret =='q':break print(ret) msg = input('>>>') sk.send(msg.encode('utf-8')) # 发送 if msg =='q':breaksk.close()
UDP的连接:
最简单的
Server端:
import socketsk=socket.socket(type=socket.SOCK_DGRAM)sk.bind(('127.0.0.1',8899))msg,addr = sk.recvfrom(1024)print(msg)sk.close()
Client端:
import socketsk = socket.socket(type=socket.SOCK_DGRAM)sk.sendto(b'hello',('127.0.0.1',8899))sk.close()
服务器:
import socketsk = socket.socket(type=socket.SOCK_DGRAM)sk.bind(('127.0.0.1',8898))msg,addr = sk.recvfrom(1024)sk.sendto(b'byebye',addr)print(msg)sk.close()
客户端:
import socketsk = socket.socket(type=socket.SOCK_DGRAM)sk.sendto(b'hello',('127.0.0.1',8898))msg,addr = sk.recvfrom(1024)print(msg)sk.close()
Input:
Server
粘包:
只会发生在TCP协议中
解决粘包问题:
Server端
import socketimport structsk = socket.socket()sk.bind(('127.0.0.1',9000))sk.listen()conn,addr = sk.accept()inp = input('>>>').encode('utf-8')chang = len(inp)bytes_msg = struct.pack('i',chang)conn.send(bytes_msg)conn.send(inp)conn.send(b'alex')conn.close()sk.close()
Client端:
import socketimport structsk = socket.socket()sk.connect(('127.0.0.1',9000))num = sk.recv(4)num = struct.unpack('i',num)[0]print('------1',sk.recv(num).decode('utf-8'))print('-----------2',sk.recv(num).decode('utf-8'))#jieshoushujusk.close()