码迷,mamicode.com
首页 > 其他好文 > 详细

迭代器和生成器 学习

时间:2018-12-11 19:54:26      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:使用   0x03   赋值   算法   其他   print   基本   for   gen   

 

##列表生成式  能灵活的生成所需列表
temp_list=[i*2 for  i in range(1,11)]
#print(temp_list)

##上面的列表生成式,就是使代码更简洁
a=[]
for i in range(1,11):
    a.append(i)
#print(a)

###迭代器&生成器
‘‘‘
通过列表生成式,创建一个列表时,当数据量较大时,不仅占用很多的存储空间,如果我们仅需要访问几个元素,那其他空间就白白浪费了。
如果可以按指定算法推算出要访问的元素,即使用时,才开辟空间,这种一边循环一边计算的机制,称为‘生成器’ generator
‘‘‘
#1、用列表作为生成器
temp_list=[i*2 for  i in range(1,11)]
#print(temp_list)                        #已经准备好了每个元素 [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
temp_gen=(i*2 for  i in range(1,11))
#print(temp_gen)
#  运行结果<generator object <genexpr> at 0x03593570>,没有准备每个元素,需要通过_next_()
#所以生成器不能像list一样,使用切片的方式访问
for i in temp_gen:
    #print(i)
    pass
#在创建一个生成器后,基本上不会调用_next_()访问,而是通过for循环来迭代它,且不关心stopIteration的错误。
# 2、用函数来指定生成器的规则
# 我写的斐波拉契数列:除第一个和第二个数外,任意一个数都可由前两个数相加得到
i=1
bef=0
fibo=[]
while i<20:
    if len(fibo)<2:
        fibo.append(i)
        bef = i
    else:
        bef=fibo[-2]+bef
        fibo.append(bef)
    i=i+1
#print(fibo)
#大神写的 [1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765]
def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        print(b)
        a, b = b, a + b
        n = n + 1
    return done
#print(fib(20))

‘‘‘ 这里赋值之前,先计算右边的值,所以赋值前a=1,b=2 ,计算完后a,b=(2,1+2) 所以a=2 b=3
>>> a,b=1,2
>>> t=(b,a+b)
>>> t[0]
2
>>> t[1]
3
>>> a,b=(b,a+b)
>>> a
2
>>> b
3
‘‘‘
#要想该函数作为生成器,将print(b) 修改为yield b
def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield b
        a, b = b, a + b
        n = n + 1
    return done
print(fib(20)) #运行结果<generator object fib at 0x00AF37B0>
#函数加yield后,不再是函数了,是生成器了,return的值,在捕获异常时使用,如下:

 

迭代器和生成器 学习

标签:使用   0x03   赋值   算法   其他   print   基本   for   gen   

原文地址:https://www.cnblogs.com/ww-xiaowei/p/10104019.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!