推导式,生成器,迭代器
推导式
列表推导式
不用推导式时,创建一个列表的操作:
list_a = []
for i in range(1,101):
list_a.append(i)
使用列表推导式:
list_b = [i for i in range(1,101)]
字典推导式
用字典推导式时,创建一个字典的操作:
a = "c='bi;p=153;s=0;id=d0;bd=123"
dict_a = {i.split("=")[0]:i.split("=")[1] for i in a.split(";")}
生成器
在上面的推导式表达式中,我们可以看到,列表推导式的表达式是[],字典推导式的表达式是{},那么当推导式的表达式是()时,会得到什么结果呢?
()--我们称为生成器表达式,通过()表达式得到的结果是一个生成器对象
如:
generator_a = (i for i in range(1,11))
generator_a就是一个生成器,我们可以通过list(generator_a)得到一个列表,通过tuple(generator_a)得到一个元组
如果我们想从生成器里面取出一个元素,可以使用内置函数:next(genertaor_a),每次从上一次取出的元素位置往后再取出一个元素,如果生成器里的元素被取完了,那么会报错:StopIteration:
除了()表达式来生成一个生成器外,还可以在函数中用一个关键字yield来得到一个生成器对象
如:
def func():
yield 100
print("hello world")
yield 1001
yield 100001
res = func()
上面函数如果没有yield这个关键字,那么res为None,因为函数没有return,
那么像上面的函数一样有yield这个关键字的时候,res就是一个生成器对象,如上面的函数,我们如果想要得到值1001,那么我们可以这样做:
1,先将生成器对象转化成列表或者元组:res_list = listlist(res)或者res_tuple = tuple(res),然后取下标值如:res_list[1]或者res_tuple[1]得到1001;
2,使用next(res)方法先得到100,再使用一次next(res),就能得到1001了;
方法2的原理是:生成器每执行一次next()方法都会在yield关键字那里停下,直到再调用一次next()方法后,它才会在上一次停下的位置重新运行,直到下一个yield关键字又停下,如果后面没有yield关键字了,还使用next()函数取值,那么就会报错:StopIteration;
迭代器和可迭代对象:
可迭代对象:可以通过for循环遍历的,都是可迭代对象;
迭代器:实现了迭代器协议的可迭代对象
生成器的作用:可以节约内存,提高性能
迭代器