Python3基础笔记--生成器

目录:                                                  

一、列表生成器

二、生成器

三、迭代器

 

 

 

一、列表生成器

a = [x for x in range(10)]

b= [y*2 for y in range(10)]

def f(n)
    return n*n*n

c = [f(z) for z in range(10)]

 列表生成器会将所有的内容加载到内存中,在生成大量的数据时,会占用内存

生成器只会生成一个  generator object   ,占用很少内存,只会在调用时才产生值。且只能按顺序取值

 

二、生成器

1、基础代码

b = (x for x in range(10))
print(b)

print(next(b))    # 等价于 b.__next__()   等价于python2中的b.next()
print(b.__next__())

for i in b:
    print(i)


'''output
<generator object <genexpr> at 0x000002900B1BB308>
0
1
2
3
4
5
6
7
8
9
'''

 2、两种生成方式

①   (x for x in range(10))

②  yield方式

第②种代码

def foo():
    print("ok")
    yield 1
    
    print("fine")
    yield

g = foo()
print(g)

# next(g)
# aa = next(g)
# print(aa)

for i in g:
    print(i)

遇到函数中有  yield   则该函数为生成器

一个yield是一个生成器的生成物的结点,它会返回yield 后面的内容,然后结束,直到下一个next的调用 

 3、send()方法

def bar():
    c = yield 0
    print(c)
    print("ok1")
    count = yield 1

    print(count)
    print("ok2")
    yield 2

g = bar()
print(g)

# print(next(g))
print(g.send('ccc'))   # TypeError: can't send non-None value to a just-started generator

print(g.send("qqqq"))

send()方法与next()方法类似,但可以向生成器中传值,用于一些交互场景,但在第一个send()前如果没有next(),只能传一个send(None),否则会出现  TypeError: can't send non-None value to a just-started generator

 

三、迭代器

参考博客:Python之路,Day4 - Python基础4 (new版)

      Py西游攻关之迭代器&生成器

什么是迭代器?

满足两个条件:①有iter方法  ②有next方法

 

区别迭代器与可迭代对象

from collections import Iterator,Iterable

l = [1, 2, 3]

print(isinstance(l,list))
print(isinstance(l,Iterator))   # False   不是迭代器
print(isinstance(l,Iterable))   # True    是可迭代对象

for i in l:
    print(i)

 

posted @ 2018-02-26 10:45  潘_磊  阅读(132)  评论(0编辑  收藏  举报