生成器,迭代器,文件读写,文件复制

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('文件复制文件!')
posted @ 2021-07-26 21:41  求知律己  阅读(93)  评论(0编辑  收藏  举报