一 迭代器
集合的目的:去重,关系运算。
# 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=‘‘) #