Python笔记之 range 与 xrange

#!/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了

猜你喜欢

转载自blog.csdn.net/qq_38322240/article/details/82149194