第八周作业


1. 什么是类型注解并说明其背后的目的。

因为python是动态语言,为了方便阅读代码明确类型而在变量赋值或函数返回值时使用: 类型的方式进行注解。
如图:

  • 注解不会对语法及逻辑造成影响但在pycharm中会进行类型错误的提示。
  • 函数注解可以在函数属性__annotations__中查看。

2. 内置的open函数打开文件有几种模式,它们的区别是什么?

r模式

默认模式,只能读取文件。

w模式

写模式,如果文件不存在则创建文件,如果文件存在则清空文件后再写入。

x模式

创建文件并以只写模式打开,如果文件存在则抛出FileExistError异常。

a模式

只写模式打开并追加内容,如果文件不存在则创建文件后写入内容。

b模式

以字符形式打开,默认编码方式取决于平台。

t模式

以字节形式打开。

+模式

为rwxa模式补充缺少的读或写能力。

总结

  • r只有读能力,wxa可以写。
  • rwxa可以理解为主模式,bt+理解为附加模式,主模式同时只能存在一种,附加模式可以b+或t+,默认值为t。

3. 列出本周讲的几种序列化方法,它们各自的特点是什么?

pickle

  • python自带的序列化库,只支持python。
  • 将文件序列化为字节对象。
  • 支持所有的python类型。

json

  • 几乎所有编程语言都支持,应用广泛。
  • 将文件序列化为字符对象。
  • python对其支持的类型只有如下几个,但也够用。
Python类型 Json类型
True true
False false
None null
str string
int integer
float float
list array
dict object

msgpack

  • 可以跨语言通信,轻便效率高。
  • 将文件序列化为字节。

4. 有字符串”not 404 found 张三 99 深圳”,使用正则过滤掉英文和数字,最终得到”张三 深圳”

正则匹配:
\b[^\s\d][^\s\d]\b设定边界只取两个非空白和数字的字符,使用条件有限
[\u4e00-\u9fa5]+直接匹配汉字

import re
s = 'not 404 found 张三 99 深圳'
#方法一
rest = re.split('\d+|[a-z]+|\s', s) #以数字或英文字母及空白为界定符,得到汉字及若干空字符
print(" ".join(filter(None, rest))) #使用filter过滤空白字符再拼接字符串,使用strip不能去除两组汉字之间的空白字符

#方法二
remain = re.findall('\d+|[a-z]+', s) #找到所有英文及数字
res = [item for item in s.split() if not item in remain] #得到字符串中不在remain里的部分就是汉字
print(" ".join(res))

#方法三
print(" ".join(re.findall('[\u4e00-\u9fa5]+', s)))