#!/usr/bin/python
# -*- coding: utf-8 -*-
# 自己手动实现一个range和xrange
# print range(10) #[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# print xrange(10) #xrange(10)
def range(start, end, step=1):
num = []
while start < end:
num.append(start)
start += step
return num
# 每次代码运行到 yield,该函数都会发射出一个值,然
# 后当外部代码需求另一个值时,该函数才会继续运行(之前的状态保持不变)并发
# 射新的值,可以被重复的轮询是否有下一个可用值
# 当该函数运行结束时,一个 StopIteration 异常会被抛出表明该生
# 成器已经没有更多的值了
def xrange(start, end, step=1):
while start < end:
yield start
start += step
'''
#你可以试着打开任务管理器看一下内存的变化,使用range内存会飙升2个G
for i in xrange(0, 100000000):
pass
print 'over'
'''
# 探究for循环
# for循环后面的对象要求是可迭代的,如上的range函数反回了一个列表
# 我们就要为列表创建一个迭代器,每次调用迭代器的next()函数,知道抛出StopIteration 异常为止
for i in range(0, 10):
print i
object_iter = iter(range(0, 10))
while True:
try:
i = object_iter.next()
print i
except StopIteration:
break
# 但是生成器没有len的属性
# 如果我们只保留有限的状态用来发射当前值
# 那么生成器可以产生无穷的值,典型的是斐波那切数列
# 别随便运行,太吓人了!
def fibonacci():
i, j = 0, 1
while True:
yield i + j
i, j = j, i + j
python解释器在需要迭代对象的时候会先看一下这个对象有没有__iter__方法,如果有就调用它产生一个迭代器,如果没有再看对象有没有__getitem__,有这个方法也行,解释器会调用它自己创建一个迭代器,如果连这个也没有的话就只能返回TypeError了