异常捕获补充(了解)
try:
name
except NameError as e:
错误处理
else: # 不报错就走
被检测的代码没有报错正常运行结束会走。报错就不会走。
finally: # try与关键字finnally使用,不管有没有错,都会走这里
子代码(可以用这个保存报错前的状态)
#断言语句
assert isinstance(元素,类型) #判断某个元素是不是这个类型
#主动抛异常,报错
raise 异常类型 # 关键字后面跟异常类型,可以用来监测等,可以不添加异常类型。
for循环本质及迭代器总结
for循环while模拟
取出字典的值
d = {'name':'tony','pwd':123,'hobby':'read'}
res = d.__iter__() # 将字典转换为迭代器对象
print(res.__next__()) # 就可以一次一次取出字典里面的K
但取尽之后就会报错,就可以用while循环
while True: # 需要在同一个位置进行循环而不是多个位置,不用使用函数
try: # 检测什么时候会取尽字典里的元素
print(res.__next__()) # 循环取出字典内元素
except StopIteration as e: # 报错的类型
break # 报错之后就可以停止循环
最后效果等同于for循环
迭代取值与索引取值对比
迭代取值:
优点:不依赖索引的通用取值方式
缺点:取值的顺序永远都是从左往右,无法重复取值,取尽结束
索引取值:
优点:可以取重复的值使用
缺点:需要提供有序容器类型才可以取值。不是一种通用的方式
生成器对象(自定义的迭代器对象)
生成器就是自定义迭代器
def my_ge():
print('你好!!!')
yield # 关键字后面可以有返回值。不添加默认None,停留在这里。
print('你好!') # 第二次运行,如果代码继续执行后续没有yield会报错
yield #第二次运行有yield会停止,返回当前yield后面的返回值
# 当函数体含有关键字yield关键字,那么在第一次调用函数的时候并不会执行函数体代码,而是将函数变成了生成器(迭代器)
#每一次取值都是基于上一次取值的结果
res = my_ge() # 不执行函数,将函数变成生成器(迭代器)
res.__next__() #用__next__()方法调用,
你好!!! # 第一个返回值
res.__next__() #第二次执行
你好! # 第二个返回值
函数体内有 yield或者 return 碰到就会停止
# 函数体内有yield就不用在添加return。因为函数已经变成生成器
def xxx():
print('你好!')
yield 123
print('你也好!')
yield 123
res = xxx()
while True:
try:
print(res.__next__())
except Exception as e:
break
基于生成器实现range方法
range功能:填入一个数字以0为起始。填入两个以第一个起始,第二个结束,第三个表示步长
建立函数,需要参数,a,b=None,c=1 # 模拟range参数传入,b=None:表示如果只输入一个值之后b就当做没有,c默认为1,如果填了三个参数就根据填入的为标准
def xxx(a,b=None,c=1):
if not b: # 判断b not(取反)因为b=None不会执行但取反表示判断可以执行
b = a # 输入一个元素走,将输入的值赋值给b,
a = 0 # a重新赋值为0
while a < b : # 判断 a<b 就循环下面代码
yield a # 直接停止,并将a返出去,
a += c # 当再次执行的时候a+默认的1或者输入的步长
l1 = xxx(7) # 将函数转变为生成器
for i in l1: # 循环生成器返回的a,for自带__next__()方法取出来之后会自动执行下一个__next__()继续运行生成器和异常处理,
print(i) # 打印出来
yield传值(了解)
.send() #需要内置函数
def eat(name): # 定义函数,传入参数
print('%s 准备干饭!!!'%name) # 打印
while True: #循环下面内容
food = yield # 返回yield的值,停止等待下一次的__next__()方法调用,再次调用之后将send传入的值赋值给food。
print('%s 正在吃 %s' % (name, food)) # 打印,之后回到上面的yield,停止,等待调用
res = eat('jason') # 并不会执行代码 而是转换成生成器
res.__next__()
res.send('肉包子')
res.send('盖浇饭')
yield与return对比
yield
1.可以返回值(支持多个并组织成员组)
2.函数体代码遇到yidle不会结束而是'停住'
def xxx():
print('第一函数体')
yield '第一次返回'
print('第二函数体')
yield '第二次返回'
print('第三函数体')
yield '第三次返回'
l1 = xxx()
print(l1.__next__())
print(l1.__next__())
print('外面111')
print('外面222')
print(l1.__next__())
print('外面333')
第一函数体
第一次返回
第二函数体
第二次返回
外面111
外面222
第三函数体
第三次返回
外面333
3.yield可以将函数变成生成器,而且还支持外界传值
return
1.可以返回值(支持多个并且组织成元组)
2.函数体代码遇到return直接结束
Process finished with exit code 0
生成器表达式
l = [11, 22, 33, 44, 55, 66, 77, 88, 99]
res1 = (i+1 for i in l if i!=44)
'''
l1 = [11,22,33,44,55,66,77,88]
res = (i for i in l1 )
print(res) #生成式表达式
l = [11, 22, 33, 44, 55, 66, 77, 88, 99]
res = [i+1 for i in l if i!=44]
print(res) # 列表表达式
'''
# 上述注意列表表达式[]和生成器表达式()
"""
生成器表达式内部的代码只有在迭代取值的时候才会执行
"""
# print(res1.__next__())
# print(res1.__next__())
# print(res1.__next__())
"""
迭代器对象 生成器对象 我们都可以看成是"工厂"
只有当我们所要数据的时候工厂才会加工出"数据"
上述方式就是为了节省空间
"""
生成器笔试
# 求和
def add(n, i):
return n + i
# 调用之前是函数 调用之后是生成器
def test():
for i in range(4):
yield i
g = test() # 初始化生成器对象
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)
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]
常见内置函数
1.abs() 绝对值 # 传入数据,转为绝对值
2.all() any() # 根据布尔值判断,返回的也是布尔值。
l1 = [11,22,33,0]
print(all(l1)) # 所有的元素都为True结果才是True
print(any(l1)) # 所有元素只要有一个为True结果就是Teue
3.bin() oct() hex() # 进制数 二进制,八进制,十六进制
4.bytes() str()
res = '学习吧'
res1 = bytes(res,'utf8') # 直接编码
res2 = str(res1,'utf8') # 直接解码
5.callable() #是否可以调用(能不能加括号运行) 返回布尔值
6.chr() ord() #根据ASCCII码转数字找字符and根据输入字符找数字
chr():# ()可以添加 + - * // | 。得到的值是整形就可
chr(数字1 | 数字2)
数字2的值:可以是0or1,16or17,32or33,48or49
0or1 :数字1 + 0or1
16or17:数字1 + 16or17
依次类推
最后的值就是ascii对应的字符
7.complex() # 复述
print(complex(123)) # (123+0j)
8.dir() #查看当前对象可以调用的内置名字
9.divmod() #整除取余
print(divmod(101,10))
(10, 1) # 元组
"""总数据100 每页10条 10页"""
"""总数据99 每页10条 10页"""
"""总数据101 每页10条 11页"""
10.eval() exec() # 识别字符串内简单的语法加载并执行
11.isinstance() # 判断是否属于某个数据类型(元素,数据类型)
12.pow() # 开方(数字,数字几次方)
13.round() # 四舍五入,(五舍六入)
14.sum() # 元素内的值总体相加