一、异常
1、定义
异常是在程序执行过程中出现的错误或意外情况。当程序遇到异常时,它会中断当前的执行流程,并尝试找到相应的异常处理机制来解决问题。
2、常见异常类型
SyntaxError:语法错误,通常是代码书写不符合Python语法规则。
NameError:名称错误,当引用一个未定义的变量或函数时抛出。
TypeError:类型错误,当对不支持的操作数类型进行操作时抛出。
ValueError:值错误,当传入的参数类型正确但取值范围不正确时抛出。
IndexError:索引错误,当访问列表、元组或字符串等序列类型时使用了无效的索引值时抛出。
KeyError:键错误,当访问字典中不存在的键时抛出。
FileNotFoundError:文件未找到错误,当尝试打开不存在的文件时抛出。
3、示例
def func(x, y):
if y != 0:
return x/y
if __name__ == '__main__':
try: #包含所有可能抛出异常的代码
a = int(input("x:"))
b = int(input("y:"))
res = func(a, b)
print("res:", res)
fd = open("file.txt", mode="r+") # opend 打开文件
print(fd)
except ZeroDivisionError as err: #as 保存异常信息
print("*********************", err)
except (IOError, NameError) as err: #如果捕获多种异常 则使用元组
print("error:11111111111111", err)
二、目录操作
要进行目录操作,可以使用Python中的os
模块或pathlib
模块。这些模块提供了许多用于处理文件和目录的函数和方法。
1、创建目录
import os.path
#检查目录 12 是否存在或者是否是一个目录 存在:True 不存在:False
dir = "12"
if os.path.exists("12") is False:
os.mkdir(dir) #创建该目录
print("目录创建成功")
else:
print("目录已存在,创建失败")
2、查看目录下的文件并分类
import os.path
# listdir(dir) :列举出dir 目录中的所有文件名
files = os.listdir("../day2")
print(files)
dir = []
fi = []
for file in files:
path = "../day2/" + file #"path" 通常指代文件系统中文件或目录的路径
if os.path.isdir(path):
dir.append(file)
else:
fi.append(file)
print("目录:", dir)
print("文件", fi)
三、文件操作
open函数
open()
函数是Python内置函数之一,用于打开文件并返回一个文件对象,以便对文件进行读取、写入或其他操作。
file
: 文件路径(包括文件名)
mode
: 打开文件的模式,常见的包括:
"r": 只读模式,文件必须存在。
"w": 只写模式,清空文件内容,若文件不存在则创建新文件。
"a": 追加模式,在文件末尾添加内容,若文件不存在则创建新文件。
"r+": 读写模式,允许读取和写入文件内容。
其他参数:如buffering
(缓冲大小)、encoding
(文件编码)、errors
(编解码错误处理方式)等
返回值:open()
函数返回一个文件对象,可以通过该文件对象执行文件的读取、写入等操作。
1、权限
"r":只读模式,文件必须存在,如果文件不存在则会引发错误。
"w":只写模式,文件不存在则创建,文件存在则清空内容。
"a":追加模式,文件不存在则创建,文件存在则在末尾追加内容。
"r+":读写模式,文件必须存在,从文件头开始读写。
"w+":读写模式,文件不存在则创建,文件存在则清空内容并从头开始读写。
"a+":读写模式,文件不存在则创建,文件存在则在末尾追加内容并可以读取。
2、打开文件
fd = open("file.txt", mode="w+") #以读写模式打开文件file.txt
3、读取文件内容
res = fd.read(32) #read(n)读取前n 字节的数据 返回str类型
res = fd.readlines() #readlines() :读取文件所有行数据, 返回list类型
4、向文件写入内容
fd.write("hello world") #write()写入数据hello world
5、示例
fd = open("file.txt", mode="w+")
with open("file.txt", mode="r+") as fd:
l1 = ["123444\n", "45644\n", "789565\n", "goodbye\n"]
fd.writelines(l1) #按行写入数据 用于将一个字符串列表写入文件。每个字符串元素都作为一行写入文件。
fd.close()
6、with语句
with
语句是用于简化资源管理的一种方式,确保在代码块执行完成后自动关闭文件、释放锁或者执行其他清理操作。
四、多线程
示例
from threading import Thread
from time import sleep, ctime
def study(book):
for i in range(5):
print("I'm study 《{}》 {}".format(book, ctime))
sleep(1)
def music(music):
for i in range(5):
print("I'm listening 《{}》".format(music))
sleep(2)
if __name__ == '__main__':
#Thread() : 创建线程 target : 用指定线程执行函数 args:传递数据到线程中
t1 = Thread(target = study, args = ("模电",))
#start(): 启动线程
t1.start()
t2 = Thread(target=music, args=("蓝莲花",))
# start(): 启动线程
t2.start()
t1.join()
t2.join()
五、多进程
示例
from multiprocessing import Process
from time import sleep, ctime
def study(book):
for i in range(5):
print("I'm study 《{}》 {}".format(book, ctime()))
sleep(1)
def music(music):
for i in range(5):
print("I'm listening 《{}》".format(music))
sleep(2)
if __name__ == '__main__':
#Process() : 创建进程 target : 用指定进程执行函数 args:传递数据到线程中
t1 = Process(target=study, args=("模电",))
#start(): 启动进程
t1.start()
t2 = Process(target=music, args=("蓝莲花",))
# start(): 启动进程
t2.start()
t1.join()
t2.join()
六、锁
在多线程编程中,锁是一种同步机制,用于控制多个线程对共享资源的访问。使用锁可以确保在任意时刻只有一个线程可以访问共享资源,从而避免多个线程同时修改共享数据导致的数据不一致或竞态条件等问题。
from threading import Thread, Lock
# 共享资源
counter = 0
l = Lock()
# 定义一个函数,用于增加计数器的值
def increase_counter():
global counter
for _ in range(1000):
with l:
counter += 1
# 创建两个线程分别增加计数器的值
#Thread() : 创建线程 target : 用指定线程执行函数 args:传递数据到线程中
thread1 = Thread(target=increase_counter)
thread2 = Thread(target=increase_counter)
thread1.start()
thread2.start()
thread1.join()
thread2.join()
print("Final value of counter:", counter)
七、管道
管道(Pipe)是一种进程间通信机制,通常用于在父进程和子进程之间传递数据。在Python中,可以使用multiprocessing
模块中的Pipe
类来创建管道。
示例
from multiprocessing import Process, Pipe, freeze_support
# 子进程的函数,接收父进程发送的消息并回复
def child_process(conn):
while True:
msg = conn.recv() # 接收消息
print("Received message from parent:", msg)
if msg == "exit":
break
reply_msg = "Message received: " + msg
conn.send(reply_msg) # 回复消息
conn.close()
if __name__ == '__main__':
freeze_support() # 添加这一行
# 创建管道
parent_conn, child_conn = Pipe()
# 启动子进程
p = Process(target=child_process, args=(child_conn,))
p.start()
# 父进程向子进程发送消息并接收回复
messages = ["Hello", "How are you?", "exit"]
for msg in messages:
parent_conn.send(msg) # 发送消息
if msg == "exit":
break
reply = parent_conn.recv() # 接收回复
print("Received reply from child:", reply)
p.join()