python之路day12生成器,列表推导式及生成器表达式
生成器
生成器:就是自己python用代码写的迭代器,生成器的本质就是迭代器。
l1 = [1,2,3]
iter1 = iter(l1)
用以下两种方式构建一个生成器:
1.通过生成器函数。
2.生成器表达式。
生成器函数
一个包含yield关键字的函数就是一个生成器函数。yield可以为我们从函数中返回值,但是yield又不同于return,return的执行意味着程序的结束,调用生成器函数不会得到返回的具体的值,而是得到一个可迭代的对象。每一次next()这个可迭代对象的值,就能推动函数的执行,获取新的返回值,一个next对应一个yield,直到函数执行结束。
def genrator_func1(): a = 1 print(111) yield a b = 2 print(222) yield b g1 = genrator_func1() print(g1.__next__()) print(g1.__next__())
def func1(): print(1) count = yield 6 print(count) print(2) count1 = yield 7 print(count1) print(3) yield 8 g = func1() next(g) g.send('alex') #send 获取下一个值的效果和next基本一致 #只是在获取下一个值的时候,给上一yield的位置传递一个数据 #使用send的注意事项 1第一次使用生成器的时候 是用next获取值 2最后一个yield不能接受外部的值
迭代器与生成器的区别:
迭代器是需要可迭代对象进行转化。可迭代对象非常占内存。
生成器直接创建,不需要转化,从本质就节省内存。
列表推导式:一行代码几乎搞定你需要的任何的列表。
1.循环模式 [变量(加工后的变量) for 变量 in iterable]
l = [i for i in range(1,101)] print(l) l2 = ['python%s期' % i for i in range(1,11)] print(l2) print([i*i for i in range(1,11)])
2.筛选模式 [变量(加工后的变量) for 变量 in iterable if 条件]
l3 = [i for i in range(1,31) if i % 2 == 0] print(l3) print([i for i in range(1,31) if i % 3 == 0]) print([i**2 for i in range(1,31) if i % 3 == 0] names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']] print([j for i in names for j in i if j.count('e') == 2])
生成器表达式
将列表推导式的 [] 换成()得到的就是生成器表达式
g = (i for i in range(100000)) print(g) print(g.__next__()) print(g.__next__()) print(g.__next__())