1.生成器

迭代器有两种:一种是调用方法直接返回的,一种是可迭代对象通过执行iter方法得到的,迭代器的好处是可以节省内存。

生成器:就是自己用python代码写的迭代器,生成器的本质就是迭代器。

迭代器的构建:1.通过生成器函数 2.生成器表达式。

#生成器函数:常规函数定义,但是,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行

def func1(x):
    x +=1
    print(x)
    yield x
    x +=2
    print(x)
    yield x
m = func1(5)
print(m.__next__())
print(m.__next__())

yield和return

yield:不会结束函数,一个next对应一个yield,给生成器对象.__next__()返回值。

return:结束函数,给函数的执行者返回一个值。

#生成器表达式

类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表

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

2.生成器与迭代器的区别

区别1:自定制的区别

区别2:内存级别的区别

迭代器是需要可迭代对象进行转化。可迭代对象非常占内存。

生成器直接创建,不需要转化,从本质就节省内存。

3.send 与 next

def func1():
    # print(1)
    count = yield 6
    print(count)
    # print(2)
    count1 = yield 7
    print(count1)
    # print(3)
    yield 8
g = func1()
print(next(g))
g.send('alex')
g.send('太白')

send与next一样,也是对生成器取值(执行一个yield)的方法。

send可以给上一个yield传值。

第一次取值永远是next。

最后一个yield永远也得不到send传的值。

4.列表推导式

一行代码几乎搞定你需要的任何列表。

循环模式

l = [i for i in range(1,10)]
print(l)

筛选模式

m = [i for i in range(1,30) if i%3==0]
print(m)

列表推导式优缺点:

优点:一行解决,方便。

缺点:容易着迷,不宜排错,不能超过三次循环。

列表推导式不能解决所有列表的问题,所以不要太可以用。

 

posted on 2018-08-20 16:19  海贼王&路飞  阅读(125)  评论(0编辑  收藏  举报