今日总结 3.26
作者:互联网
今日内容概要
昨日内容回顾:
1.可迭代对象 迭代就是更新换代 但是每次迭代的过程都需要依赖上次的结果 就是有一个奠定基础让他去更新
2.可迭代对象:内置有 双下iter方法 都是可迭代对象 __iter__ 有以下几种类型 字符串列表字典元组集合文件对象
简便写法:
__inter__ inter()
__next__ next()
__len__ len()
迭代器对象
迭代器对象就是有__inter__ 和 __next__这两种方法 可迭代器对象调用__inter__方法之后就会变成迭代器对象
迭代器对象如果再次调用__iter__方法还是迭代器对象本身
1.迭代器对象作用
节省空间储存数据 优化数据的储存形式
2.迭代器对象取值特征
同一个迭代器内部数据内取一次就会少一个 去完了里面也就空了
3.迭代器对象的主要特征
提供了一种不依赖于索引取值的方式(非常重要的!!!)
没有它我们就无法对无序容器类型进行迭代取值
.迭代取值的要求
每次先产生一个新的迭代器对象然后取值、
for循环内部原理"""
for循环底层原理
for 变量名 in 可迭代对象:
循环体代码
1.会将in后面的数据调用__iter__()变成迭代器对象
为什么文件对象也可以for循环 因为本身就是迭代器对象 再次调用不变
2.针对产生的迭代器对象依次调用__next__()方法迭代取值
3.当值取完之后 会自动处理报错并退出循环
"""
异常处理
什么是异常 bug 代码中有异常会结束进程然后整个程序停止
异常信息的组成
Traceback (most recent call last):
File "/Users/jiboyuan/PycharmProjects/day16/05 异常处理.py", line 3, in <module>
name
NameError: name 'name' is not defined
1.line关键字所在的一行
用于提示你代码哪一行出错了 点击前面的蓝色字体可以直接定位
'''如果报错的信息很长 一般最后一个才是'''
2.NameError错误的类型
代码的报错也可以分为很多类型
3.name 'name' is not defined
具体的报错原因(就是解决报错的答案)
总结下来就是 异常定位 异常类型 异常提示
3A.异常的分类
语法异常:肯定不能出现的!!!
逻辑异常:可以被允许的 但是有时候修改起来一点也不简单
Nameerror...XXXerror
语法结构
try:
可能会出错的代码
except 出错的类型1 as e:
针对出错类型的解决措施
except 出错的类型2 as e:
针对出错类型的解决措施
except 出错的类型3 as e:
针对出错类型的解决措施
except 万能异常(Exception) as e:
统一出错的解决措施
else:
可能会出错的代码没有出错 执行完毕后就会走else
finally:
无论上面怎么走 最后都要走finally
'''异常捕获能尽量少用就尽量少用 被检测的代码越少越好!!!'''
# 5.其他补充
断言 assert
主动报错 raise
for循环本质
res = 可迭代对象.__iter__()
while True:
try:
print(res.__next__)
except StopIteration as e:
break
"""万能异常可以捕获常见的异常类型 但是并不是所有"""
今日内容详细
* 生成器对象(自定义迭代器)
在Python中,对list、tuple、str等类型的数据可以使用for...in...的循环语法,从其中依次拿到数据进行使用,我们把这样的过程称为遍历,也叫迭代。
在Python的基本数据类型中,列表、元组、字符串、字典都是可迭代的,而整数、浮点数、布尔数都是不可迭代的。
'''"""自定义 自定义迭代器本质其实还是迭代器 只不过这是我们自己写代码而产生的目的也是为了节省空间 优化代码
定义生成器需要编写函数 并且在函数替代码中使用 yield 关键字 想要自己定义就是两个点自己编写函数 函数体代码 必须有关键字 yield
再说一下 这个关键字 yield 这个功能
1.可以返回后面的值 与return一致
2.可以将代码停在yield位置 下次基于该位置往后执行
3.还可以接收外界传值
res.send() # 传值+迭代
它每次只跑一次循环,只有等再次调用next() 时, 程序才会再执行一次/
* 自定义range方法
range 首先了解一下range的大概意思英文翻译过来 变化变动 (在一定的范围内)变化,变动;(按一定位置或顺序)排列,排序
、# 写代码一定不要想的太多 先写一个大致的主题 之后再慢慢扩展
'''先考虑range方法的一种参数情况 其余两种后面再考虑
def my_range(start, stop=None, step=1):
if not stop:
stop = start
start = 0
while start < stop:
yield start
start += step
yielid关键字作用
可以将函数替代吗变成生成器 也可以返回值 还可以暂停代码 就是暂停到这个关键字处
外界也可以给他传值
代码示例:
def eat(name):
print(f'{name}准备干饭')
while True:
food = yield
print(f'{name}正在吃{food}')
res = eat('赵公子')
# 想执行一次代码 如果想执行多次直至结束 可以直接用for循环
res.__next__()
# res.__next__() 赵公子正在吃None
# res.__next__() 赵公子正在吃None
res.send('生日蛋糕') # 可以给yield传值 并且自动调用一次__next__方法
res.send('大鸡腿') # 可以给yield传值 并且自动调用一次__next__方法
send '传值用 因为老是忘 所以,send方法与next的不同在于: send首先给生成器传值,再执行和Next相同的操作( 从上次暂停的地方开始,执行到下一个yield ) send(None) 等价于 Next'
生成器表达式# 也是为了节省存储空间
在后期我们做代码优化的时候 可以考虑使用 前期学习阶段可以忽略
# res = (i for i in 'jason')
# print(res) # <generator object <genexpr> at 0x1130cf468>
# print(res.__next__())
"""生成器内部的代码只有在调用__next__迭代取值的时候才会执行"""
# 普通的求和函数
def add(n, i):
return n + i
# 生成器对象 返回 0 1 2 3
def test():
for i in range(4):
yield i
# 将test函数变成生成器对象
g = test()
# 简单的for循环
for n in [1, 10]:
g = (add(n, i) for i in g)
"""
第一次for循环
g = (add(n, i) for i in g)
第二次for循环
g = (add(10, i) for i in (add(10, i) for i in g))
"""
res = list(g) # list底层就是for循环 相当于对g做了迭代取值操作
print(res)
#A. res=[10,11,12,13]
#B. res=[11,12,13,14]
#C. res=[20,21,22,23]
#D. res=[21,22,23,24]
"""正确答案是C 诀窍就是抓n是多少即可""
模块
1.什么是模块?
'首先讲一下什么是模块 模块就是一系列功能提的结合可以直接使用较为方便 Python中,一个.py文件就称之为一个模块(Module)。
2.为什么用模块?
'在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护。
'为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式。
'最大的好处是大大提高了代码的可维护性。其次,编写代码不必从零开始。当一个模块编写完毕,就可以被其他地方引用。我们在编写程序的时候,也经常引用其他模块,包括Python内置的模块和来自第三方的模块。
'使用模块还可以避免函数名和变量名冲突。每个模块有独立的命名空间,因此相同名字的函数和变量完全可以分别存在不同的模块中,所以,我们自己在编写模块时,不必考虑名字会与其他模块冲模块分类
3.模块的三种来源?
1.'内置模块 无需下载 解释器自带 直接可以导入
2.'自定义模块 自己写的代码 封装成模块 写的好的话可以发到网上供别人使用
3. '第三方模块 也就是别人写的 然后发布到网上 然后可以下载使用的 就是第三方模块
4.模块长啥样?
1.使用python代码编写的py文件 # 我们需要掌握 2.多个py文件组成的文件夹(包) # 我们需要掌握 3.已被编译为共享库或DLL的c或C++扩展(了解) 4.使用C编写并链接到python解释器的内置模块(了解)
import md
# print(md.name)
# md.read1()模块的两种导入方式
方式1>>>:import...句式"""要想使用模块 必须先导入 而导入的方法有两种"""方式 >>:import...句式import md
# print(md.name)
# md.read1()
前提:在研究模块的时候 一定要分清楚谁是执行文件 谁是被导入文件(模块)
模块简介.py是执行文件 md.py是被导入文件(模块)
导入模块内部到底发送了什么事情
1.执行当前文件 产生一个当前文件的名称空间
2.执行import句式 导入模块文件(即执行模块文件代码产生模块文件的名称空间)
3.在当前文件的名称空间中产生一个模块的名字 指向模块的名称空间
4.通过该名字就可以使用到模块名称空间中的所有数据
ps:相同的模块反复被导入只会执行一次
import句式的特点
可以通过import后面的模块名点的方式 使用模块中所有的名字
并且不会与当前名称空间中的名字冲突(指名道姓)
"""
方式2>>>:from...import...句式
from md import name,money,read1
# print(name) # jasonNB
# name = 'kevin'
# print(name) # kevin
print(money) # 报错 from md import name 只使用模块中的name名字
read1()
"""
1.执行当前文件产生一个名称空间
2.执行导入语句 运行模块文件产生名称空间存放运行过程中的所有名字
3.将import后面的名字直接拿到当前执行文件中
"""
"""
1.重复导入也只会导入一次
2.使用模块名称空间中的名字不需要加模块名前缀 直接使用即可
3.但是from...import的句式会产生名字冲突的问题
在使用的时候 一定要避免名字冲突
4.使用from...import的句式 只能使用import后面出现的名字
from...import...可以简单的翻译成中文
从...里面拿...来用 没有提到的都不能用 指名道姓
导入补充
# 1.可以给模块起别名(使用频率很高)
'''比如模块名或者变量名很复杂 可以起别名简写'''
# import md as m
# print(m.name)
# from md import name as n
# print(n)
# 2.连续导入多个模块或者变量名
# import time, sys, md
# from md import name, read1, read2
"""连续导入多个模块 这多个模块最好有相似的功能部分 如果没有建议分开导入
如果是同一个模块下的多个变量名无所谓!!!
"""
# import time
# import sys
# import md
# 3.通用导入
from md import *
'''*表示md里面所有的名字 from...import的句式也可以导入所有的名字
如果模块文件中使用了__all__限制可以使用的名字 那么*号就会失效 依据__all__后面列举的名字
'''
print(name)
print(money)
标签:总结,__,res,name,迭代,import,模块,3.26,今日 来源: https://www.cnblogs.com/ister/p/16058830.html