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))

相关