Knight_day12
- 生成器
生成器:自己用python代码写的迭代器,生成器本质就是迭代器。
构建一个生成器:
1.通过生成器函数
函数的return换成yield
2.生成器表达式
单独的 生成器名() 不执行,为生成器对象
执行:生成器名().__next__() 一个next对应一个yield,yield将值返回给生成器名().__next__()
yield vs return:
return结束函数,给函数执行者返回值
yield不会结束函数,一个next返回一个yield,给生成器对象.__next__()
生成器函数 vs 迭代器:
1.自定制区别
2.内存级别区别
对于迭代器:可迭代对象 ----> 迭代器 在可迭代对象创建时就已经占用了内存
对于生成器:直接创建,无需转化,从本质节省内存。
yield每次记住位置
# 全部打印 def cloth1(n): for i in range(1, n + 1): print(f'衣服{i}号') cloth1(10000) # 需要多少打印多少且保留位置 def cloth2(n): for i in range(1, n + 1): yield i c = cloth2(10000) for i in range(100): print(c.__next__()) for i in range(500): print(c.__next__())
send vs next:
send与next一样也是对生成器取值(执行一个yield)的方法。
send可以给上一个yield传值,且必须传值。
注意:1.第一次取值不能用send,永远是next。
2.最后一个yield永远得不到send传的值
- 列表推导式,生成器表达式
列表推导式:
一行代码几乎满足需要的任何列表
模式:
循环模式:
[变量(加工后变量) for 变量 in interable]
筛选模式:
循环模式后加 if 判断
优点:一行解决,方便
缺点:容易着迷,不易排错,不能超过三次循环,不能解决所有列表问题,不要刻意用
生成器表达式:
将列表推导式的 [] 换成 () 即可。用__next__()读。一般用于数据量大的情况。
字典表达式:
lst1 = ['k1', 'k2', 'k3'] lst2 = [1, 2, 3] dic = {lst1[i]: lst2[i] for i in range(len(lst2))} print(dic) ''' {'k1': 1, 'k2': 2, 'k3': 3} ''' dic = {'k1': 1, 'k2': 2, 'k3': 3} dic_inverse = {dic[i]: i for i in dic} print(dic_inverse) ''' {1: 'k1', 2: 'k2', 3: 'k3'} '''
集合推导式: 天然去重
lst1 = [1, -1, 4, 9, -9] s = {i**2 for i in lst1} print(s) ''' {16, 1, 81} '''

浙公网安备 33010602011771号