python开发学习笔记之三(文件处理与函数)
三元运算:
文件操作
文件操作主要有读、写、追加、混合几种模式,下面分别介绍每个模式的方法
对文件进行打开操作使用open方法:
file = open('<file_name>','<mode>','<encoding>')
<flie_name>为文件名,<mode>为操作模式,<encoding>为编码格式
读模式:
r:以读的模式打开文件,只能对文件进行读取操作,称为只读模式;在只读模式中必须声明读取时以文件本身的编码格式,否则不声明默认以utf-8格式读取,如果编码格式不同会导致文件读取乱码。
rb:以二进制读模式打开,在二进制读模式中不用声明编码格式,因为二进制读模式是直接把文件以某种编码形式的二进制形式读取出来,通常是不可读的,一般用于存储和网络传输的。
当不知道文件的编码格式时,可以使用chardet库来操作:
import chardet f = open('test.txt','rb') data = f.read() chardet.detect(data)
会返回一个比对结果,显示出最大概率的编码格式
写模式:
w:以写的模式打开(通常当做创建模式,文件存在时覆盖旧文件,不存在则创建),只能写入,称为只写模式,可不声明编码格式,默认以utf-8格式写入
wb:二进制写模式
追加模式:
a:类似写模式,不可读, 不存在则创建,存在则只追加内容
ab:二进制追加模式
混合模式:
r+(rb+)读写模式:先读后写,当读操作完成,文件指针在文件末尾,此时写入是在文件末尾写入 【可读;可写;可追加】
w+(wb+)写读模式:先写后读,写入后可以读之前写入的内容,几乎无应用场景
a+:可读,追加写
其他操作:
f.tell()返回当前文件指针字节位置
f.seek(<num>) 移动光标至某个字节
f.fileno() 返回文件句柄在内核中的索引值
f.flush() 强制刷新
f.seekable() 判断文件是否能进行seek操作
f.truncate() 从当前指针位置截断,如果输入值,则为从头到指定输入位置截断
f.readable() 判断是否可读
f.writable() 判断是否可写
f.read() 按字符读取
f.readline() 以行为单位读取
文件修改:
由于文件在硬盘中存储的机制原因,文件不能再中间插入内容。所以如果要在文件中间插入内容,需要把文件载入内存中再进行操作。但是如果文件较大,载入内存可能出现内存撑爆的问题,所以有两种方法进行操作:
1.全部载入内存再进行操作(占用内存)
2.创建新文件,遍历文件,逐行修改并写入新文件,最后覆盖源文件(占用硬盘)
函数
函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可
特性:
- 减少重复代码
- 使程序变的可扩展
- 使程序变得易维护
语法:
def sayhi(): # 定义函数 print('hello world!') sayhi() # 调用函数
参数:
函数中可以带参数,分为形式参数和实际参数:
形参:
变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量。
实参:
可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值。
形式参数中有默认参数,当默认参数不输入实际参数时,使用默认参数,否则使用输入的实际参数,这里牵扯到一个位置参数和关键字参数的问题:
位置参数在调用时,按照参数的顺序输入参数,关键字参数,可以不按照顺序输入参数,只需用关键字参数赋值语句就可以。这里的默认参数就是一个关键字参数。
需要注意一点是,不管是形参还是实参,位置参数必须在关键字参数之前,否则会出现错误。
非固定参数(*args,**kwargs):
当输入的参数个数不固定时,可以使用非固定参数*args,当传入多个位置参数时会自动打包成元组传给*args;*kwargs 会把多传入的关键字参数变成一个字典形式
需要注意的点是当*args后有位置参数时,*args会把之后的所有位置参数打包,这时后面的位置参数就没有值输入了。所以*args之后的位置参数必须以关键字参数的形式传入
函数的返回值:
返回值也就是函数的输出,返回值可以返回各种内容,但是返回值只能返回一个元素,当返回多个内容时,会把多个内容打包成一个元组 ;如果函数未指定返回值,默认返回None。
函数在执行过程中只要遇到return语句,就会停止执行并返回结果,so 也可以理解为 return 语句代表着函数的结束。
局部变量与全局变量:
嵌套函数:
def func1():
print('in func1') def func2(): print('in func2') func2() func1()
作用域:
当代码定义完成后,作用域已经生成,作用域链会向上查找
匿名函数:
lambda 函数只能进行简单的逻辑运算,最多只支持三元运算
lambda一般与其他方法搭配使用:
res = map(lambda x:x**2,[1,5,7,4,8]) for i in res: print(i)
作用:节省代码量、使代码更加高级
高阶函数:
变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。
def add(x,y,f): return f(x) + f(y) res = add(3,-6,abs) print(res)
满足以下一个条件即为高阶函数:
接受一个或多个函数作为输入;return返回一个函数
递归函数:
在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。
递归特性:
1. 必须有一个明确的结束条件
2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少
3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)
尾递归:python中没有优化,C语言中有优化
内置方法:
部分方法介绍:
all() 所有元素为True返回True,否则返回False;any() 任意一个元素为True返回True,全为False才返回False
max() 、min() 返回最大、最小值
dir() 返回所有变量名
divmod() 返回商和余数
sorted() 自定义规则排序
eval() 字符串去引号,转为可执行代码,但是只能处理单行代码(可以拿到返回值)
exec() 同上,但可处理多行代码(拿不到返回值)
ord() 返回输入的字符在ASCII内的位置号 chr() 返回输入的位置号在ASCII的字符
bytearray() 以byte形式修改字符串
map() 以某种func处理后面的列表内容
filter() 与上面用法类似,用来过滤内容
pow() 求次方
print() sep分隔符默认为空格,end结尾默认为\n;可以把内容直接打印到文件中
callable() 判断是否可调用
frozenset() 不可变集合
var() 返回所有变量
locals() 返回局部变量
global() 返回全局变量
zip() 对应两个列表
round() 保留几位小数