首页 > 代码库 > 人生苦短之Python迭代器

人生苦短之Python迭代器

     迭代

     在Python中,如果给定一个list或者touple,我们可以通过for循环来遍历,将值依次取出,这种遍历称为迭代。

      在Python中是通过for...in..来进行遍历的,在Java中则是通过下标来遍历 for(int i;i<length;i++){},Python作为解释性语言,在语法上是十分简单的,可以遍历数组集合,也可以遍历字典。看下面的例子:

for name in names:
    print(name)

person = {‘name‘: ‘张三‘, ‘age‘: 14, ‘sex‘: ‘男‘}

for key in person:
    print(key)
for value in person.values():
    print(value)
for item in person.items():
    print(item)

for i, value in enumerate(names):
    print(i, value)

      遍历一个list或者touple使用for..in..,也可以直接遍历字典的key或者value或者字典里地item,同样地如果我们需要跟其他语言中的那样的下标的话,我们可以使用for i,xx in .. 来获取下标,由此呢,我们也可以进行引用多个变量来进行迭代,例如将key和value值全部分别遍历,可以使用for key, value in dic.item 来进行遍历,使用起来是非常灵活地。

     迭代器

     list,dict,str等数据类型都可直接使用for循环遍历,这些被称为可迭代对象:Iterable,而生成器不但可以使用for循环遍历,还可以调用next()函数不断的调用返回下一个值,直到最后抛出StopIteration错误无法返回下一个值,这种可以被next()函数不断调用返回下一个值的对象称为迭代器:Iterator。

      生成器都是iterator对象,但是list,dict,str等数据类型却不是迭代器,因为迭代器都是可以被next()函数调用不断地返回下一个值,它的大小是未知的,它需要生成了下一个值才会计算。我们可以使用iter()函数将这些可迭代对象变成迭代器。

     上面提到了生成器,生成器是什么呢?

     我们先来看下列表生成式。我们生成一个列表,可以这样做:

     生成一个1-9的平方值的列表

     L=[]

     for x in range(1,10):

           L.append(x*x)

     如果用列表生成式可以是这样:L=[x*x for x in range(1,10)],同时我们还可以加一些判断,比如我只想要偶数的平方值,可以在后面加个if判断。了解了列表生成式,我们在看下生成器。

     最简单地创建生成器的方式,L=(x*x for x in range(1,10)),将[]换成(),那么完成后的区别在哪里呢?

     如果是列表生成式,我执行了一个列表生成式,它会根据生成式的条件立即生成一个列表,然后我可以对这个列表进行遍历(迭代),这也就是上面说的list是可迭代对象;

     如果它是个生成器,我运行了后它不会立即生成一个我想要的列表,它比较懒,它会在我需要的时候跟我生成一个我想要的值,什么时候是我需要的呢,就是调用next()函数的时候,通过next()函数获得生成器的下一个返回值,直到最后一个元素,没有值了抛出StopIteration错误。它里面保存的不是计算好的值,而是计算的算法,每次需要的时候给计算出来。

     可以作用于for循环遍历的对象都是可迭代对象

     可以作用于next()函数的对象都是迭代器对象

 

     我也学的有点蒙圈,暂时先这样理解,在今后用的地方多了加深对这方面的理解。

人生苦短之Python迭代器