python学习笔记十四 迭代器

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)

猜你喜欢

转载自www.cnblogs.com/srialy/p/9272633.html