python函数迭代器与生成器
一.异常捕获
1 try: 2 被监测的代码 3 except 错误类型 as e: 4 ... 5 else: 6 被监测的代码不报错的时候会执行 7 finally: 8 无论是否报错最终都会执行 9 10 # 断言 11 name = 'jason' 12 assert isinstance(name, str) 13 14 # 主动报异常 15 raise 错误类型
二.for循环本质
1 """ 2 for循环内部原理 3 1.将关键字in后面的数据先调用__iter__方法转为迭代器对象 4 2.循环执行__next__方法 5 3.取完之后__next__会报错 但是for循环会自动捕获该错误并处理 6 """ 7 res = 数据.__iter__() 8 while True: 9 检测代码是否会报错 10 res.__next__() 11 如果报错了则自动处理掉并结束while循环
三.迭代取值与索引取值对比
""" 迭代取值 优点: 1.不依赖于索引的一种通用取值方式 缺点: 1.取值的顺序永远都是固定的从左往右 无法重复获取 索引取值 缺点: 1.需要提供有序容器类型才可取值(不是一种通用的方式) 优点: 1.可以重复取值 """
四.生成器对象
1 # 定义阶段就是一个普通函数 2 def my_ge(): 3 print('first') 4 yield 123, 222, 333 5 print('second') 6 ''' 7 如果函数体内含有yield关键字,那么在第一次调用函数的时候并不会执行函数体代码,而是将函数体代码变成了生成器(迭代器) 8 ''' 9 res = my_ge().__next__() # 每执行一个__next__代码 往下运行到yield停止 返回后面的数据。 10 print(res)
五.自定义range功能
1 # 自定义range功能 2 def my_range(start_number, end_number=None, step=1): 3 if not end_number: 4 end_number = start_number 5 start_number = 0 6 while start_number < end_number: 7 yield start_number 8 start_number += step 9 10 11 res = my_range(10) 12 for i in res: 13 print(i) 14 """ 15 注意要考虑到range的三种情况 16 """
六.yield传值(目前为止的第三种传值方式)
1 # yiel 传值 (目前为止第三种传值方式) 2 def eat(name): 3 print('%s是个大帅哥' % name) 4 while True: 5 food = yield 6 print('%s 正在吃 %s' % (name, food))
七.yield与return对比
yield
1.可以返回值(支持多个并且组织成元组)
2.函数体代码遇到yield不会结束而是"停住"
3.yield可以将函数变成生成器 并且还支持外界传值
return
1.可以返回值(支持多个并且组织成元组)
2.函数体代码遇到return直接结束
八.生成器表达式
1 l = [11, 22, 33, 44, 55, 66, 77, 88, 99] 2 # res = [i+1 for i in l if i!=44] 3 # print(res) 4 5 # res1 = (i+1 for i in l if i!=44) 6 """ 7 生成器表达式内部的代码只有在迭代取值的时候才会执行 8 """ 9 # print(res1.__next__()) 10 # print(res1.__next__()) 11 # print(res1.__next__()) 12 """ 13 迭代器对象 生成器对象 我们都可以看成是"工厂" 14 只有当我们所要数据的时候工厂才会加工出"数据" 15 上述方式就是为了节省空间 16 """
九.常见内置函数
1 # 1.abs() 绝对值 2 # print(abs(123)) 3 # print(abs(-123)) 4 # 2.all() any() 5 # l = [11,22,33,0] 6 # print(all(l)) # 所有的元素都为True结果才是True 7 # print(any(l)) # 所有的元素只要有一个为True结果就为True 8 # 3.bin() oct() hex() 进制数 9 # print(bin(123)) 10 # print(oct(123)) 11 # print(hex(123)) 12 # 4.bytes() str() 13 # res = '金牌班 最牛逼' 14 # res1 = bytes(res,'utf8') 15 # print(res1) 16 # res2 = str(res1,'utf8') 17 # print(res2) 18 # res1 = res.encode('utf8') 19 # print(res1) 20 # res2 = res1.decode('utf8') 21 # print(res2) 22 # 5.callable() 是否可调用(能不能加括号运行) 23 # s1 = 'jason' 24 # def index(): 25 # pass 26 # print(callable(s1),callable(index)) # False True 27 # 6.chr() ord() 28 # print(chr(65)) # 根据ASCII码转数字找字符 29 # print(ord('A')) # 65 30 # 7.complex() 复数 31 # print(complex(123)) # (123+0j) 32 # 8.dir() 查看当前对象可以调用的名字 33 # def index(): 34 # pass 35 # print(dir(index)) 36 # print(index.__name__) 37 # 9.divmod() 38 # print(divmod(101,10)) 39 """总数据100 每页10条 10页""" 40 """总数据99 每页10条 10页""" 41 """总数据101 每页10条 11页""" 42 # num,more = divmod(233,10) 43 # if more: 44 # num += 1 45 # print('总共需要%s页'%num) 46 # 10.eval()只能识别简单的语法 exec()可以识别复杂语法 都是将字符串中的数据内容加载并执行 47 # res = """ 48 # 你好啊 49 # for i in range(10): 50 # print(i) 51 # """ 52 # res = """ 53 # print('hello world') 54 # """ 55 # eval(res) 56 # exec(res) 57 # 11.isinstance() 判断是否属于某个数据类型 58 # print(isinstance(123,float)) # False 59 # print(isinstance(123,int)) # True 60 # 12.pow() 61 # print(pow(4,3)) 62 # 13.round() 63 # print(round(4.8)) 64 # print(round(4.6)) 65 # print(round(8.5)) 66 # 14.sum() 67 # l = [11,22,333,44,55,66] 68 # print(sum(l))