邵邵。

导航

生成器yield

异常捕获补充(了解)

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()  # 元素内的值总体相加

posted on 2021-11-22 17:42  邵邵。  阅读(78)  评论(0)    收藏  举报