本周内容概览
-
函数
- 常见内置函数
- 可迭代对象与迭代器对象
- 异常捕获
- 生成器对象
- 生成器表达式
- 迭代取值与索引取值的区别
-
模块
- 模块简介
- 循环导入问题
- 模块的查找顺序
- 绝对导入与相对导入
- 包的概念
- 软件开发目录规范
- 常见内置模块
一、函数
-
常见内置函数
abs(-5)
all(1, 0)
all(1, 1)
any(1, 0)
any(1, 1)
res = bin(50)
print(res)
res = oct(0b110010)
print(res)
res = hex(0o62)
print(res)
res = int('20')
print(res, type(res))
print(int(0o62))
print(bytes([1, 2, 3, 4, 5]))
name = 'jason'
print(callable(name))
def func(): pass
print(callable(func))
print(ord('a'))
print(chr(65))
print(dir(str))
d1, d2 = divmod(10, 3)
print(d1, d2)
for e, i in enumerate([11, 22, 33]):
print(e, i)
-
可迭代对象与迭代器对象 迭代是需要基于上一次的结果,越来越靠近目标 内置有__iter__方法的都可以被称为可迭代对象 能够被for循环的数据类型都是可迭代的 可迭代对象调用__iter__返回一个迭代器对象 迭代器对象拥有__iter__和__next__两种方法 迭代器对象提供了一种不依赖与索引的取值方式 迭代器对象一定是可迭代对象,可迭代对象不一定是迭代器对象 __iter__和__next__可以简写为iter() next() 迭代器对象不会直接生成全部数据,只会在调用时生成一个,有效节省内存 -
异常捕获 一旦程序出现了异常,程序就会停止运行 异常的结构:
- 第二行代表错误的位置
- 第三行代表错误类型和具体错误信息
异常分为语法错误和逻辑错误:
- 语法错误是不能也不应该出现的错误,说明代码的语法不正确
- 逻辑错误是可以出现的错误,发现及时修改
什么情况下使用异常捕获: - 在代码可能会因为一些不确定的因素导致报错时
- 异常捕获相当在报错之前就准备好报错后采取的措施
异常捕获的语法结构 try:
预测可能会异常的代码
except 错误类型 as e:
对应错误类型的应对措施
"""
try关键字
可以使用多个except
e代表详细的错误信息
错误类型可以使用Exceptin,捕获所有错误类型
可以使用else语句,在try语句正常结束时执行
可以使用finally语句,无论如何都会执行
"""
##### 主动抛出异常
* 使用raise关键字加错误类型,可以主动抛出异常信息
-
生成器对象 生成器
- 本质上就是迭代器,只不过迭代器是解释器提供的,生成器是我们自定义的
- 学习生成器对象的目的是为了优化代码,提供了一种不基于索引的取值方式,还有就是可以减少占用内存
自定义生成器 def func():
print(111)
num = yield 123
print(num)
print(222)
yield
res = func()
print(res)
res1 = res.__next__()
print(res1)
res.send(321)
"""
在函数中使用yield关键字,在调用时不会执行函数体代码,而是返回一个生成器对象
使用__next__方法执行函数体代码,在遇到yield停滞,等待下一次执行
可以在yield后添加返回值
yield还可以接收外界传入的数据值
send除了传入数据外还自动调用了__next__方法
使用send方法前必须先使用一次__next__方法
"""
-
生成器表达式 和列表生成器类似,外层使用小括号括起来可以使用一个for和一个if l1 = (i * 2 for i in range(10) if i != 3)
print(l1)
-
迭代取值与索引取值的差异 迭代取值:
- 不依赖与索引,对于无序数据类型也可以取值
- 只能依次向下取值
索引取值
二、模块
-
模块简介 模块就是将许多功能结合在一起的一个py文件
- 内置模块
python解释器自带的,可以直接导入 - 自定义模块
我们自己写的模块文件 - 第三方模块
别人写的模块,存放于网络上,使用前需要下载
- import
import md
md.fn()
"""
直接使用import导入模块,使用模块名.名字的方式调用模块中的名字
这样导入不容易产生变量名冲突
但是会将所有的名字全部导入
"""
- from…import…
from md import fn
fn()
"""
导入md模块中的fn函数名,然后就可以直接使用了
这样可以控制导入哪些名字
但是容易产生变量名冲突
"""
- 起别名
一般在多个模块文件名相同或原有的模块文件名复杂的情况下使用 在import后使用as关键字加上想要起的别名import md as m
- 导入多个名字
在import后填写多个模块名,名字之间使用逗号隔开,就可以导入多个模块,不过除非模块功能相似,不然不建议这么写import time, datetime
- 全部导入
在想要直接导入模块内所有名字时,可以使用*号全部导入from dm import *
-
循环导入问题
a.py: import b
def a_func():
pass
b_func()
b.py import a
def b_func():
pass
a_func()
- 在导入b文件时会先执行,执行b文件会导入a文件,导入a文件会执行a文件,a文件因为导入过b文件所以不会再导入,执行到调用b_func时还没有导入,所以报错
- 解决方法是在导入前先把名字准备好,但最好不要出现循环导入现象
-
模块的查找顺序
- 模块的查找顺序为:内存>内置>sys.path中路径
-
绝对导入与相对导入
- 绝对导入:
根据项目的根目录一层层往下找,如不是使用的pycharm,最好在运行文件中先将sys.path中添加项目根目录 - 相对导入:
根据运行文件的位置,去导入对应模块位置 相对导入只能在模块文件中使用,不能在运行文件中使用 相对导入使用 . 表示当前目录, … 表示上级目录, …/… 表示上上级目录 -
包的概念
-
软件目录开发规范 以后使用多个文件夹编程时,对于文件夹的名字有一定的规范
- bin 用于存放程序启动文件
- conf 用于存放程序配置文件
- core 用于存放程序核心逻辑
- db 用于存放程序数据文件
- lib 用于存放程序公共功能
- log 用于存放程序日志文件
- interface 用于存放程序接口文件
- read.txt 编写程序说明
- requirements.txt 保存程序所需第三方模块的名字和版本
-
常见内置模块
-
collections """提供了更多数据类型"""
from collections import namedtuple
coord = namedtuple('坐标', ['x', 'y'])
res = coord('4', '9')
print(res)
from collections import deque
res = deque()
print(res)
res.append(1)
res.append(2)
res.append(3)
print(res)
"""
队列的特性是先进先出
而双端队列两端都可以增加和移除数据
"""
res.appendleft(4)
print(res)
res.pop()
print(res)
res.popleft()
print(res)
from collections import OrderedDict
"""
字典在python3.6之前是无序列表
可以使用这个模块生成有序字典
"""
d2 = OrderedDict([('a', 1), ('b', 2)])
print(d2)
from collections import defaultdict
"""可以先看做一种构建字典的方式"""
d1 = defaultdict(k1=[], k2=[])
print(d1)
from collections import Counter
res = 'asdfzxcvfdasvczx'
d2 = Counter(res)
print(d2)
-
time模块
- 时间模块有三种格式:
- 时间戳:time.time(),返回值是从1970年1月1号0时0分0秒到执行时经过的秒数
- 结构化时间:time.gmtime(),返回值是方便计算机识别的时间元组
- 格式化时间:strftime(),返回值是方便我们看的时间
时间戳和格式化时间不能相互转换,需要经过结构化时间转换 -
datetime模块
- 和time模块相似,都是关于时间的模块
不过datetime模块把功能分成了几个类 最主要使用的有:
- time 关于时间
- date 关于日期
- datetime 关于日期与时间
- timedelta 关于时间间隔
- tzinfo 关于时区
import datetime
"""获取当前日期时间"""
t1 = datetime.datetime.today()
print(t1)
t2 = datetime.datetime.now()
print(t2)
"""获取当前日期"""
d1 = datetime.date.today()
print(d1)
"""获取时间间隔"""
t1 = datetime.timedelta(days=3)
print(t1)
-
os模块
importos
"""创建目录"""
os.mkdir(r'a')
os.makedirs(r'a\b\c')
"""删除目录"""
os.rmdir(r'a')
os.removedirs(r'a\b\c')
"""列举指定路径下的所有目录与文件"""
l1 = os.listdir()
print(l1)
l2 = os.listdir(r'D:\\')
"""重命名目录或文件"""
os.rename(r'a', r'b')
os.rename(r'a\aa', r'a\bb')
"""删除文件"""
os.remove(r'f.txt')
"""获取当前工作路径(绝对路径)"""
job_path = os.getcwd()
print(job_path)
"""获取文件路径"""
print(os.path.abspath(__file__))
print(os.path.dirname(__file__))
"""判断路径是否存在"""
print(os.path.exists(r'a'))
print(os.path.exists(r'a\b\c\a.txt'))
print(os.path.exists(r'a\c'))
print(os.path.isdir(r'a'))
print(os.path.isdir(r'aaa.txt'))
print(os.path.isfile(r'aaa.txt'))
print(os.path.isfile(r'a'))
"""拼接路径"""
p = os.path.dirname(__file__)
print(p)
res = os.path.join(p, 'a.txt')
print(res)
"""获取文件大小"""
print(os.path.getsize(r'aaa.txt'))
print(os.path.getsize(r'a'))
-
sys模块
import sys
print(sys.path)
print(sys.version)
print(sys.platform)
"""argv"""
res = sys.argv
'''需求 命令行执行当前文件必须要提供用户名和密码 否则不准执行'''
try:
username = res[1]
password = res[2]
except IndexError as e:
print('需要输入用户名和密码')
else:
if username == 'jason' and password == '123':
print('您可以执行该文件')
else:
print('用户名或密码错误')
-
json模块
import json
"""序列化"""
user_dict = {'name': 'jason', 'pwd': 123}
res = json.dumps(user_dict)
print(res)
"""dump需要配合open打开文件使用"""
with open('a.txt', 'w') as f:
json.dump(user_dict, f)
"""反序列化"""
res1 = json.loads(res)
print(res1)
"""load需要配合open打开文件使用"""
with open('a.txt', 'r') as f:
res2 = json.load(f)
|