推导式,生成器,迭代器

推导式

列表推导式

不用推导式时,创建一个列表的操作:

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循环遍历的,都是可迭代对象;

迭代器:实现了迭代器协议的可迭代对象

生成器的作用:可以节约内存,提高性能

迭代器

原文地址:https://www.cnblogs.com/lzh501/p/11298659.html