码迷,mamicode.com
首页 > 其他好文 > 详细

重修课程day12(函数之迭代器和生成器)

时间:2017-09-04 17:50:36      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:end   txt   line   关键字   返回值   迭代   range   集合   生成器   

一  迭代器

 集合的目的:去重,关系运算。

# a={1,2,3,4,5,6,7}
# b={41,52,5,26,7,4,2,9,}
# print(a-b)

  isinstance:判断数据的类型,还可以判断是否可迭代。

  iterable:形容词  可迭代的:from collections import Iterable:用来检测一个对象是否可以迭代。

# from collections import Iterable
# print(isinstance(‘fadda‘,Iterable))

  dir:打印一种数据类型的方法 

print(dir(‘asdasf‘))

 什么叫做可迭代对象:操作的对象下面有__iter__()方法的就是可迭代对象。

技术分享

 什么叫做迭代器:操作的对象下面不光有__iter__()方法的,还有__next__()方法的就是迭代器,迭代器是不用关心值得索引状态的

技术分享

  iterator:迭代器:实现了能从其中一个一个的 取值出来。

lst_iterator=[1,2,3,4,5].__iter__()
print(lst_iterator.__next__())

 一切可以用for循环的基本数据类型都是可迭代对象,而不是迭代器。for循环的可以是一个可迭代对象,也可以是一个迭代器。而for循环自动为可迭代对象调用__iter__()方法。

for i in [1,2,3,4,5,6]:
    print(i)

  文件本质就是一个迭代器。range()就是一个可迭代对象,可迭代对象有:字符串,列表,元组等等。

__iter__():将一个可迭代对象转化成一个迭代器

__next__():读取迭代器的内容,一次只能读取一行或者一个内容

# with open(‘a.txt‘,encoding=‘utf-8‘)as f:
#     print(f.__next__())
#     print(f.__next__())
#     print(f.__next__())
#     print(f.__next__())
#     print(f.__next__())
# 
# b=[41,52,5,26,7,4,2,9,]
# bb=b.__iter__()
# print(bb.__next__())
# print(bb.__next__())
# print(bb.__next__())
# print(bb.__next__())
# print(bb.__next__())

 迭代器取到没有值的时候就会报错。报的是StopIteration。

技术分享

 迭代器的好处:1 能够对python中的基本数据类型进行统一的遍历,不需要关系每一个值是什么。

        2 惰性预算:可以节省内存。

# for i in range(1,1000):
#     print(i)
#     if i == 100:
#         break

迭代器的创建:1 天生就是一个迭代器,比如说:文件句柄

       2 后天转换成迭代器:迭代器=可迭代对象.__iter__()

二 生成器

 什么是生成器(Gerator):生成器本质就是一个迭代器,生成器就是自己写出来的迭代器。

 什么是生成器函数:函数里有yiled的关键字就是一个生成器函数。

# def iter_1():
#     print(111)
#     yield 222
#     print(333)
#     yield 444
# 
# iter_2=iter_1()
# print(iter_2.__next__())
# print(iter_2.__next__())

  yiled:意思和return差不多,但是yiled可以定位当前取值的位置,就是在next取值过后,就定位到取到的那个值的位置,等再次使用next取值的时候,就从第一次取值过后定位的那个位置开始取值,一个next对应一个yiled。

   from:yiled下的一个方法,可以简化生成器函数。用了from,就可以不用for循环。

# def foo():
#     for i in [1,2,3,4,5,6,7]:
#         yield i
# for i in foo():
#     print(i)

# def foo():
#     yield from [1,2,3,4,5,6,7]
# for i in foo():
#     print(i)

 生成器函数在调用的时候返回来的就是一个生成器,不会执行生成器函数里面的内容。

# def iter_1():
#     print(111)
#     yield 222
#     print(333)
#     yield 444
# 
# iter_2=iter_1()
# print(iter_2)

 而生成器和迭代器运行的顺序是只能往前取值,而不能够回头。

  生成器的用法:1 有几个next,就取几个yiled的返回值,不能超过yiled的范围。

         2 直接for循环取值:for 变量名 in 生成器名。

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

for i in range(1,10):
    print(i)
print(list(range(10,20)))

  注意:1 生成器函数取值必须先转换成生成器,在进行next取值。

     2 生成器的内容只能取一次,不能重复,只能向前取值;不能后退,直到取完为止。

三 文件补充小知识

文件下seek()传的值:0:光标的相对位置;1:当前光标的位置;2:将光标一道最后一个一个位置。

# def aa(bb,dd):
#     with open(bb,‘w‘,encoding=‘utf-8‘)as f :
#         f.write(dd)
# aa(‘a.txt‘,‘afdfd\nfadsa‘)
# def tail(cc):
#     f=open(cc,encoding=‘utf-8‘)
#     f.seek(0,2)
#     while True:
#         line=f.readline()
#         if not line:
#             continue
#         yield line
# tail_g=tail(‘a.txt‘)
# for line in tail_g:
#     print(line,end=‘‘)
#

重修课程day12(函数之迭代器和生成器)

标签:end   txt   line   关键字   返回值   迭代   range   集合   生成器   

原文地址:http://www.cnblogs.com/fangjie0410/p/7474409.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!