day9:文件、拷贝、迭代器、生成器、函数封装、装饰器、闭包
#文件
f=open("E:\\a.txt","w")#在E盘下以只写的方式打开a.txt文件,绝对位置
f.write("北京我爱你")#将引号里的内容写入a.txt
f.close()#关闭a.txt
f=open("b.txt","w")#相对位置 f.write("234432") f.close()
f=open("E:\\a.txt","r")#"r"只读 content=f.read() print(content) f.close()
f=open("b.txt","r") content=f.read(3)#只读3个,括号里不填就是全读 print(content) f.close()
f=open("b.txt","r",encoding="utf-8") content=f.readline()#一次readline是输出一行 print(content) content=f.readline()#在此readline是输出下一行 print(content) content=f.readline(2)#括号里输入数字就是输出这行中的几个字符 print(content) f.close
f=open("b.txt","r",encoding="utf-8") content=f.readline() print(content) content=f.readlines()#readlines是以行为元素输出剩下的所有行中的字符 print(content,type(content)) f.close()
#read():括号里不填就是全读,填多少就输出前几个字符 #radeline():括号里不填就是全读一行,填多少就输出这行的前几个字符 #readlines():将剩下的所有行以列表的形式输出
f=open("E:\\a.txt","w+") f.write("北京")#不加\n则保存在同一行 f.write("南京\n") f.write("上海") f.close() f=open("E:\\a.txt","a+") f.write("123你好123") f.close() #"w"会覆盖原内容,“a”是在原内容后面追加内容,不会覆盖
# r只读,r+读写,不创建 # w新建只写,w+新建读写,二者都会将文件内容清零(新文件覆盖旧文件) # a:附加写方式打开,不可读;a+: 附加读写方式打开
f=open("b.txt","r") print(f.tell())#开始读之前游标指在0的位置 x=f.read(3) print(x) print(f.tell())#读3个数后游标指在3的位置 f.close
f=open("b.txt","r") x=f.read(4) print(x) f.seek(3,0)#第一个参数代表偏移的字符数。第二个参数代表从哪个地方偏移,0代表开头,1代表当前位置,2代表末尾 x=f.read(5) print(x) f.seek(0,1) x=f.read(2) print(x) f.close()
import os os.rename("b.txt","c.txt")#重命名 # os.rename("c.txt","b.txt") os.remove("b.txt") os.mkdir("abc",0x777)#r=4,w=2,x=1(执行),第一个7是自己,第二个是7是组,第三个是其他人 os.rmdir("abc")#删除 p=os.getcwd()#获取当前的工作目录(get current work directory) print(p) b=os.path.exists("E:\\a.txt")#判断文件或目录是否存在 print(b) b=os.path.exists("day2.py") print(b) os.makedirs("a//b//c") os.makedirs("d\\e\\f")
import copy a=3 b=3 c=3 d=c print(id(a),id(b),id(c),id(d)) print(id(a)==id(b)) print(id(a)==id(c)) print(id(c)==id(d))
a=[1,2,3] b=[1,2,3]#复杂的类型在声明时会获得一个新的空间。常量拥有固定的空间,是确定的一个区域 c=a print(id(a)) print(id(b)) print(id(a)==id(b)) print(id(c)) print(id(a)==id(c)) a.append(4) print(id(a)==id(c))#a和c指向同一个空间,所以a修改后c也被修改
a=3 b=a#此时b指向的是3的位置 a=4#a指向的位置变成4,但是b指向的位置还是3 print(b) print(id(a)==id(b))
import copy a=3 b=copy.copy(a) c=copy.deepcopy(a) print(id(a)==id(b)==id(c))
import copy a=[1,2,3] b=a c=copy.copy(a) d=copy.deepcopy(a) print(id(a)==id(b)) print(id(a)==id(c)) print(id(a)==id(d)) print(id(a)) print(id(b)) print(id(c)) print(id(d))
#copy给的是值,copy常量时地址不发生改变,copy复杂的数据类型时地址会发生变化
import copy a=[1,2,3,[4,5,6]] b=a c=copy.copy(a) d=copy.deepcopy(a) print(a,b,c,d) print(id(a),id(b),id(c),id(d)) a.append(7) print(a,b,c,d) print(id(a),id(b),id(c),id(d)) a[3].append(99) print(a,b,c,d) print(id(a),id(b),id(c),id(d)) print(id(a[3]),id(c[3]),id(d[3]))
# deepcopy是完全的拷贝,内层外层都拷贝,copy只拷贝外层,内层只拷贝一个地址
#迭代器 a=(1,2,3) b=iter(a)#iter:依次访问a里面的每一个元素 print(type(b))#iterator:迭代器 print(next(b)) print(next(b)) print(next(b))
# 生成器 def shengcheng(n): i=0 while i<n: yield i#yield:暂时停止函数的执行并交出i的值 i+=1 a=shengcheng(1000) print(next(a)) print(next(a)) print(next(a)) print(next(a))
#用生成器做斐波那契数列 def fbnq(n): a=0 b=1 i=0 while i<n: a,b=b,a+b yield a i+=1 a=fbnq(12) for x in a: print(x)
# 函数的封装 def a(b): b() def x(): print("12345") a(x)
#装饰器 import time def hanshu(f):#装饰器的函数,f接受被装饰的函数名 def neibu():#装饰内部函数 start=time.time() f()#调用被装饰的函数 end=time.time() print(end-start) return neibu#装饰器返回内部函数,(内部代表的是包装盒) @hanshu#@加函数名,代表下面的函数被这个函数装饰 def jisuan(): print("12345") jisuan()
def zs(fun): def neibu(cs): print("****************") fun(cs) print("****************") return neibu @zs def ych(name): print(name,"开演唱会") ych("刘德华")
def zs(fun): def neibu(cs): print("************") fun(cs) print("************") return neibu def zsq(fun): def neibu(cs): print("############") fun(cs) print("############") return neibu @zsq @zs def ych(name): print(name,"开演唱会") ych("刘德华")
#闭包:闭包的三大要素: def bb(b):#1.包含内部函数的函数 a=3 def neibu(c): d=a*b+c#3.内部函数使用了外部函数的变量 return d return neibu#2.返回内部函数的函数名 x=bb(4) print(x(5)) print(x(6)) #所以装饰器也形成闭包