迭代器与生成器

一、迭代器

异常捕获补充

1.异常的定义
	代码运行出错会导致异常 异常发生后如果没有解决方案则会导致整个程序结束
    
2.异常三个重要组成部分
	1.traceback
    	翻到最下面从下往上的第一个蓝色字体鼠标左键点击即可跳转到错误的代		码所在的行
    2.XXXError
    	错误的类型
    3.错误类型冒号后面的内容
    	错误的详细原因(很重要 仔细看完之后可能就会找到解决的方法)
        
3.错误的种类
    1.语法错误
    	不被允许的 出现了应该立刻修改
    2.逻辑错误
    	可以被允许的 出现了之后尽快修改即可
      
4.使用异常捕获的注意事项
	1.有可能会出现错误的代码才需要被监测
	2.被监测的代码一定要越少越好
	3.异常捕获使用频率越低越好
    
5.异常捕获的普通结构
    try:
        有可能会出错的代码
    except 错误类型 (as e):
        出错之后对应的处理机制(e是错误的详细信息)
    except 错误类型 (as e):
        出错之后对应的处理机制(e是错误的详细信息)       
        ...
    else:
        被监测的代码不报错的时候执行
    finally:
        无论是否报错最终都会执行
       
6.异常捕获的万能结构
    try:
        被监测的代码
    except Exception:
    print('你来啥都行 无所谓')  

7.配备其他一些关键字的用法(正确再执行,正确与否都执行,预言,主动报异常)
    Exception的用法  
    Base……的用法
    isinstance的用法
    raise的用法

for循环本质

1.for循环的本质
    1.将关键字in后面的数据先调用__iter__方法转为迭代器对象
    2.循环执行__next__方法
    3.取完之后__next__会报错 但是for循环会自动捕获该错误并处理
    
2.用其他代码实现for循环功能
	res = [1, 2, 4]
    while True:
    try:
        print(res.__next__())
    except StopIteration as e:
        break

迭代取值与索引取值对比

区分 优点 缺点
迭代取值 不依赖于索引的一种通用取值方式 取值的顺序永远都是固定的从左往右 无法重复获取
索引取值 可以重复取值 需要提供有序容器类型才可取值(不是一种通用的方式)

二、生成器

1.生成器的定义
	生成器就是自定义的迭代器
    
2.如何自定义一个生成器
	函数体内部含有yield关键字
    
3.自定义生成器的运行机理
	第一次调用内部含有yield关键字的函数,函数体代码不执行,而是将函数变成了生成器,以后每执行一次.__next__()方法时,函数体往下运行到yield停止,然后返回yield后面的数据。再执行.__next__()方法时,接着上次停止的地方继续执行,遇到yield再停止。
    eg: def my_iteral():
            print('hello world')
        	yield '.__next__()方法执行第一遍!'
            print('world')
            yield '.__next__()方法执行第二遍'
4.练习:用其他代码实现range功能
	def my_range(start, stop=None, step=1):
    if not stop:
        stop = start
        start = 0
    while start < stop:
        yield start
        start += step

yield传值(了解)

1.yield如何进行传值
	def eat(name):
		print('%s 准备干饭!!!'%name)
		while True:
		food = yield
		print('%s 正在吃 %s' % (name, food))
	res = eat('小明')  # 并不会执行代码 而是转换成生成器
	res.__next__()
    res.send('肉包子')
    res.send('菜包子')
    
2.yield传值时发生了什么事
	将值赋值传给yield,调用一次__next__()方法

yield与return对比

区分 yield return
相同点 可以返回值(支持多个并且组织成元组)
不同点 函数体代码遇到yield不会结束而是"停住"
yield可以将函数变成生成器 并且还支持外界传值
函数体代码遇到return直接结束

生成器表达式

1.生成器表达式怎么写
	res1 = (i+1 for i in l if i!=44)
    格式:(返回值 for条件 (判断条件))
    
2.生成器表达式的内部代码什么时间执行
	生成器表达式内部的代码只有在迭代取值的时候才会执行
    
3.生成器和迭代器的价值
	迭代器对象 生成器对象 我们都可以看成是"工厂",只有当我们所要数据的			时候工厂才会加工出"数据",上述方式就是为了节省空间
    	
4.一道经典的题目
    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)
   	res = list(g)
	print(res)
上述答案为( C ):
#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() 判断容器中所有的数据的真假
3.bin() oct() hex()  将十进制数转成二进制,八进制,十六进制
4.bytes() str()	编码,解码
5.callable()  是否可调用(能不能加括号运行)
6.chr()  ord()	将ASCII码与字符之间进行转换
7.complex()  复数
8.dir()  查看当前对象可以调用的名字
9.divmod()
10.eval()只能识别简单的语法 
   exec()可以识别复杂语法都是将字符串中的数据内容加载并执行
11.isinstance()  判断是否属于某个数据类型
12.pow() 求商与余数(应用案例:网站的分页)
13.round() 五舍六入
14.sum() 求和
posted @ 2021-11-22 19:00  recordlife  阅读(52)  评论(0)    收藏  举报