学习python-周总结04
摘要:这周没什么编程作业但是学习内容偏理论化,知识量很多。虽然说缓了一下进度,虽然我有几天预习了一下后面内容,但是我觉得预习对我来说作用不大,虽然说作用不大,但是还是有些知识内容加深了印象。我觉得还得跟着自己的节奏走。多复习之前学的知识点,掌握好今天学习的内容就好了,多余时间可以敲点代码,这一天时间基本这样没了。
周总结
一、常见内置函数
内置函数:提前定义好,直接拿来使用。
| 内置函数 | 作用 |
|---|---|
| abs() | 求绝对值 |
| all() 与 any() | 判断容器类型中的所有数据值对应的布尔值是否为True all()判断所有数据值为True的情况下,结果才有是True any()判断有一个数据值为True,结果为True |
| bin() | 十进制转二进制数、oct()十进制转八进制、hex()十进制转十六进制 |
| int() | 数据类型转换,其他进制转十进制 |
| bytes() | 类型转换 编码后可以解码成任意的数据类型 res = bytes('待编码内容','utf8') str(res,'utf8')转成字符串类型 |
| callable() | call在IT专业名词中翻译成 调用 加括号执行 |
| chr() ord() | 依据ASCLL码表实现字符与数字转换 chr()数字转换成字母 ord()字母转换成数字 |
| dir() | 获取对象内部数据可以通过句点符来获取 |
| duvmod() | 获取除法之后的整数和余数(可以通过解压赋值获得整数和余数) divmod(879,10) |
| 内置函数 | 作用 |
|---|---|
| enumerate | 枚举 循环打印出数据值和对应的索引值 for i, j enumerate(name_list,10): 第二个参数表示从10开始的索引值。 |
| eval() exec() | 能够识别字符串python代码并执行 eval不能识别复杂的oython语句 exec()能识别复杂的python代码 |
| hash() | 返回一串随机的数字(哈希) |
| help() | 参看帮助信息 |
| isinstance() | 判断某个数据是否属于某个数据类型,返回为布尔值 |
| pow() | 幂指数 |
| round() | 四舍五入 |
二、可迭代对象
-
迭代就是更新换代,每次迭代都需要基于上一次的成果
-
内置:通过
. 句点符直接点出方法 -
内置有
__inter__方法都叫做可迭代对象-
可迭代对象:
字符串,列表,字典,元组,集合,文件对象(本身就是迭代器对象)
-
不可迭代对象
整型,浮点型,布尔值,函数名
-
可迭代对象能够支持for循环
-
三、迭代器对象
作用:
? 迭代器对象给我们提供一种不依赖于索引取值的方式。
? 解决了对无序类型循环取值。
-
判断迭代器对象
内置有
__iter__和__next__的对象都成为迭代器对象 -
可迭代对象与迭代器对象的关系
可迭代对象调用
__iter__方法之后就会变成迭代器对象 -
迭代器对象迭代取值
res = 'xz'.__iter__() 将其变成一个迭代器对象 print(res.__next__()) # x print(res.__next__()) # z -
迭代器使用
l = [1, 2, 3, 4, 5] print(l.__iter__().__next__()) #每次产生一个新的迭代器 res = l.__iter__() print(res.__iter__().__next__()) #每次使用都是同一个迭代器对象 -
针对双下方法简写
res = l.__iter__() ------>iter(l) res.__next__() ------->next(res) -
迭代器对象特殊的地方
节省内存。
四、for循环的原理
-
语法结构:
for 变量名 in可迭代对象: 循环体代码 -
for循环原理:
1.for会自动将in后面数据调用__iter__()变成迭代器对象 2.之后每次循环调用__next__()取值 3.最后没有值__next__()会出错,for能够自动处理该错误的,让循环正常结束。
实现列表队列和堆栈:
队列:先进先出
堆栈:先进后出
用pop内置方法索引来实现。
pop(索引值,索引值指定位置取)
五、异常捕获
-
异常简介:程序在运行过程中如此出现异常会导致整个程序的结束。‘bug’
-
异常类型:NameError , ImportError , IndexError , KeyError ......
-
异常分类:语法错误,逻辑错误
-
异常捕获简介:
提前预测可能要出现的问题并提前给出处理的措施 -
基本语法结构:
try: 可能会出现的代码(被try监控) except 错误类型 as e: #e就是具体错误的原因 对应错误类型的解决措施 万能异常:Exception / BaseException 异常捕获其他操作补充 else | finally else:try检测的代码没有出错的情况下正常运行结束,就会执行else子代码。 finally:try检测的代码无论有没有出错,最后都会执行finally子代码。 assert 断言 也是检测语句,如果不成立就会报错。 raise 主动抛出异常 检测语句成不成立,成立就会主动抛出异常 raise Exception('反正就是长得帅!!!') 注意:异常捕获能尽量少用就少用 for循环内部的本质:就是可迭代对象--->迭代器对象--->异常捕获
六、生成器对象(自定义迭代器对象)
-
本质:迭代器对象
生成器是我们自定义写出来的。
迭代器是解释器提供的。
-
目的:优化代码,节省内存,是一种通用的取值方式(一种不依赖索引取值)
-
代码:
def index(): print('你好!') yield xz,wyb print(index) res = index() print(res) res.__next__() 1.当代码有yield的关键字,那么函数名第一次加括号调用不会执行函数体代码,而是由普通的函数变成了迭代器对象(生成器),将返回值赋给生成器。 2.yield可以在函数代码中出现多次,每次调用__next__方法都会从上往下执行直到遇到yield代码停留在此。 3.yield后面如果有数据值,就会像return一样返回出去。 如果数据值多而且用逗号隔开,则会自动组织成元组返回。 -
yield:
res.send() #传值并调用__next__方法 将值传给yield赋值左边的变量名,并调用__next__()方法。
七、生成器表达式
列表生成式 --- 中括号
l1 = [i**2 for i in range(10) if i > 3]
print(l1)
l2 = (i**2 for i in range(10) if i > 3)
print(l2)
| 索引取值 | 迭代取值 | |
|---|---|---|
| 优势 | 可以随意反复获取任意数据值 | 提供一种通用的取值方式 |
| 劣势 | 针对无序容器类型无法取值 | 取值方向固定(前->后),不能回退 |
八、模块
-
模块简介:一系列功能的结合体
-
模块的分类:内置模块(解释器自带),自定义模块(自己写的),第三方模块
-
模块导入:
在真正项目中,所有文件的py文件名称都是英文,没有所谓的编号和中文。
-
导入模块的句式1
import句式- 先执行代码文件的代码。执行代码会创建的一个全局名称空间。
import md就是运行模块文件,并创建一个全局名称空间。- 如果执行文件想获取模块文件里的名字,则需要通过
. (模块里的名字)的方式就可以使用到被导入文件名称空间里的名字。
-
导入模块的句式1
for...import句式- 先执行文件,创建执行文件的名称空间
from md import money创建被导入文件的名称空间- 执行被导入文件的代码,将产生的名字存储到到导入文件的名称空间。
- 在执行文件中获取指定的名字,指向被导入文件的名称空间。
-
两种导入句式的优缺点
import from...import 优点 通过句点符方式可以使用到模块内所有的名字,并且不会冲突。 指名道姓的使用指定的名字,并且不需要加模块前缀。 缺点 什么都可以点,有时候并不想让所有名字都能使用 名字及其容易产生冲突,绑定关系被修改。 -
补充知识
-
起别名:
情况一:多个模块文件名相同时,我们可以将文件名换个新名字。
情况二:原有的模块的文件名复杂。
-
导入多个名字:
import句式:导入方式建议多个模块功能相似才能适应 不相似尽量分开导入from ... import ...句式:多个名字出自于一个模块文件 -
全导入
只能在
from ... import ...句式使用。from md import *# *表示所有在模块文件中可以使用
__all__ = [字符串的名字]控制*能够获取的名字 -
循环导入问题
- 循环导入简介:两个文件彼此导彼此。
- 使用彼此名字可能在还没准备好的情况下就使用了。
- 如何解决循环导入保存现象:彼此在使用名字前,先准备好。
-
九、判断文件类型
- 所有py文件中都自带一个
__name__内置名 - 当py文件是被导入时,
__name__的结果是__main__ - 当
py文件是执行文件的时候__name__的结果是模块名(文件名) if __name__== '__main__':
十、模块的查找顺序
- 先去内存中查找
- 再去内置中查找
- 再去
sys.path中查找(程序系统环境变量) - 不能创建一个和内置模块相同的文件名
- 导入模块的时候一定要知道谁是执行文件:所有的路径都是参照执行文件来。
- 通用的方式 :
sys.path.append(目标文件所在的路径) - 利用
from...import句式:from xxx import md
十一、绝对导入与相对导入
-
只要涉及到模块的导入,那么sys.path永远以执行文件为准。 -
绝对导入:其实就是执行文件所在的
sys.path为起始路径,往下一层层查找。由于
pycharm会自动将项目根目录添加到sys.path中所查找模块肯定不报错的。 -
相对导入:
只能在模块文件中使用,不能在执行文件中使用。
相对导入在项目中比较复杂的情况下可能会出错。
十二、包的概念
-
如何理解包
内部含有
__init__.py的文件 -
包的作用
内部存放多个py文件(模块文件),仅仅是为了更方便管理模块文件。
-
具体使用
导入包名其实导入是里面
__init__.py文件其实也可以跨过
__init__.py直接将其他模块文件导入包里面。 -
注意:针对
python2解释器,文件夹下面必须要有___init__.py才能被当做包。python3无所谓。
十三、编程思想的转变
-
小白阶段:按需求从上往下堆叠代码
-
函数阶段:将代码按照功能不同封装成不同函数
-
模块阶段:根据功能的不同封装成不同的函数
目的是为了更加方便快捷高效的管理资源
十四、软件开发目录规范
| 文件夹 | 作用 | 文件 |
|---|---|---|
| bin | 启动文件 | start.py |
| conf | 配置文件 | settings.py |
| core | 核心逻辑 | src.py |
| lib | 公共资源 | common.py |
| db | 数据文件 | userinfo.txt |
| log | 日志文件 | log.log |
| interface | 接口文件 | user.py |
| readme.txt | 编写程序的说明、介绍、广告、类似于产品的说明书 | |
| requirements.txt | 存储程序所需的第三方模块和版本 |
十五、常见内置模块
-
collections
内置方法 作用 举例 namedtuple 生成可以使用名字来访问元素内容的tuple point = namedtuple('二维坐标系', ['x', 'y']) deque 双端队列,高效实现插入和删除操作的双向列表,适合用于队列和栈。 q = deque(['a', 'b', 'c'])
q.append('x')
q.appendleft('y')OrderedDict 有序字典,OrderedDict的Key会按照插入的顺序排列,不是Key本身排序: od = OrderedDict([('a', 1), ('b', 2), ('c', 3)]) defaultdict 带有默认值的字典 dict1 = defaultdict(list) -
时间模块之time模块
时间的三种格式:
- 时间戳 time.time() 机器能识别的时间
- 结构化时间 time.gmtime()
- 格式化时间 time.strftime() 人能够看懂的时间字符串
1.时间戳:时间戳表示的是从1970年1月1日00:00:00开始按秒计算到今天的时间 print(time.time()) 2.本地的时间:print(time.localtime()) 3.时间戳-->结构化时间 print(time.gmtime()) #UTC时间,与英国伦敦当地时间一致 4.按照某种格式显示的时间(格式化的字符串形式的时间):strftime_time print(time.strftime('%Y-%m-%d %H-%M-%S')) %X可以表示后面的%H-%M-%S print(time.strftime('%Y-%m-%d %X')) 5.结构化时间-->时间戳 time.mktime(结构化时间) 6.结构化时间-->字符串时间 time.strftime("格式定义","结构化时间") 7.字符串时间-->结构化时间 time.strptime(时间字符串,字符串对应格式) -
时间模块之datetime
date 年月日 datetime 年月日 时分秒 timedelta-时间差 res1 = datetime.date.today() tl = datetime.timedelta(days=5) rint(res1 + tl) # 2022-07-20 print(res1 - tl) # 2022-07-10 timedelta括号内有很多参数 没有的时间可以通过换算得来 读取的时间是系统的本地时间 print(datetime.datetime.now()) 读取的时间一直都是系统的“世界标准时间” print(datetime.datetime.utcnow()) 以时间字符串的形式 c =datetime.datetime(2017, 5, 23, 12, 20) print('指定日期:', c)
十六、os模块
os模块主要跟当前程序所在的操作系统打交道。
| 方法 | 作用 |
|---|---|
| mkdir | 创建单级目录 |
| makedirs | makedirs可以创建多级目录和单级目录 |
| rmdir | 删除但单级目录 |
| removedirs | 支持多级和单级删除,针对有数据的目录是没法删除的 |
| listdir | 列举指定路径下的文件名称(文件、目录) |
| rename | 重命名文件 |
| remove | 删除指定文件(在执行文件同目录下) |
| getcwd | 获取当前执行文件路径(所在的路径) 绝对路径 |
| chdir(r'..') | 返回上一层 |
| 方法 | 作用 |
|---|---|
| os.path.abspath(file) | 获取当前文件的绝对路径 |
| os.path.dirname(file) | 获取当前文件所在的目录路径(必须得记) |
| os.path.exists() | 判断路径是否存在(文件、目录) |
| os.path.isdir() | 判断是否是文件夹或者目录 |
| os.path.join() | 拼接路径 |
| os.path.getsize() | 获取文件大小 bytes为单位 |
十七、sys模块
sys模块主要是跟python解释器打交道。
| 方法 | 作用 |
|---|---|
| sys.path | 程序系统文件路径 |
| sys.version | 解释器版本 |
| sys.platform | 当前平台 |
| sys.argv | 命令行参数,实现从程序外部向程序传递参数。 |
十八、json模块
- json模块也称为
序列化模块 - json模块是不同编程语言之间数据交互必备的模块(处理措施)
- 数据基于网络传输肯定是二进制,那么在python中只有字符串可以调用encode方法转换成二进制数据,所以json格式的数据也属于字符串。
- json格式的数据的特征:字符串类型,引号是标志性的双引号
- json有四个方法,两两搭配。
- 涉及到用户数据的存储 可以单用户单文件
| dumps() | loads() | dump() | load() | |
|---|---|---|---|---|
| 作用 | 将其他数据类型转换成json格式字符串 | 将json格式字符串转换成对应的数据类型 | 将其他数据数据以json格式字符串写入文件 | 将文件中json格式字符串读取出来并转换成对应的数据类型 |
| 举例 | f.write(json.dumps(d)) | data = f.read() res = json.loads(data) | json.dump(d, f) | res = json.load(f) |