生成器,迭代器,文件读写,文件复制
1.生成器就是能够被next()函数调用一次次输出的对象
2.生成器的两种形式
1)通过将列表推导式的[]改为(),来进行生成
#1)通过__next__()函数来每次输出 g = (x+1 for x in range(3)) print(g.__next__()) print(g.__next__()) print(g.__next__()) print(g.__next__())#当生成器中的元素运行完后,就会报StopIteration错误 #2)通过next(生成器对象)实现每次迭代 print(next(g)) print(next(g)) print(next(g)) print(next(g))#当生成器中的元素运行完后,就会报StopIteration错误
2)通过函数和yield关键字来生成生成器
yield关键字相当于return+暂停的功能
#斐波那契 def fib(lrength): n = 0 a,b = 0,1 while n <length: yield a a,b = b,a+b n +=1 g = fib(5) result = next(g) print(result)#结果为0 print(result)#结果为1 print(result)#结果为1 print(result)#结果为2 print(result)#结果为3
send()函数:向生成器中传值,第一次需要传递send(None)
def gen(): i = 0 while i < 5: temp = yield i #return i +暂停 print('temp:',temp) for x in range(temp) print('----->',x) i+=1 print('*****') return '没有更多元素' g = gen print(g.send(None)) print(g.send(3))#从循环那里开始,为什么呢,直接传到循环这里 print(g.send(5)) ''' 结果为0 temp:3 ----->0 ----->1 ----->2 1 ***** 1 temp:3 ----->0 ----->1 ----->2 ----->3 ----->4 2 ***** '''
3.生成器之多任务:主要用于后面多线程中的协程
def task_1(n): for i in range(n): print('我跑了{}千米!'.format(i)) yield def task_2(n): for i in range(n): print('我听了{}首歌!'.format(i)) yield g1 = taks_1(5) g2 = task_2(10) while true: try: g1.__next__() g2.__next__() except: break #结果为 '''我跑完了0千米! 我听了0首歌! 我听了1首歌! 我跑完了1千米! 我听了2首歌! 我听了3首歌! 我跑完了2千米! 我听了4首歌! 我听了5首歌! 我跑完了3千米! 我听了6首歌! 我听了7首歌! 我跑完了4千米! 我听了8首歌! 我听了9首歌! '''
4.迭代器:就是能够被next()函数一次次执行的可迭代对象
g = (x for x in range(3)) print(g.__next__()) print(g.__next__()) print(g.__next__()) #结果为0 1 2
1)可以通过iter()函数将可迭代函数转化为迭代器
list1 = [1,2,3] list1 = iter(list1) #iter()函数将list转换为迭代器 print(list1.__next__()) print(list1.__next__()) print(list1.__next__()) #结果为0 1 2
5.文件读写:open(file,mode,buffering,encoding)
1)读取文件:有read()函数,readline()函数(一行行地读取,并默认空行),readlines()函数(一次性读取,并默认空行)
stream = open('a.txt','r')#管道读取文件内容到管道中 g = stream.read() #一次性读取管道中所有的内容,后续再读取就会报错 print(g) g.close() 结果为我要好好学python!
2)写文件:write()函数,再次写入,会清空之前写的内容。writelines()函数,写多行,当mode = 'a'时,是追加,不会清空之前所写内容
stream = open('b.txt','w')#管道写文件内容到管道中 s1 = '学好python!' g1 = stream.write() #写文件到管道中 print(g1) g.close() 结果为学好python!
3)文件复制,为了简化close()函数,使用with open as stream格式更为方便
with open('a1.txt','rb') as rstream: rcontainer = rstream.read() with open('b1.txt','wb') as wstream: rwcontainer = wstream.write(rcontainer) print('文件复制文件!')