迭代
在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()函数的对象都是迭代器对象
我也学的有点蒙圈,暂时先这样理解,在今后用的地方多了加深对这方面的理解。