文件操作,json与pickle序列化,函数编程
文件操作
- 文件操作模式:r,只读模式(默认);w,只写模式(不可读;不存在则创建;存在则删除内容);a,追加模式(可读,不存在则创建,存在则只追加内容。)r+,读写模式(可读;可写;可追加);w+,写读模式(先创建文件,写入文件开始读)
- 二进制读写模式:rb;wb;ab(二进制文件的读,写,追加模式)
- 在打开读取文件时,文件内有个指向读取位置的指针,会随之移动到已经读到的位置处
- 打开文件:
f = open("yesterday",'r',encoding="utf-8")
#r为指定模式为读取模式 - 创建文件:
f = open("yesterday",'w',encoding="utf-8")
#在写模式下open为创建新文件 - 文件追加:
f= open("yesterday",'a',encoding="utf-8")
#在追加模式打开文件 - 可读可写可追加模式:
f = open("yesterday",'r+',encoding="utf-8")
#打开文件读写 - 可读可写可追加模式:
f = open("yesterday",'w+',encoding="utf-8")
#创建文件写入读取 - 为防止忘了关闭文件,可使用with语句:
with open("yesterday",'r',encoding="utf-8") as f:
#所有操作指令都在with下执行,当执行结束跳出with则自动关闭文件 - 文件读取
data = f.read()
#在只写和追加模式下可用,read可填写读取的字符数 - 文件读取一行:
print(f.readlines())
#读取文件的一行内容 - 循环读取整个文件:
###这种方法将文件一次性读取成列表,放到内存中,不适合大文件
f = open("ZhenhuiZhang",'r', encoding="utf-8")
for line in f.readlines(): #一次性读取整个列表
print(line)
f.close()
###这种方法将文件一行一行的读取,适合大文件,占用内存小
f = open("ZhenhuiZhang",'r', encoding="utf-8")
for line in f:#一行一行读取,迭代器方法
print(line)
f.close()
- 文件写入:
f.write("write by zzh")
#在写模式活追加模式下才可用 - 文件关闭:
f.close()
#在文件操作完成后,务必记得关闭文件 - 读取文件指针位置:
print(f.tell())
#文件指针位置,位置根据字符个数计数 - 移动文件指针位置:
f.seek(0)
#移动到文件开头 - 文件编码格式:
print(f.encoding)
#获取文件的编码格式 - 将内存中的缓存写入硬盘文件
f.flush()
#强制刷新 - 文件截断
f.truncate(25)
#从文件指针位置往后截断到25个字符处
序列化与反序列化
json数据序列化
- 在编写程序过程中,当我想要对一个数据进行临时的存储,并且在未来的一个时刻将数据进行恢复,即将目标数据以文件形式进行存储,可使用json序列化
- json序列化也可用于不同语言之间的数据交互,将数据用A语言json序列化,再用B语言json反序列化。目前json已经取代xml成为主流的程序间交互数据的方式。
- json只能够处理简单的数据类型,而无法处理复杂的数据(如函数)
- json序列化:
import json
info = {"name": 'zzh' , "age": 23}
f = open("test.test", "w")
f.write(json.dumps(info))
f.close()
- json反序列化:
f =open("test.test","r")
info = json.loads(f.read())
print(info)
f.close()
pickle数据序列化
- 若要以文件存储复杂的内容,则可以采用pickle,其用法与json较为类似
- 但是pickle只能在python中可以使用
- pickle序列化:
import pickle
def sayhi(name):
print('hello',name)
info = {"name": 'zzh',"age": 23,"func":sayhi}
f = open("test.test", "wb")##注意这里是二进制的写
f.write(pickle.dumps(info))
f.close()
###或者也可以等效成下面###
f = open("test.test", "wb")##注意这里是二进制的写
pickle.dump(info,f)
f.close()
- pickle反序列化:
f =open("test.test","rb")##注意这里是二进制的读
info = pickle.loads(f.read())
print(info)
f.close()
###或者也可以等效成下面###
f =open("test.test","rb")##注意这里是二进制的读
info = pickle.load(f)
print(info)
f.close()
3.函数式编程
- 常见的编程方式有:面向对象(class),面向过程(def),函数式编程(def)
- 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可
- 形参与实参:形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量。实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值。
- 在函数内部若想修改全局变量,则需要声明
global zzh #zzh为全局变量名
,但是强烈不推荐使用 - 当全局变量与局部变量同名时:在定义局部变量的子程序内,局部变量起作用;在其它地方全局变量起作用。
- 函数的参数与返回值:
def calc(x,y):
res = x**y
return res #返回函数执行结果
c = calc(a,b) #结果赋值给c变量
print(c)
- 函数的默认参数:可以在定义函数时,给予默认参数;调用时若用户未指定则使用默认参数。如:
def calc(x=1,y=2):
- 非固定参数:若函数传入的参数数量不固定,可使用非固定参数。
*args方法:接收N个位置参数,将其转化为元组,如:def stu_info(name,age,*args):
# *args 会把多传入的参数变成一个元组形式。
**kwargs方法:接收N个关键字参数,将其转化为字典,如:
def stu_register(name,age,*args,**kwargs): # **kwargs 会把多传入的参数变成一个字典
print(name,age,args,kwargs)
stu_register("ZZH",23,"CN","Python",sex="Male",province="FuJian")
#输出 : ZZH 23 ('CN', 'Python') {'province': 'FuJian', 'sex': 'Male'}
- 参数放置顺序:位置参数, 关键字参数,默认值参数,参数组*args,参数组**kwargs
- 函数递归:如果一个函数在内部调用自身本身,这个函数就是递归函数。
- 递归特性:1. 必须有一个明确的结束条件;2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少;3. 递归效率不高,递归层次过多会导致栈溢出
- 匿名函数:
calc = lambda x:x*3
#lambda为匿名函数关键字 - 高阶函数:一个函数就可以接收一个函数作为参数,或者一个函数的返回结果是一个函数,则称这种函数就称之为高阶函数。
def add(a,b,func):
return func(a)+func(b)
res = add(3,-6,abs)
print(res)
#输出:9
参考:
https://www.cnblogs.com/alex3714/articles/5740985.html
http://www.cnblogs.com/alex3714/articles/5161349.html