# =============================================================================
# 生成序列并输出
# =============================================================================
'''
如果一个类想被用于for ... in循环,类似list或tuple那样,就必须实现一个__iter__()方法,
该方法返回一个迭代对象,然后,Python的for循环就会不断调用该迭代对象的next()方法拿到循环的下一个值,
直到遇到StopIteration错误时退出循环。
'''
# 普通的
def fors(n):
for i in range(n):
print(i)
fors(5)
# 提高函数的可复用性 (通过返回 List)
def fors(n):
a=[]
for i in range(n):
a.append(i)
return a
for i in fors(5):
print(i)
# 如果要控制内存占用,最好不要用 List 返回
# 通过 iterable 对象来迭代
class fors(object):
def __init__(self,n):
self.a=-1
self.max=n
def __iter__(self):
return self
def __next__(self):
self.a=self.a+1
if self.a>=self.max:
raise StopIteration()
return self.a
for i in fors(5):
print(i)
#使用 yield 函数改写,代码更简洁
def fors(n):
for i in range(n):
yield i #外层调用fors时,每次执行到yield则返回其后的对象
for i in fors(5):
print(i)
# example
def fors(n):
a='a'
for i in range(n):
yield i,str(i)+' '+a+' ~'
a=a+chr(98+i)
for i in fors(5):
print(i)
# =============================================================================
# 多个yield
# =============================================================================
def fors(n):
a='a'
b=1
for i in range(n):
b=i
yield b
for i in range(n):
yield i,str(i)+' '+a+' ~'
a=a+chr(98+i)
for i in fors(3):
print(i)
# 搞事
def fors(n):
a='a'
b=1
for i in range(n):
b=i
yield b
for i in range(n):
yield i,str(i)+' '+a+' ~'
a=a+chr(98+i)
for i in fors(3):
print(i)
# (~.~)
def fors(n):
a='a'
b='~~~~~~~'
for i in range(n):
yield b
for i in range(n):
yield i,str(i)+' '+a+' ~'
a=a+chr(98+i)
b=b+chr(65+i)
for i in fors(3):
print(i)
参考:
https://www.ibm.com/developerworks/cn/opensource/os-cn-python-yield/