本周内容回顾
- 异常捕获
- 生成器相关内容概述
- 模块简介
- 常用内置模块
- 本周测评作业解析
异常捕获
1.异常捕获的语法
异常捕获一般是使用Try
try:
待检测的子代码
except 错误类型:
如果待检测的子代码报错与except关键字后面的错误一致就会走这里
try:
待检测的子代码
except 错误类型 as 变量名:
将捕捉到的错误类型复制给as后面的变量名
try:
待检测的子代码
except 错误类型 as 变量名:
报错之后走的代码
else:
待检测代码不报错之后走的代码
try:
待检测的代码
except 错误类型 as 变量名:
报错之后走的代码
else:
待检测代码不报错后执行的子代码
finally:
无论 try 下待检测的代码是否报错
都会走finally 关键字下的子代码
生成器简介
1.生成器可以调用双下__next__()方法的
2.生成器跟迭代器的区别就是,迭代器是内置的,生成器是自定义的
3.本质:生成器的内置还是包含有__iter__()和__next__()方法的迭代器对象
创建生成器的基本语法:
# 首先我们定义一个函数
def outer():
pass
yield
当我们在函数体代码中写了 yield 关键字的时候
这个函数就变成了一个生成器
我们在调用这个函数的时候它不会立即执行
outer()
当我们把它赋值给一个变量名并对这个变量名使用__next__() 方法的时候
res = outer
res.__next__()
就会执行这个函数体代码,并在遇到 yield 关键字时停止运行
如果我们继续使用 __next__() 方法时
它会把上次停止在yield关键字的地方做起始位置
继续向下运行,直到再次遇到yield 关键字时停止
yield 冷门用法
def func(x,skill=None):
while True:
skill = yield
print(f'{x}正在使用{skill}技能')
res = func('xiaochen')
res.__next__() # 必须要调用双下__next__() 方法才可以使用send方法给yield 传值
res.send('就是牛逼')
res.send('我是宝贝')
生成器表达式:
它与列表生成式相似
变量名 + 赋值符号 +(i for i in 可迭代对象)
模块
模块就是含有功能的.py 文件
模块分类:
内置模块:
python解释器自带的模块
自定义模块:
自己编写的带有一定功能的.py文件
第三方模块:
别人写好的模块,我们可以通过下载的方式来使用别人已经写好的功能
导入模块的两种方式
import 模块名
from 模块名 import 变量名
1.先产生执行文件的名称空间
2.执行被导入文件的代码将产生的名字放入被导入文件的名称空间中
3.在执行文件的名称空间中产生对应的名字绑定模块名称空间中对应的名字
4.在执行文件中直接使用名字就可以访问名称空间中对应的名字
各自的区别:
import 没有 from import 精确
from 需要用变量名加.的方式才可以直接运行
当我们在导入一个模块时,如果这个模块已经加载在内存中了,就算把文件关闭,也是可以直接运行的
如果不在内存中
那么查找顺序就变成
内置模块》》执行文件中的sys.path获取的文件路径()列表类型
# 所以我们在导入模块的时候一定要注意执行文件里面sys.path有没有你要导入的模块!
所有的py文件都可以直接打印__name__对应的值
当py文件为执行文件时,print(__name__) 打印出来的值为__main__
当py文件是被导入文件的时候print(__name__) 对应的值是模块名字
if __name__ == '__main__':
print('哈哈哈 我是执行文件 我可以运行这里的子代码')
collections模块
1.deque:
# deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈
2.namedtuple:
# 具名元组 namedtuple('Point', ['x', 'y'])
Counter:
# 计数器,计算元素在所在序列里面出现的次数并返回一个字典 键为元素,值为出现次数
OrderedDict:
# 有序字典
time/datetime
import datetime
a = datetime.datetime.today()
f = datetime.datetime.strftime(a, '%Y年%m月%d日星期六%H时%M分%S秒')
print(f)
# 2022年10月23日星期六21时49分34秒
1.时间戳
import time
print(time.time())
# 1666168553.743125
# 格林威治时间1970年01月01日00时00分00秒 至今经历过的的秒数
2.推迟指定的时间运行
import time
time.sleep(1) # 延迟一秒在执行
print('hello world') # 延迟一秒打印
3.格式化输出时间
print(localtime()) # time.struct_time(tm_year=2022, tm_mon=10, tm_mday=19, tm_hour=17, tm_min=2, tm_sec=22, tm_wday=2, tm_yday=292, tm_isdst=0)
print(time.strftime('%Y-%m-%d,%H:%M:%S:%p',time.localtime()))
# 2022-10-19,17:02:22:PM %p为上午下午
print(time.strftime('%Y:%m:%d %X',time.localtime()))
# 2022:10:19 17:05:56 %X表示 时分秒
总而言之strftime() 可以把localtime() 的时间相关信息
根据自己想输出的内容格式 表现出来
而strptime() 则是根据自己输入的时间内容编程localtime()的格式
print(time.strptime('2020-10-18','%Y-%m-%d'))
# time.struct_time(tm_year=2020, tm_mon=10, tm_mday=18, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=6, tm_yday=292, tm_isdst=-1)
它输出的的和结构化时间 localltime() 一样
随机数模块
import random
print(random.random()) # 随机产生0-1之间的小数
print(random.randint(1,9)) # 随机产生1-9 之间的数字 包括9
print(random.randrange(0,100,2)) # 随机取0-100之间的偶数
print(random.choice(['一等奖', '二等奖', '三等奖', '谢谢惠顾'])) # 随机抽取一个样本
rint(random.sample(['jason', 'kevin', 'tony', 'oscar', 'jerry', 'tom'], 2)) # 随机抽指定样本数 ['tom', 'jerry']
os 模块
import os
print(os.path.dirname(__file__)) # 获取当前执行文件目录
print(os.path.abspath(__file__)) # D:\pythonProject\Day19\今日概要.py
print(os.listdir()) # 获取执行文件当前目录的文件名,(列表形式)
os.mkdir(文件夹名字) # 创建当前文件目录下单极空文件夹
os.makedirs(文件夹名字/文件夹名字) # 创建当前文件目录下多级空文件夹/也可以单文件夹
os.rename('aa.txt','xiaoming.txt') # 更改当前目录下的文件名字
os.remove('aa.txt') # 删除当前目录内的指定文件
os.isdir() # 判断路径内目录是否存在
os.isfile() # 判断路径内文件是否存在
s1 = r'D:\pythonProject\sunday'
s2 = '周报.py'
print(os.path.join(s1, s2)) # 拼接s1 s2 路径
sys模块
import sys
path
1.print(sys.path) # 返回当前Py的环境路径(当前py环境可以导入内置、第三方包与函数的所在路径)
platform
2.print(sys.platform) # 获取当前系统平台(如windows、Mac、linux)
version
3.print(sys.version) # 3.8.6 (tags/v3.8.6:db45529, Sep 23 2020, 15:52:53) [MSC v.1927 64 bit (AMD64)] 获取当前 Python 的版本
modules
4.print(sys.modules) # 将Python启动时加载的模块集合起来并返回一个列表
getrecursionlimit()
5.print(sys.getrecursionlimit()) # 获取python解释器默认最大递归深度 ()可以填写参数更改最大递归深度
argv
6.
# argv 获取程序外部的参数,返回值是一个列表
json模块
dumps
d1 = {'name': 'xiaoming', 'age': 18, 'sex': 'male', 'account': 15000}
json_dict1 = json.dumps(d1)
print(json_dict1) # 转为 json 格式
loads
with open('xiaoxin.txt','r',encoding='utf8') as f:
for i in f:
print(json.loads(i), type(json.loads(i)))
# {'1': {'name': 'xiaoming', 'age': 18, 'sex': 'male', 'account': 15000}} <class 'dict'>
2.针对文件
dump
d1 = {1: {'name': 'xiaoming', 'age': 18, 'sex': 'male', 'account': 15000}}
# json_dict1 = json.dumps(d1)
# print(json_dict1)
with open('xiaoxin.txt','w',encoding='utf8') as f:
json.dump(d1, f)
可以直接把d1字典类型转为json格式并直接写入文件中
load
with open('xiaoxin.txt','r',encoding='utf8') as f:
data = json.load(f)
print(data,type(data))
本周测试总结
生成任意长度的验证码(数字,大写字母,小写字母)
import random
def get_random_num(x):
code = ''
for i in range(x):
random_int = str(random.randint(0, 9))
random_lower = chr(random.randint(97, 122))
random_upper = chr(random.randint(65, 90))
choice = random.choice([random_int, random_lower, random_upper])
code += choice
return code
res = get_random_num(10)
print(res)
实现range方法:
# def my_range_func(start_num, end_num=None, step=1):
# if step > 0:
# if not end_num:
# end_num = start_num # 这是当参数为1的时候 让end_num有赋值
# start_num = 0 # 然后把0赋值给start_num 因为range是前取后不取
# while start_num < end_num: # 当start_num <end_num 时结束循环
# yield start_num # 直接通过关键字yield返回 start_num
# start_num += step # 每次取值都让start_num + step
#
# elif step == 0:
# raise ValueError('range() arg 3 must not be zero') # 抛出BUG
# else:
# if start_num < end_num: # 如果参数1 小于 参数2
# while start_num < end_num: # 循环条件也是如此
# yield end_num # 返回 参数2
# end_num += step # 参数2 - 步长的绝对值
# elif start_num > end_num: # 如果 参数1 大于 参数 2
# while start_num > end_num: # 循环条件也是如此
# yield start_num # 返回 参数1
# start_num -= abs(step) # 参数1 - 步长的绝对值
#
主要是模块方面的知识点需要牢记,在写代码的时候容易在路径与导入模块中出现问题
在一个是各种常用模块中的使用不熟练,需要加强练习。
标签:__,10.23,num,回顾,random,tm,模块,print
From: https://www.cnblogs.com/ddsuifeng/p/16819770.html