py周结04
异常类型,理语法结构及实践案例
1.异常类型
SyntaxError 语法错误
NameError 名字错误
IndexError 指数错误
KeyError 关键字错误
IndentationError 缩进错误
2.异常处理语法结构
try:
待监测的代码
except Exception as e:
针对各种常见的错误类型全部统一处理
else:
try的子代码正常运行没有报错才会运行else子代码
finally:
无论try的子代码有没有报错,最后都要执行finally的子代码
3.异常处理实践案例
题目:
使用while循环+异常处理+迭代器对象 完成for循环迭代取值的功能
l1 = [11, 22, 33, 44, 55, 66, 77, 88, 99]
l1 = [11, 22, 33, 44, 55, 66, 77, 88, 99]
iter_l1 = l1.__iter__()
while True:
try:
print(iter_l1.__next__())
except Exception as e:
break
生成器对象以及生成器表达式
1.生成器对象
1.本质
还是内置有__iter__和__next__的迭代器对象
2.区别
迭代器对象是解释器自动提供的
数据类型/文件对象>>>:迭代器对象
生成器对象是程序员编写出来的
代码、关键字>>>:迭代器对象(生成器)
3.创建生成器的基本语法
函数体代码中填写yield关键字
def my_iter():
print('哈哈哈 椰子汁很好喝')
yield
'''
1.函数体代码中如果有yield关键字
那么函数名加括号并不会执行函数体代码
会生成一个生成器对象(迭代器对象)
'''
res = my_iter()
'''2.使用加括号之后的结果调用__next__才会执行函数体代码'''
res.__next__()
'''3.每次执行完__next__代码都会停在yield位置 下次基于该位置继续往下找第二个yield'''
def my_iter():
print('哈哈哈 椰子汁很好喝')
res = my_iter()
r1 = res.__next__()
print(r1)
'''4.yield还有点类似于return 可以返回返回值'''
2.生成器表达式
1.列表生成式
l1 = [i ** 2 for i in range(100)]
print(l1)
2.元组生成式
l1 = (i ** 2 for i in range(100))
print(l1)
for i in l1:
print(i)
索引取值与迭代取值的差异
l1 = [11, 22, 33, 44, 55]
1.索引取值
可以任意位置任意次数取值
不支持无序类型的数据取值
2.迭代取值
只能从前往后依次取值无法后退
支持所有类型的数据取值(无序有序)
ps:两者的使用需要结合实际应用场景
模块简介及模块的分类
1.模块简介
1.模块的本质
内部具有一定的功能(代码)的py文件
2.python模块的历史
python刚开始的时候所有搞其他编程语言的程序员都看不起
随着时间的发展项目的复杂度越来越高 上面那帮人也不得不用一下python
3.python模块的表现形式
py文件(py文件也可以称之为是模块文件)
含有多个py文件的文件夹(按照模块功能的不同划分不同的文件夹存储)
已被编译为共享库或DLL的c或C++扩展(了解)
使用C编写并链接到python解释器的内置模块(了解)
2.模块的分类
1.自定义模块:我们自己写的模块文件
2.内置模块:python解释器提供的模块
3.第三方模块:别人写的模块文件(python背后真正的大佬)
导入模块的两种句式
1.import句式
以import a为例研究底层原理
"""
1.先产生执行文件的名称空间
2.执行被导入文件的代码将产生的名字放入被导入文件的名称空间中
3.在执行文件的名称空间中产生一个模块的名字
4.在执行文件中使用该模块名点的方式使用模块名称空间中所有的名字
"""
2.from...import...句式
以from a import name,func1为例研究底层原理
"""
1.先产生执行文件的名称空间
2.执行被导入文件的代码将产生的名字放入被导入文件的名称空间中
3.在执行文件的名称空间中产生对应的名字绑定模块名称空间中对应的名字
4.在执行文件中直接使用名字就可以访问名称空间中对应的名字
"""
导入模块补充说明
1.import与from...import...两者优缺点
import句式
由于使用模块名称空间中的名字都需要模块名点的方式才可以用
所以不会轻易的被执行文件中的名字替换掉
但是每次使用模块名称空间中的名字都必须使用模块名点才可以
from...import...句式
指名道姓的导入模块名称空间中需要使用的名字 不需要模块名点
但是容易跟执行文件中名字冲突
循环导入问题
1.循环导入
两个文件之间彼此导入彼此并且相互使用各自名称空间中的名字 极容易报错
2.如何解决循环导入问题
1.确保名字在使用之前就已经准备完毕
2.我们以后在编写代码的过程中应该尽可能避免出现循环导入
判断文件类型
所有的py文件都可以直接打印__name__对应的值
当py文件是执行文件的时候__name__对应的值是__main__
当py文件是被导入文件的时候__name__对应的值是模块名
if __name__ == '__main__':
print('哈哈哈 我是执行文件 我可以运行这里的子代码')
上述脚本可以用来区分所在py文件内python代码的执行
使用场景
1.模块开发阶段
2.项目启动文件
"""
from a import * *默认是将模块名称空间中所有的名字导入
__all__ = ['名字1', '名字2'] 针对*可以限制拿的名字
"""
模块的查找顺序
1.内存
import aaa
import time
time.sleep(15)
print(aaa.name)
aaa.func1()
2.内置
import time
print(time)
print(time.name)
"""
以后在自定义模块的时候尽量不要与内置模块名冲突
"""
3.执行文件所在的sys.path(系统环境环境)
一定要以执行文件为准!!!
我们可以将模块所在的路径也添加到执行文件的sys.path中即可
import sys
print(sys.path)
sys.path.append(r'D:\pythonProject03\day17\mymd')
import ccc
print(ccc.name)
绝对导入与相对导入
"""
再次强调:一定要分清楚谁是执行文件!!!
模块的导入全部以执行文件为准
"""
绝对导入
from mymd.aaa.bbb.ccc.ddd import name
from mymd.aaa.bbb.ccc import ddd
ps:套路就是按照项目根目录一层层往下查找
相对导入
.在路径中表示当前目录
..在路径中表示上一层目录
..\..在路径中表示上上一层目录
不在依据执行文件所在的sys.path 而是以模块自身路径为准
from . import b
相对导入只能用于模块文件中 不能在执行文件中使用
'''
相对导入使用频率较低 一般用绝对导入即可 结构更加清晰
'''
包的具体使用
虽然python3对包的要求降低了 不需要__init__.py也可以识别 但是为了兼容性考虑最好还是加上__init__.py
1.如果只想用包中某几个模块 那么还是按照之前的导入方式即可
from aaa import md1, md2
2.如果直接导入包名
import aaa
导入包名其实就是导包下面的__init__.py文件,该文件内有什么名字就可以通过包名点什么名字
编程思想的转变
1.面条版阶段
所有的代码全部堆叠在一起
2.函数版阶段
根据功能的不同封装不同的函数
3.模块版阶段
根据功能的不同拆分成不同的py文件
软件开发目录规范
1.文件及目录的名字可以变换 但是思想是不变的 分类管理
2.目录规范主要规定开发程序的过程中针对不同的文件功能需要做不同的分类
myproject项目文件夹
1.bin文件夹 主要存放项目启动文件
start.py 启动文件可以放在bin目录下 也可以直接在项目根目录
2.conf文件夹 主要存放项目配置文件
settings.py 里面存放项目的默认配置 一般都是全大写
3.core文件夹 主要存放项目核心文件
src.py 里面存放项目核心功能
4.interface文件夹 主要存放项目接口文件
goods.py 根据具体业务逻辑划分对应的文件
user.py
account.py
5.db文件夹 主要存放项目相关数据
userinfo.txt
db_handler.py 存放数据库操作相关的代码
6.log文件夹 主要存放项目日志文件
log.log
7.lib文件夹 主要存放项目公共功能
common.py
8.readme文件 主要存放项目相关说明
9.requirements.txt文件 主要存放项目所需模块及版本
常用内置模块之collections模块
1.具名元组:namedtuple
from collections import namedtuple
表示二维坐标系
point = namedtuple('点', ['x', 'y'])
生成点信息
p1 = point(1, 2)
print(p1)
print(p1.x)
print(p1.y)
card = namedtuple('扑克牌', ['num', 'color'])
c1 = card('A', '黑♠')
c2 = card('A', '红♥')
print(c1, c1.num, c1.color)
print(c2, c2.num, c2.color)
常用内置模块之时间模块
import time
"""
三种时间表现形式
1.时间戳
秒数
2.结构化时间
主要是给计算机看的 人看不适应
3.格式化时间
主要是给人看的
"""
print(time.time())
print(time.localtime())
print(time.strftime('%Y-%m-%d'))
print(time.strftime('%Y/%m/%d'))
print(time.strftime('%Y/%m/%d %H:%M:%S'))
print(time.strftime('%Y/%m/%d %X'))
time.sleep(10)
import datetime
print(datetime.datetime.now())
print(datetime.datetime.today())
print(datetime.date.today())
'''
datetime 年月日 时分秒
date 年月日
time 时分秒(后续会有此规律)
'''
from datetime import date, datetime
print(date.today())
print(datetime.today())
print(datetime.utcnow())
import datetime
c = datetime.datetime(2017, 5, 23, 12, 20)
print('指定日期:',c)
from datetime import datetime
d=datetime.strptime('2017/9/30','%Y/%m/%d')
print(d)
e=datetime.strptime('2017年9月30日星期六','%Y年%m月%d日星期六')
print(e)
f=datetime.strptime('2017年9月30日星期六8时42分24秒','%Y年%m月%d日星期六%H时%M分%S秒')
print(f)
import datetime
ctime = datetime.date.today()
print(ctime)
time_del = datetime.timedelta(days=3)
print(ctime + time_del)
ctime = datetime.datetime.today()
print(ctime)
time_del = datetime.timedelta(minutes=20)
print(ctime + time_del)
常用内置模块之随机数模块
import random
print(random.random())
print(random.randint(1, 6))
print(random.randrange(1, 100, 2))
print(random.choice(['一等奖', '二等奖', '三等奖', '谢谢惠顾']))
print(random.choices(['一等奖', '二等奖', '三等奖', '谢谢惠顾']))
print(random.sample(['jason', 'kevin', 'tony', 'oscar', 'jerry', 'tom'], 2))
l1 = [2, 3, 4, 5, 6, 7, 8, 9, 10, 'J', 'Q', 'K', 'A']
random.shuffle(l1)
print(l1)
'''产生图片验证码: 每一位都可以是大写字母 小写字母 数字 4位'''
def get_code(n):
code = ''
for i in range(n):
random_upper = chr(random.randint(65, 90))
random_lower = chr(random.randint(97, 122))
random_int = str(random.randint(0, 9))
temp = random.choice([random_upper, random_lower, random_int])
code += temp
return code
res = get_code(10)
print(res)
res = get_code(4)
print(res)
os模块(重要)
os模块主要与代码运行所在的操作系统打交道
import os
os.mkdir(r'd1')
os.mkdir(r'd2\d22\d222')
os.makedirs(r'd2\d22\d222')
os.makedirs(r'd3')
os.rmdir(r'd1')
os.rmdir(r'd2\d22\d222')
os.removedirs(r'd2\d22')
os.removedirs(r'd2\d22\d222\d2222')
os.rmdir(r'd3')
print(os.listdir())
print(os.listdir(r'D:\\'))
os.rename(r'a.txt', r'aaa.txt')
os.remove(r'aaa.txt')
print(os.getcwd())
os.chdir('..')
print(os.getcwd())
os.mkdir(r'hei')
print(os.path.abspath(__file__))
print(os.path.dirname(__file__))
print(os.path.exists(r'01 os模块.py'))
print(os.path.exists(r'D:\pythonProject03\day19'))
print(os.path.isfile(r'01 os模块.py'))
print(os.path.isfile(r'D:\pythonProject03\day19'))
print(os.path.isdir(r'01 os模块.py'))
print(os.path.isdir(r'D:\pythonProject03\day19'))
s1 = r'D:\pythonProject03\day19'
print(f'{s1}\{s2}')
"""
涉及到路径拼接一定不要自己做 因为不同的操作系统路径分隔符不一样
"""
print(os.path.join(s1, s2))
print(os.path.getsize(r'a.txt'))
sys模块
import sys
print(sys.path)
print(sys.getrecursionlimit())
sys.setrecursionlimit(2000)
print(sys.version)
print(sys.platform)
res = sys.argv
if len(res) != 3:
print('执行命令缺少了用户名或密码')
else:
username = res[1]
password = res[2]
if username == 'jason' and password == '123':
print('jason您好 文件正常执行')
else:
print('您不是jason无权执行该文件')
json模块
json模块也称为序列化模块 序列化可以打破语言限制实现不同编程语言之间数据交互
json格式数据的作用
json格式数据的形式
字符串类型并且引号都是双引号
json相关操作
针对数据
json.dumps()
json.loads()
针对文件
json.dump()
json.load()
json模块实战
用户登录注册功能
import os
import json
base_dir = os.path.dirname(__file__)
db_dir = os.path.join(base_dir, 'db')
if not os.path.isdir(db_dir):
os.mkdir(db_dir)
username = input('username>>>:').strip()
password = input('password>>>:').strip()
print(os.listdir(db_dir))
user_file_path = os.path.join(db_dir, f'{username}.json') 方式2
user_dict = {
'username': username,
'password': password,
'account': 15000,
'shop_car': []
user_file_path = os.path.join(db_dir, f'{username}.json')
with open(user_file_path,'w',encoding='utf8') as f:
json.dump(user_dict, f)
username = input('username>>>:').strip()
target_user_file_path = os.path.join(db_dir, f'{username}.json')
if not os.path.isfile(target_user_file_path):
print('你赶紧滚蛋 用户名都不对 搞什么飞机')
else:
password = input('password>>>:').strip()
with open(target_user_file_path,'r',encoding='utf8') as f:
real_user_dict = json.load(f)
if password == real_user_dict.get('password'):
print('登录成功')
else:
print('密码错误')
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具