64 lines
1.5 KiB
Python
64 lines
1.5 KiB
Python
# encoding: utf-8
|
||
"""
|
||
Topic: sample
|
||
Desc :
|
||
Python生成器:生成器是一个带有yield语句的函数。
|
||
一个生成器能暂停并返回一个中间结果,返回这个值给调用者并暂停执行。
|
||
当生产器的next()方法被调用时,它会准确的从离开的那个地方继续
|
||
"""
|
||
from random import randint
|
||
|
||
__author__ = 'Xiong Neng'
|
||
|
||
|
||
# 生成器函数定义
|
||
def simpleGen():
|
||
yield 1
|
||
yield '2--->punch'
|
||
|
||
|
||
def gendemo():
|
||
print(simpleGen().__next__())
|
||
print(simpleGen().__next__())
|
||
|
||
# 生成器对象的获取
|
||
a = simpleGen()
|
||
print(a.__next__())
|
||
print(a.__next__())
|
||
|
||
# Python的for循环有next()调用和对StopIteration的处理
|
||
# 天生就是使用生成器的好手段
|
||
for eachItem in simpleGen():
|
||
print(eachItem)
|
||
|
||
|
||
# 序列的随机迭代器 pop index out of range ??????
|
||
def randGen(alist):
|
||
while len(alist) > 0:
|
||
yield alist.pop(randint(0, len(alist)))
|
||
|
||
|
||
def counter(start_at=0):
|
||
print('new start...%d' % (start_at,))
|
||
count = start_at
|
||
while True:
|
||
val = (yield count)
|
||
print('count=%s, val=%s' % (count, val,))
|
||
if val is not None:
|
||
count = val
|
||
else:
|
||
count += 1
|
||
|
||
|
||
if __name__ == '__main__':
|
||
count = counter(5)
|
||
print(count.__next__())
|
||
print(count.__next__())
|
||
print(count.__next__())
|
||
print(count.send(99))
|
||
print(count.__next__())
|
||
count.close()
|
||
# print(count.next()) # ERROR
|
||
|
||
|