Python生成器常见问题及解决方案
在Python中,生成器和函数很像,都是在运行的过程中才会去确定各种变量的值,所以在很多情况下,会导致各种各样的问题。
defgenerator_test1(): #0...9generator x=(iforiinrange(10)) #5..9generator x_filter=filter(lambday:y>=5,x) #firstusethex L=list(x) print("L,x",L) #thenusex_filter l=list(x_filter) print("l,x_filter",l) if__name__=="__main__": generator_test1()
输出结果为:
L,x[0,1,2,3,4,5,6,7,8,9]
l,x_filter[]
上述代码中,x_filter是基于生成器x构建的生成器,但是由于x在x_filter使用之前先被用掉了,所以在使用x_filter的时候,才去获取x的值,而此时x已经用完了,最终导致x_filter转化成的列表是空的。
defgenerator_test2(): x=(iforiinrange(10)) foriinrange(10): x=(j+iforjinx) L=list(x) print("L,x",L) if__name__=="__main__": generator_test2()
输出结果:
L,x[90,91,92,93,94,95,96,97,98,99]
上述代码中,每次循环都基于原先的生成器构建一个新的生成器,由于并未使用,所以生成器x中的i并没有被赋值。在后面转化成列表的时候才去获取i的值,而此时由于i为9,所以所有的生成器x的i都为9,原始的x是0到9的生成器,接下来的10个生成器每个都在原始值上加9,导致每个值都增大了90。下面是此例的一个变体:
defgenerator_test3(): x=(iforiinrange(10)) foriinrange(10): x=(j+iforjinx) i=20 L=list(x) print("L,x",L) if__name__=="__main__": generator_test3()
输出结果:
L,x[200,201,202,203,204,205,206,207,208,209]
上述代码表明,可以临时改变i从而让生成器发生改变。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。