一、文件操作
1.open()方法
例子:
open(test.txt, mode=‘r’, encoding=‘utf-8’)
完整语法为
open(file, mode=‘r’, buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
- file: 必需,文件路径(相对或者绝对路径)。
- mode: 可选,文件打开模式
- buffering: 设置缓冲
- encoding: 一般使用utf-8
- errors: 报错级别
- newline: 区分换行符
- closefd: 传入的file参数类型
- opener:
其中,mode参数有:
- r:以只读方式打开文件。
文件的指针将会放在文件的开头。这是默认模式。 - rb:以二进制格式打开一个文件用于只读。
文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。 - r+:打开一个文件用于读写。(非常常用,可用于修改文件)
文件指针将会放在文件的开头。 - rb+:以二进制格式打开一个文件用于读写。
文件指针将会放在文件的开头。一般用于非文本文件如图片等。 - w:打开一个文件只用于写入。
如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 - w+:打开一个文件用于写读。(没什么实际应用场景,常用的还是’r+'模式 )
如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 - a:打开一个文件用于追加。
如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
2.file 对象
file 对象使用 open 函数来创建,下表列出了 file 对象常用的函数
1 file.close()
关闭文件。关闭后文件不能再进行读写操作。
2 file.flush()
保存文件。刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。
3 file.fileno()
返回文件句柄。返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如os模块的read方法等一些底层操作上。
4 file.isatty()
如果文件连接到一个终端设备返回 True,否则返回 False。
5 file.next()
返回文件下一行。
6 file.read([size]) (指定的是字符大小)
读取文件。从文件读取指定的字符数,如果未给定或为负则读取所有。
7 file.readable()
判断是否可读。‘w’模式下也不可读
8 file.readline([size])
只读一行,遇到\r或\n为止。读取整行,包括 “\n” 字符。
9 file.readlines([sizeint])
读取所有行并返回列表,若给定sizeint>0,返回总和大约为sizeint字节的行, 实际读取值可能比 sizeint 较大, 因为需要填充缓冲区。
10 file.seek(offset[, whence])(指定的是字节大小)
移动光标。设置文件当前位置
11 file.tell()
返回至光标位置。返回文件当前位置。
12 file.truncate([size])
按指定长度截断文件。从文件的首行首字符开始截断,截断文件为 size 个字符,无 size 表示从当前位置截断;截断之后后面的所有字符被删除,其中 Widnows 系统下的换行代表2个字符大小。
13 file.write(str)
将字符串写入文件,返回的是写入的字符长度。
14 file.writable()
判断是否可写。
15 file.writelines(sequence)
向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。
二、函数
1.定义
def 函数名(参数列表):
函数体
return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
2.参数
以下是调用函数时可使用的正式参数类型:
- 必需参数 (调用时括号里按顺序填)
必需参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。 - 关键字参数 (调用时括号里用‘=’赋值)
使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。 - 默认参数(函数内部已经赋值,如果外部不赋值,则调用函数内部的值)
调用函数时,如果没有传递参数,则会使用默认参数。 - 不定长参数(*arg,放在最后)
你可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数
加了一个星号 * 的参数会以元组(tuple)的形式导入,存放所有未命名的变量参数。
加了两个星号 ** 的参数会以字典(dict)的形式导入。
3.匿名函数
-
lambda 只是一个表达式,函数体比 def 简单很多。
-
lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
-
lambda函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
-
虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。
a = lambda x:x+1 print (a(1))
4.变量作用域
Python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的。
变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称。Python的作用域一共有4种,分别是:
L (Local) 局部作用域
E (Enclosing) 闭包函数外的函数中
G (Global) 全局作用域
B (Built-in) 内置作用域(内置函数所在模块的范围)
以 L –> E –> G –>B 的规则查找
global 和 nonlocal关键字
当内部作用域想修改外部作用域的变量时,就要用到global和nonlocal关键字了。
如果要修改嵌套作用域(enclosing 作用域,外层非全局作用域)中的变量则需要 nonlocal 关键字
三、迭代器与生成器
迭代:理解为迭代一次就是循环一次
-
可以用于for循环的有:
一类是集合数据类型,list、tuple、dict、set、str
一类是generator,包括生成器和带yield的generator function
这些对象统称为可迭代对象:Iterable
可以用isinstance()判断一个对象是否为可迭代对象 -
而生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值
可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator -
可以通过iter() 函数将list、dict、str等可迭代对象转化为迭代器
-
python里的for循环本质上就是通过不断调用next()函数实现的
-
在python2里range = list
在python3里range = 生成器 -
yield VS return
return 返回并终止function
yield 返回数据,并冻结当前的执行过程
next 唤醒冻结的函数执行过程,继续执行,直到遇到下一个yield -
函数有了yield之后,函数名加()就变成了一个生成器,就不算一个函数了
-
send方法可以给yield传值
四、装饰器
def wapper(func):
def boy(x,y):
print (x-y)
func(x,y) #调用老foo
return boy
@wapper #foo=wapper(foo)
def foo(x,y):
print (x+y)
foo(2,1) #调用新foo