day14迭代器和生成器

迭代器Interator

字符串

列表

元组

字典

集合

文件句柄、文件操作符

range

都是可迭代的

都可以使用for循环,所以说它们中的数据类型可以被一个一个取出。

 

iterable形容词 就是将某数据内的数据一个一个取出来 就是可迭代。

from collections import Iterable #检测一个对象是否可迭代

print(isinstance("aaa",Iterable))    

print(isinstance(123,Iterable))

print(isinstance([1,2,3],Iterable))

 

# True

# False

#True

 

iterable  adj.可迭代的

只要包含“双下iter"方法的数据类型就是可迭的 ---------可迭代协议。

#.__iter__()

 

iterrator n.迭代器

就是能实现一个一个能中取值出来。

迭代器中有__iter__和__next__方法 --------迭代协议。

 

lis_iterator = [1,2,3].__iter__()  

验证一下:

form collections import Iterator

print(isinstance(lis_iterator,Iterator))

print(isinstance([1,2,3],Iterator)) 

结果:

True

False 

结论:#列表+ __iter__就变成了迭代器 ,而列表只是可迭代的。

# 在python中学过的所有的可以被for循环的 基本数据类型 都是可迭代的 而不是迭代器。

 

迭代器与可迭代对象之间的关系:

迭代器 = 可迭代对象 .__iter__()

 

lst_iterator = [1,2,3].__iter__()

print(lst_iterator.__next__())

print(lst_iterator.__next__())

print(lst_iterator.__next__())

结果:

1

2

3

StopIteration    #如果要输出的内容超过了列表中的元素,那么就会出现一个StopIteration的这样一个提示。

因此我们可以利用while循环来完成输出,具体如下。

while True:

  try:

    print(lst_iterator.__next__())

  except StopIteration:

    break:

迭代器的本质是什么:   

 

1、能够对python中的基本数据类型进行统一的遍历,不需要关心每个值分别是什么。 (lis = [1,2,3,4,"abc","字符串"])

 

2、它可以节省内存---------惰性运算。

# f = open('file','w')  #文件句柄就是一个迭代器
# range(10000000).__iter__() #range就是一个可迭代的对象


迭代器总结:
1、天生的,比如文件句柄
2、后天的,可迭代对象.__iter__()


生成器Generator

 

生成器就是迭代器

生成器函数

生成器表达式

def generation_func():
    print("111")
    yield "aaa"
    print("222")
    yield"bbb"
g = generation_func()
ret = g.__next__()
print(ret)
ret2 = g.__next__()
print(ret2)
#输出
111
aaa
222

带yield关键字的函数就是生成器函数

生成器函数在执行的时候只返回一个生成器,不执行生成器函数的内容

从生成器中取值

  1、.__next__有几个yield就可以取几次

  2、for 循环取值 正常取 for i in g:

  3、其他数据类型进行强制转换 list(g) 返回一个列表,里面装着生成器里的所有内容。

  注意:在调用生成器函数的时候,要先调取生成器,在进行next取值。

        生成器中的内容只能取一次,且按顺序取值没有回头路,取完为止。

def generator():
    yield
    yield 2
g = generator
for i in g:
    print(i)
print(list(g))

  结果:

None               yield后面为空时 

2

[]                     因为生成器只能取一次 ,后面才取出空列表。

 

def clothing():
    for i in range(1,200000):
    yield “第%s件衣服”%i
g = clothing()
for j in range(50):   #循环次数
    print(g.__next__())

或者:

  

def clothing():
    for i in range(1,200000):
    yield “第%s件衣服”%i
g = clothing()
for j in g:    #循环返回值
   print(j) if j =="第50件衣服": break

  

新用法 之 yield from

def func():
    yield from [1,2,3]
    yield from "abc"
g = func()
for i in g:
    print(i)


#结果
1
2
3
a
b
c

  

 

posted @ 2017-09-04 19:15  hello沃德  阅读(142)  评论(1)    收藏  举报