python迭代器


# 
# 迭代器
# 使用  [x * x for x in range(size)]  方式创建列表时,内存中一
# 下生成了指定大小的空间,若size很大,则会非常耗费内存空间,但如果使用
# 迭代器,每次需要时便获取一个,会节省空间,而且会延迟计算 x*x
generator=( x*x for x in range(5)  )
print generator

print generator.next()
print generator.next()
print generator.next()
print generator.next()
print generator.next()

print generator.next()
# 
# 打印如下
# <generator object <genexpr> at 0x102bd1b90>
# 0
# 1
# 4
# 9
# 16
# Traceback (most recent call last):
#   File "/Users/young/Documents/workspace_python/python1/src/main.py", line 17, in <module>
#     print generator.next()
# StopIteration

# 当第6次调用next时会报错,因为已经指定了是5

generator=( x*x for x in range(5)  )

# 当然也可以按如下方式遍历
for ele in generator:
    print ele
    
# 打印如下  
# 0
# 1
# 4
# 9
# 16   


  
# 迭代函数
# 如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator:

# generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行
def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield b
        a, b = b, a + b
        n = n + 1

gene=fib(8)

print gene.next()    
print gene.next() 
print gene.next() 
print gene.next()     
print gene.next() 
print gene.next() 
print gene.next() 
print gene.next()  
print gene.next()   

# 打印如下
# 1
# 2
# 3
# 5
# 8
# 13
# 21
# Traceback (most recent call last):
#   File "/Users/young/Documents/workspace_python/python1/src/main.py", line 25, in <module>
#     print gene.next()   
# StopIteration

# 再例如
def odd():
    print 'step 1'
    yield 1
    print 'step 2'
    yield 3
    print 'step 3'
    yield 5


ge=odd()

ge.next()
ge.next()
ge.next()
ge.next()

打印如下
step 1
step 2
step 3
Traceback (most recent call last):
  File "/Users/young/Documents/workspace_python/python1/src/main.py", line 18, in <module>
    ge.next()
StopIteration




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值