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

生成器表达式

扫描二维码关注公众号,回复: 2883356 查看本文章

  将列表推导式的 []  换成()得到的就是生成器表达式

g = (i for i in range(100000))
print(g)
print(g.__next__())
print(g.__next__())
print(g.__next__())

猜你喜欢

转载自www.cnblogs.com/python13/p/9508520.html