python基础 (v3.6.6)
day05
1. 异常处理
try:
可能发生异常的代码
except:
出现异常后的处理代码
1-1. 异常调试
try:
age = int("gvre")
except:
print("输入的信息有误")
1-2. 输出异常信息
try:
age = int("gvre")
except Exception as msg:
print("错误信息:\n",msg)
1-3. 输出完整的异常信息
import traceback
try:
age = int("gvre")
except Exception as msg:
print("完整错误信息:\n",traceback.format_exc())
1-4. try-except-else语句(很少使用):如果程序没有异常,才执行else里面的内容
try:
age = int("666")
except Exception as msg:
print("错误信息:\n",msg)
else:
print("程序运行正常")
1-5. try-except-finally(很少使用):无论程序是否异常,都执行finally里面的内容
try:
age = int("666a")
except Exception as msg:
print("错误信息:\n",msg)
finally:
print("无论try里面是否异常,我都执行")
1-6. raise Exception("自定义异常信息")
主动抛出异常,后续代码都不运行了,(实际较少使用)
print("开始程序")
for i in range(1,3):
print(i)
raise Exception("主动抛出异常,程序结束啦")
print("这里的代码不执行啦")
1-7. 补充(了解): for-else
如果for循环正常结束,else中语句执行。如果是break终止的,else则不执行。
for i in range(1,6):
if i == 3:
print(i)
break
else:
print("for循环走完了呢")
注:while循环也可用 while-else,作用一样的
2. MySQL操作
2-1. 安装(mysql-connector和pymysql任选一种)
mysql-connector安装: pip install mysql-connector
pymysql安装: pip install pymysql
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install -i http://pypi.douban.com/simple --trusted-host pipy.douban.com 库名
在线安装或使用国内源安装
验证安装是否成功(不报错):
import mysql.connector
import pymysql
安装成功后,在python/lib/site-package下面会多出mysql相关文件夹
2-2. 连接MySQL
# 1. mysql-connector的连接
import mysql.connector
mydb = mysql.connector.connect(
host = "211.149.163.145",
port = "3306", # 默认端口可省略
user = "test",
passwd = "test123",
database = "test")
mycursor = mydb.cursor() # 创建操作集(游标)
# 2. pymysql的连接
import pymysql
mydb2 = pymysql.connect(
host = "211.149.163.145",
port = 3306,
user = "test",
passwd = "test123",
database = "test",
cursorclass = pymysql.cursors.DictCursor)
# 最后一行cursorclass = pymysql.cursors.DictCursor表示返回字典格式,
如果不加,默认返回的是元组格式
mycursor = mydb2.cursor() # 创建操作集(游标)
mycursor2 = mydb2.cursor(pymysql.cursors.DictCursor)
# 返回字典格式的设置,也可以在创建游标时加上
2-3. 插入数据
# sql = "insert into student values(6,'橘子','男',666);"
# mycursor.execute(sql)
# 如果对sql语句格式化,无论字符串还是整形,都用%s代替
sql2 = "insert into student values(%s,%s,%s,%s);"
values = (7,"橘子2","男",666)
mycursor.execute(sql2,values)
print("插入了%d条数据"%mycursor.rowcount)
mydb.commit() # 修改数据需要提交事务
# 一次插入多条数据(了解)
sql2 = "insert into student values(%s,%s,%s,%s);"
values2 = [(8,"橘子3","男",666),(9,"橘子5","男",666)]
mycursor.executemany(sql2,values2) # 插入多条数据executemany()
2-4. 查询数据
sql = "select * from student where sname like '橘子%';"
mycursor.execute(sql)
res = mycursor.fetchall() # 获取所有记录
print(res) # 以列表形式打印结果,或使用下面的for循环逐条打印
for ele in res:
print(ele)
# 可以根据情况断言
exceptResult = "橘子"
if exceptResult in str(res):
print(True)
else:
print(False)
注:pymysql默认返回元组格式,可以设置为字典
2-5. 修改数据
sql = "update student set gender = '哈哈' where sname like '橘子%';"
mycursor.execute(sql)
print("修改了%d条数据"%mycursor.rowcount)
mydb.commit() # 修改数据需要提交事务
2-6. 删除数据
sql = "delete from student where sname like '橘子%';"
mycursor.execute(sql)
print("删除了%d条数据"%mycursor.rowcount)
mydb.commit() # 修改数据需要提交事务
2-7. 关闭数据库连接(了解)
mycursor.close() # 关闭游标
mydb.close() # 关闭数据库连接
3. 多线程
## 1.串行代码
'''
import time
def task1():
for i in range(2):
print("任务1启动",time.ctime())
time.sleep(2)
print("任务1结束",time.ctime())
def task2():
for i in range(2):
print("任务2启动",time.ctime())
time.sleep(1)
print("任务2结束",time.ctime())
task1()
task2()
print("主线程结束,已退出")
'''
## 2.串行代码优化
'''
import time
def task(taskName,stime):
for i in range(2):
print("%s启动"%taskName,time.ctime())
time.sleep(stime)
print("%s结束"%taskName,time.ctime())
if __name__ == "__main__":
task("任务1",2)
task("任务2",1)
print("主线程结束,已退出")
# 注:当前只有1个线程:主程序
'''
## 3.任务并行执行,引入多线程
'''
import threading
import time
def task(taskName,stime):
for i in range(2):
print("%s启动"%taskName,time.ctime())
time.sleep(stime)
print("%s结束"%taskName,time.ctime())
if __name__ == "__main__":
# 创建线程
t1 = threading.Thread(target=task,args=("任务1",2))
t2 = threading.Thread(target=task,args=("任务2",1))
# 启动线程
t1.start()
t2.start()
print("主线程结束,已退出")
# 注:当前有3个线程:1个主程序,两个创建的子线程
'''
## 4.加入守护线程
'''
import threading
import time
def task(taskName,stime):
for i in range(2):
print("%s启动"%taskName,time.ctime())
time.sleep(stime)
print("%s结束"%taskName,time.ctime())
if __name__ == "__main__":
# 创建线程
t1 = threading.Thread(target=task,args=("任务1",2))
t2 = threading.Thread(target=task,args=("任务2",1))
# 启动线程
t1.start()
t2.start()
# 守护线程
t1.join()
t2.join()
print("主线程结束,已退出")
# 注:当前有3个线程:1个主程序,两个创建的子线程
'''
## 5.批量创建线程
'''
import threading
import time
def task(taskName,stime):
for i in range(2):
print("%s启动"%taskName,time.ctime())
time.sleep(stime)
print("%s结束"%taskName,time.ctime())
# 任务列表
taskList = [("任务1",2),("任务2",1)]
# 根据任务列表,批量创建线程
def createThread():
threadsList = []
for job in taskList:
t = threading.Thread(target=task,args=job)
threadsList.append(t)
return threadsList
if __name__ == "__main__":
threads = createThread()
# 启动线程
for thread in threads:
thread.start()
# 守护线程
for thread in threads:
thread.join()
print("主线程结束,已退出")
'''
## 6.使用面向对象的方式启动多线程(了解)
'''
import threading,time
class MyThread(threading.Thread):
def __init__(self,taskName,stime):
# 显示调用父类的构造函数
super().__init__()
self.taskName = taskName
self.stime = stime
# 执行任务的函数: run() ,必须是run()
def run(self):
task(self.taskName,self.stime)
def task(taskName,stime):
for i in range(2):
print("%s启动"%taskName,time.ctime())
time.sleep(stime)
print("%s结束"%taskName,time.ctime())
# 任务列表
taskList = [("任务1",2),("任务2",1)]
# 根据任务列表,批量创建线程
def createThread():
threadsList = []
for job in taskList:
# 实例化MyThread类来创建线程
t = MyThread(job[0],job[1])
threadsList.append(t)
return threadsList
if __name__ == "__main__":
threads = createThread()
# 启动线程
for thread in threads:
thread.start()
# 守护线程
for thread in threads:
thread.join()
print("主线程结束,已退出")
'''