迭代器和生成器 学习
Posted ww-xiaowei
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了迭代器和生成器 学习相关的知识,希望对你有一定的参考价值。
##列表生成式 能灵活的生成所需列表 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的值,在捕获异常时使用,如下:
以上是关于迭代器和生成器 学习的主要内容,如果未能解决你的问题,请参考以下文章