Python基础(十三): 生成器

2018-03-04  本文已影响10人  伯wen

一、生成器

二、创建方式

result = (i for i in range(100) if i % 2 == 0)
print(result)

# 打印结果: 
<generator object <genexpr> at 0x101fcdeb8>
def test():

    yield 1
    
    yield 2
    
    yield 3

g = test()

print(next(g))
print(next(g))
print(next(g))

# 打印结果: 
1
2
3

三、产生数据的方式

def test():
    print("a")
    yield 1

    print("b")
    yield 2

    print("c")
    
g = test()
result = next(g)
print(result)
# 打印:  
a
1
result = next(g)
print(result)
# 打印:  
b
2
next(g)
# 报错:  StopIteration
for i in g:
    print(i)
# 打印: 
a
1
b
2
c

生成器表达式创建的生成器, 可以用生成器函数写出:

def test():
   for i in range(100):
       if i % 2 == 0:
           yield i
g = test()
for i in g:
   print(i)
# 打印结果: 0-99之间的所有偶数

四、send()方法

def test():
    result = yield 1
    print(result)
    
    result = yield 2
    print(result)
    
    result = yield 3
    print(result)

g = test()
result = g._next_()
print(result)
打印: 1
result = g._next_()
print(result)
# 打印:
None
2

我们可以通过send()函数, 给上一次执行完的yield指定一个返回值

result = g.send("XXOO")
print(result)
# 打印:
XXOO
3
send()函数的注意事项
g = (i for i in range(10))
g.send("XXOO")
# 报错: TypeError: can't send non-None value to a just-started generator
# 即: 不能给send函数指定一个非None的参数
g = (i for i in range(10))
g.send(None)

五、关闭生成器

def test():
    print("a")
    yield 1

    print("b")
    yield 2

    print("b")
    yield 3

g = test()

g.__next__()
g.close()
g.__next__()

# 报错: StopIteration

六、注意事项

def test():
    print("a")
    yield 1

    return
    
    print("b")
    yield 2

g = test()

g.__next__()
g.close()
g.__next__()

# 报错: StopIteration
上一篇 下一篇

猜你喜欢

热点阅读