生成器

内容概要

  • 异常捕获补充
  • for循环本质和迭代器总结
  • 生成器
  • 基于生成器实现range方法
  • 生成器表达式
  • 生成器笔试题
  • 关键字yield补充用法
  • 常见内置函数

异常捕获补充

try:
    name
except NameError as e:
    print('名字类型错误')
else:
    print('嘿嘿嘿')
finally:
    print('啦啦啦')

image

image

断言
q = 'index'
assert isinstance(q, str)

主动报异常
raise 错误类型

for循环本质

q = [11, 22, 33]
res = iter(q)  # StopIteration 停止迭代
while True:
    try:
        print(next(res))
    except StopIteration as e:
        break

image

迭代取值与索引取值对比

迭代取值
优点:不依赖索引的一种通用方式
缺点:取值的顺序永远是从左往右,无法重复取值

索引取值
优点:可以重复取值
缺点:需要提供有序容器类型才可以取值(不是一种通用的方式)

生成器对象

生成器其实就是自定义迭代器

def rain():
    print('index')
    yield 111
    print('brand')
    yield 222

   rain()

image

   当函数体内含有关键字yield,在第一次调用函数的时候并不会执行函数体代码,而是将函数变成了生成器

res = rain()
res1 = next(res)  # 每执行一个__next__代码往下运行到yield停止,返回后面的数据
print(res1)
res1 = next(res)  # 再次执行__next__代码接着上次停止的地方接着往下,遇到yield停止
print(res1)

image

自定义range功能

def it_range(start, stop=None, step=1):
    if not stop:
        stop = start
        start = 0
    while start < stop:
        yield start
        start += step


for i in it_range(1, 10, 2):
   print(i)

image

yield传值

def rain(name):
    print('%s雨中' % name)
    while True:
        run = yield
        print('%s正在雨中%s' % (name, run))


res = rain('sss')
next(res)
res.send('漫步')
res.send('狂奔')

image

yield与return对比

yield
1.可以返回值(支持多个并且组织成元组)
2.函数体代码遇到yield不会结束而是停住
3.yield可以将函数变成生成器,还支持外界传值

return
1.可以返回值(支持多个并且组织成元组)
2.函数体代码遇到return直接结束

生成器表达式

res = [11, 22, 33]
res1 = (i + 1 for i in res)
print(next(res1))
print(next(res1))
print(next(res1)
生成器表达式内部的代码只有在迭代取值的时候才会执行

迭代器对象,生成器对象,我们可以看成是工厂。只有当我们所要数据的时候工厂才会加工出数据,上述方式就是为了节省空间

生成器笔试题

def rain(s, a):
    return s + a


def brand():
    for i in range(4):
        yield i


g = brand()
for s in [1, 10]:
    g = (rain(s, i) for i in g)
res = list(g)
print(res)

image

常见内置函数

1.abs()  # 绝对值
2.all()  # 所有的元素都是True结果才是True
3.any()  # 所有元素只要有一个是True结果就是True
4.bin()  # 进制数
5.oct()  # 进制数
6.hex()  # 进制数
7.bytes()  # 转码
8.str()  # 转码
9.callable()  # 判断函数是否可调用(能不能加括号)
10.chr()  # 根据ASCII码数字找字符
11.ord()  # 根据数字找ASCII码
12.complex()  # 复数
13.dir()  # 查看当前对象可以调用的名字
14.divmod()  # 传入一个被除数和除数,返回一个由商和余数组成的元组
15.eval()  # 识别简单的语法
16.exec()  # 识别复杂语法
17.isinstance()  # 判断是否属于某个数据类型
18.pow()  # 次方
19.round()  # 四舍五入
20.sum()  # 求和

image

posted @ 2021-11-22 20:02  一览如画  阅读(39)  评论(0)    收藏  举报