第三章 文件操作和函数
写在前面: 要干大事,先要有所准备,要学习文件,还是要有所准备的。
第一个问题:字符编码
搞 Python 不把编码问题搞清楚,总有一天它会猝不及防的坑你一把。
首先,我知道的编码有:
1. ASCII 占1个字节,只支持英文
2. GB2312 占2个字节,只支持 6700+汉字
3. GBK GB2312的升级版,支持21000+汉字
4. Shift-JIS 日本字符
5. ks_c_5601_1987
6. TIS-620 泰国编码
7. unicode 2-4字节,已经收录136690个字符,并在不断的扩张中
8. UTF-8 使用1,2,3,4个字节表示所有字符;优先使用一个字符,无法满足则增加1个字符,最多4个字节,英文占1个字节,欧洲语系占2个字节,东亚使用2个字节,否则使用4个字节。
9. UTF-16 使用2,4个字节表示所有字符,优先使用2个字节,否则使用4个字节表示
10. UTF-32 使用4个字节表示所有字符。
第二个问题:字符在硬盘上的存储
所有的编码在内存里都是以二进制存储(二进制是以0b开始的,比如:0b1101100)
在硬盘上读文件要声明以什么编码打开,不然会乱码。
3.1 文件操作
到了文件操作的了
首先,文件打开方式 : f = open(file = "文件名", mode = "打开模式", encoding = "编码")
文件的读取和写入:
写入:文件变量.write(字符串)
读取:文件变量.read()
每次读取一行:
for line in 文件变量:
print(line)
其次,打开文件要写什么编码,但是你不知道编码怎么办了。有一种方法,可以猜编码方式,基本上可以了解一下,而且会得到可行度。
模块 chardet 可以猜文件的编码。具体用法:
f = open("文件名", "rb") result = chardet.detect(f.read()) #返回的值的格式: #{'encoding': 'ascii', 'confidence': 1.0, 'language': ''}
最后,打开模式: "r","rb","w","wb","a","ab" 分别是:只读,二进制的只读,写,二进制写,追加,二进制追加
以上可以和+配合使用,比如:"r+":读写模式,先读后写。"w+":写读模式,先写再读。
3.2 函数
函数,是指一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需要调用函数名即可。
函数参数:
形参变量:定义函数时函数名的括号里面的参数就是形参。
实参:调运函数,函数名的括号里面的就是实参。
关键参数:定义函数时,如代码,age就是关键参数:
def demo(name,age = "20"): pass
非固定参数,如代码,args就是非固定参数
def demo(*args): pass
*args 是会把多个参数转为元祖,**args会转换为字典
返回值,直接用 return 参数,注意,一到return执行后,函数就结束运行了。
局部变量:
函数里的是局部变量,函数外的是全局变量。哈哈,了解一下 global 的用法。
嵌套函数:
函数里面潜逃一个或多个函数。
name = "Alex" def change_name(): name = "Alex2" def change_name2(): name = "Alex3" print("打印第三层",name) change_name2() print("打印第二层",name)
匿名函数:
匿名函数就是不直接制定函数的名称,但是还会有函数名的。
一般函数:
def calc(x,y): return x**y
换成匿名函数:
calc = lambda x,y:x**y
高阶函数:
就是函数名作为形参。
def add(x,y,f): return f(x)+f(y)
递归:
函数内部,函数自己调用自身。
def clac(n): print(n) if int(n/2) == 0: return n else: return calc(int(n/2))