目录
前言
本文依据黑马程序员python教程编写,适合快速了解用法和功能。
捕获异常(处理bug)
当我们的程序遇到了BUG,有两种情况:
①整个程序因为一个BUG停止运行
②对BUG进行提醒,整个程序继续运行
捕获异常的作用在于:提前假设某处会出现异常,做好提前准备,当真的出现异常的时候,可以有后续手段。
集成代码
以下代码包含多指定,多个,所有异常的捕获写法 和 else ,finally的用法
try:
a = 10 / 0
print(name)
except ZeroDivisionError:#捕获指定的异常
print("Error: division by zero")
except (NameError,ZeroDivisionError ) as e: #捕获多个异常
print("Error:", e)
print("Error: name not defined or division by zero")
except Exception as e: #捕获所有异常
print("Error:", e)
print("Error type:", type(e))
else: #如果没有异常发生,则执行else块中的代码
print("No error occurred")
finally: #无论是否有异常,都会执行finally块中的代码
print("Finally block executed")
异常的传递
下图所展示的就是我们日常报错会提示多行代码有问题的原因。
当程序出现这种长窜的报错时,我们需要从最底部报错提示开始检查代码问题(个人理解:因为程序安装代码顺序执行的,所以会一直从报错点开始打印一直打印到根源处问题。)
模块
概念
什么是模块
Python模块(Module),是一个Python文件,以.py结尾.模块能定义函数,类和变量,模块里也能包含可执行的代码.
模块的作用:python中有很多各种不同的模块,每一个模块都可以帮助我
们快速的实现一些功能,比如:实现和时间相关的功能就可以使用time模块
我们可以认为一个模块就是一个工具包,每一个工具包中都有各种不同的
工具供我们使用进而实现各种不同的功能
大白话:模块就是一个Python文件,里面有类、函数、变量等,我们可以
拿过来用(导入模块去使用)
基本写法
闭包
以下图片的解释。
inner函数作为参数传递(python的一种写法)
变量fn1,fn2的类型为函数,每次出现都相当于调用 一次内部函数
优缺点
优点,使用闭包可以让我们得到:
·无需定义全局变量即可实现通过函数,持续的访问、修改某个值
·闭包使用的变量的所用于在函数内,难以被错误的调用修改
缺点:
·由于内部函数持续引用外部函数的值,所以会导致这一部分内存空间不被释放,一直占用内存
小结
进程和线程
概念
进程、线程
现代操作系统比如Mac OS X,UNIX,Linux,Windows等,都是支持"多任务”的操作系统。
进程:就是一个程序,运行在系统之上,那么便称之这个程序为一个运行进程,并分配进程D方便系统管理。
线程:线程是归属于进程的,一个进程可以开启多个线程,执行不同的工作,是进程的实际工作最小单位。
进程就好比一家公司,是操作系统对程序进行运行管理的单位
线程就好比公司的员工,进程可以有多个线程(员工),是进程实际的工作者
操作系统中可以运行多个进程,即多任务运行
一个进程内可以运行多个线程,即多线程运行
注意点:
进程之间是内存隔离的,即不同的进程拥有各自的内存空间。这就类似于不同的公司拥有不同的办公场所。
线程之间是内存共享的,线程是属于进程的,一个进程内的多个线程之间是共享这个进程所拥有的内存空间的。
这就好比,公司员工之间是共享公司的办公场所。
小结
1.什么是进程
程序在操作系统内运行,即成为一个运行进程
2.什么是线程
进程内部可以有多个线程,程序的运行本质上就是由进程内部的线程在实际工作的
3.什么是并行执行
多个进程同时在运行,即不同的程序同时运行,称之为:多任务并行执行
一个进程内的多个线程同时在运行,称之为:多线程并行执行
基本语法
测试代码
import threading
def sing(msg):
while True:
print(msg)
def dance(msg):
while True:
print(msg)
if __name__ == '__main__':
#创建线程
# sing_thread = threading.Thread(target=sing)
# dance_thread = threading.Thread(target=dance)
# #创建线程,设置参数
sing_thread = threading.Thread(target=sing, args=('啦啦啦',)) # 注意这里的args参数,是元组形式,最后的逗号不可省略
dance_thread = threading.Thread(target=dance, args=('舞蹈',))
#开始线程
sing_thread.start()
dance_thread.start()
Socket工具 (客户端和服务端)
socket概念
客户端和服务端
服务端代码实现基本步骤
测试代码
import socket
#创建socket对象
socket_sever = socket.socket()
#绑定socket_sever到指定的ip和端口
#这里绑定的是本地的127.0.0.1和8080端口
#如果要让外网连接到这个端口,需要将ip改成公网ip地址
#注意端口号可能被某些程序占用,可以尝试其他端口
socket_sever.bind(('127.0.0.1', 8080))
#监听连接
#这里的3表示可以同时连接的客户端数量
socket_sever.listen(3)
#等待客户端连接
while True:
#接受客户端连接
client_socket, client_addr = socket_sever.accept()
print(f"客户端{client_addr}已连接")
#接收客户端发送的数据
#这里的1024表示一次接收的最大字节数,decode('utf-8')表示将字节码解码成字符串
#这里的recv方法是阻塞的,如果没有客户端连接,会一直等待
data = client_socket.recv(1024).decode('utf-8')
#打印接收到的数据
print(f"接收到的数据:{data}")
if data == 'exit':
break
#发送数据给客户端
# 这里的b'Hello, client!'表示要发送的字节码
# client_socket.send(b'Hello, client!')
msg =input("请输入要发送的数据:").encode('utf-8')
client_socket.send(msg)
#关闭客户端连接
client_socket.close()
#关闭服务器连接
socket_sever.close()
客户端代码实现基本步骤
测试代码
import socket
#创建socket对象
sockert_client = socket.socket()
#连接服务器
sockert_client.connect(('127.0.0.1', 8080)) # 连接到服务器的IP和端口
while True:
#输入数据
data = input('请输入要发送的数据:')
#发送数据
if data == 'exit':
break
sockert_client.send(data.encode('utf-8'))
#接收数据
data = sockert_client.recv(1024) # 接收1024字节的数据
print('接收到的数据:', data.decode('utf-8'))
#关闭连接
sockert_client.close()
结语:
笔记!笔记!笔记!
基础不扎实所以花了两天时间速通了一遍黑马 ,感觉很不错。