1. 可以直接用于for循环的数据类型有:
- list, tuple, dict, set,str
list_1 = [1,2,3,4] tuple_1 = (1,2,3,4) set_1 ={1,2,3,4} dict_1 ={"name":"claire","age":"30"} for i in list_1: print (i,end="") print('\n') for i in tuple_1: print (i,end="") print('\n') for i in set_1: print (i,end="") print('\n') for i in dict_1: print (i,end="") print('\n')
- generator(生成器),包括生成器以及带yield的generator funciton
>这些可以被for的对象,叫做迭代对象(iterable)。可以用instance来判断一个对象是否是Iterable对象。
>生成器都是iterable对象,但是list,set,tuple虽然是iterable的,但是不是iterator(迭代器),如果需要将list,dict等iterable对象变成iterator,可以使用iter函数
> 可以被next()函数不断调用并且返回下一个值,最后抛出错误表示无法返回下一个值,这样的对象叫做迭代器, (生成器对象是一种迭代器对象)
> Python的Iterator
对象表示的是一个数据流,Iterator对象可以被next()
函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration
错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()
函数实现按需计算下一个数据,所以Iterator
的计算是惰性的,只有在需要返回下一个数据时它才会计算。Iterator
甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。
from collections import Iterator print (isinstance((x for x in range(10)),Iterator)) # x for x in range(10)是一个迭代器
2. 如何创建一个生成器
- 我们可以直接创建一个列表,但是当这个列表很大很大的时候,内存就被占用。所以可以使用生成器,每次需要的时候再计算。
L = [x*x for x in range(10)] #创建一个列表 G = (x*x for x in range(10)) #创建一个生成器,将列表的[]该成() print (L,G) print (next(G)) #使用next调用generator里面的值 #用for循环来获取generator里面的值,因为genator也是可以被迭代的 for i in G: print (i)
- 通过在函数说定义yield关键字,那这个函数就不是普通的函数,而是一个generator.
generator和函数的执行流程不一样,函数是顺序执行,遇到return或者最后一行返回。而generator函数,在每次调用next()的时候执行,遇到yield返回,再次执行时从上次返回的yield语句处继续执行。
def g(): print ("step 1") yield 1 print ("step 2") yield 3 print ("step 3") yield 5 a = g() # 用next不断获取 print (next(a)) print (next(a)) print (next(a)) #用循环获取 for i in g(): print (i)