计算机系学渣开始学习Python了,谨以此文记录自己水Python基础的过程
学习资料:廖雪峰的官方网站 https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000
2018.04.09
#generator生成器#
平时生成一些“列表性”的东西,我们常用list生成式,但是要是有一个包含100万个元素的列表,我们还能直接使用list吗?这样做占用了很大的存储空间,,那么要怎么做呢?如果列表元素可以按照某种算法表示出来,那么我们就可以在循环的过程中不断推算出后续的元素,而不必创建完整的list,从而节省大量空间。而在Python中,这种一边循环一边计算的机制,称为生成器:generator。
1、list与generator对比
list方法
>>> L = [x*x for x in range(10)]
>>> L
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
generator生成方法一 >>> g = (x * x for x in range(10)) >>> g <generator object <genexpr> at 0x000001C82CD1AFC0>
可以看出,list与generator的区别仅在于[ ]与()的使用。而generator生成的
<generator object <genexpr> at 0x000001C82CD1AFC0>
则是其为在【1,10】内的x*x生成的一个算法,此算法只能计算从1到10内的x^2的结果。
2、generator输出
generator是使用next()函数获得generator的下一个返回值:
如:
>>> next(g) 0 >>> next(g) 1 >>> next(g) 4
可是这样一直输入next()才能查看函数值???.....好吧,其实可以使用for循环的啦,就像这样
>>> for n in g: print(n) 9 16 25 36 49 64 81
3、应用....fib数列
list方法
>>> def fib(max): n,a,b =0, 0,1 while n<max: print(b) a,b=b,a+b n = n +1 return 'done' >>> fib(6) 1 1 2 3 5 8 'done'
在尝试的过程中,发现Python对于格式还是比较注意,比如,,一个不注意输入了下面这样的代码,就gg了....
def fib(max): n,a,b = 0,0,1 while n<max: print(b) a,b = b,a+b n = n+1 return 'done' >>> fib(6) 1 'done
return要与while对齐!对齐! 对齐!
generator生成方法二
1 >>> def fib(max): 2 n,a,b = 0,0,1 3 while n< max: 4 yield b 5 a,b = b,a+b # t = (b,a+b),t是一个tuple 6 n =n+1 7 return 'done' 8 9 >>> f= fib(6) 10 >>> f 11 <generator object fib at 0x000001C82CD1AF68>
将list中的print()方法改成yeild方法就可以将fib函数编变成generator了。
注意,将fib(6)改成fib(20)时,生成的generator算法也不同了<地址>
1 >>> f=fib(20) 2 >>> f 3 <generator object fib at 0x000001C82CD2C0A0>
之后依旧可以使用for循环打印出fib数列
4、小白对yeild的一点理解
yeild相当于一个中断函数,每次程序运行到yeild处时就会产生中断,再执行时,则从此中断处开始执行。
>>> def odd(): print('step 1') yield (1) print('step 2') yield(3) print('step 3') yield(5) >>> o = odd() >>> next(o) step 1 1
5、因为刚开始学习python,可能有些地方的理解并不是很到位,若有理解偏差,还希望各位指点一二
参考:https://blog.csdn.net/u012422446/article/details/56555885