Python知识点总结
目录
1、全局变量的使用
2、类的方法按照如下顺序组织
3、危险函数或命令
4、特殊方法功能描述
5、标准库os中部分函数功能
6、标准库os.path中部分函数功能
7、标准库shutil中部分函数功能
8、数据类型总结
9、文件操作
10、format函数
11、内置模块
12、并发编程
1、全局变量的使用
- 禁止使用global关键字声明不存在的外部变量;
- 尽量避免在函数中修改外部变量的值;
- 对于仅需要读的场景,不要用global关键字。
- 尽量避免使用全局变量,因为全局变量会增加各函数之间的隐式耦合;
- 如果确实要用,以_开头,声明为模块内部变量,排除在__all__之外;
- 鼓励使用模块级常量。
2、类的方法按照如下顺序组织
- __new__静态方法
- _init__构造方法
- ___post_init__方法
- 其他魔法函数
- @property修饰对象属性
- @staticmethod修饰静态方法:不需要访问实例成员,也不需要访问类成员
- @classmethod修饰类方法:不需要访问实例成员,但需要访问类成员
- 普通方法
- 保护方法或私有方法
3、危险函数或命令
- subprocess.run shell=True
- subprocess.Popen shell=True
- subprocess.call shell=True
- subprocess.check shell=True
- subprocess.check_call shell=True
- subprocess.check_output shell=True
- eval 推荐使用ast.literal_eval()
- exec
- pty.spawn
4、特殊方法功能描述
| 序号 | 方法 | 功能说明 |
|---|---|---|
| 1 | _new_() | 类的静态方法,用于确定是否要创建对象,比__init__先执行,需要继承内置类时使用,如果没有返回实例对象,则__init__不会执行 |
| 2 | _init_() | 构造方法,创建对象时自动调用 |
| 3 | _del_() | 析构方法,释放对象时自动调用 |
| 4 | _add_() | + |
| 5 | _sub_() | - |
| 6 | _mul_() | * |
| 7 | _truediv_() | / |
| 8 | _floordiv_() | // |
| 9 | _mod_() | % |
| 10 | _pow_() | ** |
| 11 | _eq_()、 _ne()、 _lt_()、 _le_()、 _gt_() 、_ge_() | ==、!=、<、<=、>、>= |
| 12 | _lshift_()、_rshift__() | <<、>> |
| 13 | _and_() | & |
| 14 | _or_() | | |
| 15 | _invert_() | ~ |
| 16 | _xor_() | ^ |
| 17 | _iadd_() | += |
| 18 | _isub_() | -= |
| 19 | _pos_() | 正号 |
| 20 | _neg_() | 负号 |
| 21 | _contains_() | 与成员测试运算符in对应 |
| 22 | _abs_() | 绝对值 |
| 23 | _bool_() | 布尔值 |
| 24 | _bytes_() | 要求该方法返回字节 |
| 25 | _complex_() | 要求该方法返回负数 |
| 26 | _dir_() | 内置函数dir() |
| 27 | _divmod_() | 内置函数divmod() |
| 28 | _float_() | 要求该方法返回实数 |
| 29 | _hash_() | 内置函数hash() |
| 30 | _int_() | 要求该方法返回整数 |
| 31 | _len_() | 内置函数len() |
| 32 | _next_() | 内置函数next() |
| 33 | _reduce_() | 内置函数reduce() |
| 34 | _reversed_() | 内置函数reversed() |
| 35 | _round_() | 内置函数round() |
| 36 | _str_() | 内置函数str() |
| 37 | _repr_() | 打印、转换,要求返回str类型 |
| 38 | _getitem_() | 按照索引获取值 |
| 39 | _setitem_() | 按照索引赋值 |
| 40 | _delattr_() | 删除对象的指定属性 |
| 41 | _getattr_() | 获取对象指定属性的值,对应成员运算符. |
| 42 | _getattribute_() | 获取对象指定属性的值,如果同事定义getattr,那么getattr不会被调用 |
| 43 | _setattr_() | 设置对象指定属性的值 |
| 44 | _base_() | 该类的基类 |
| 45 | _class_() | 返回对象所属的类 |
| 46 | _dict_() | 对象所包含的属性与值的字典 |
| 47 | _subclasses_() | 返回该类的所有子类 |
| 48 | _call_() | 包含该特殊方法的类的实例可以像函数一样调用 |
| 49 | _get_() | 定义这三方法中任何一个的类乘坐描述符descriptor |
| 50 | _set_() | 同上 |
| 51 | _delete_() | 同上 |
4、一句话提示
-
禁止在__init__外定义实例属性。会造成生命周期不一致,为后续跨方法访问埋下隐患
-
未实现的数值运算类型魔法函数必须返回NotImplemented,而不是NotImplementedError异常
-
_slots_ 在类实例较多(一般百万级别以上),程序会占用较多内存,一般用__slots__属性存放必要的对象
-
模块文档注释在文件顶部,Shebang和文件编码、版权声明之后,imports之前不用缩进
-
imports应该在模块注释和文档字符串之后,模块全局变量和常量声明前,如果文件中定义_all_、_version_ 全局变量,则imports应该在其后。例外:__future__模块导入必须放在文档字符串之后,其他内容之前
-
浮点型数据不要用==判断相等,而应使用标准库函数math.isclose()判断是否足够接近
-
同一函数/方法中所有分治的返回方式应同一为隐式或显式
-
如果子类和父类中都有__init__方法,则子类中的init方法必须正确调用其父类的__init__方法
-
修改sys.path注意,建议使用sys.path.append(my_directory),禁止使用sys.path.insert(0, my_directory)
-
禁止使用有风险的tempfile.mktemp()创建临时文件,因为和时间强相关有重名风险;可以使用安全方式比如tempfile模块的mkstemp、mkdtemp、NamedTemporaryFile
-
禁止使用pickle.load、_pickle.load和shelve模块加载外部数据
5、标准库os中部分函数功能
| 序号 | 函数 | 功能说明 |
|---|---|---|
| 1 | chdir() | 把path设为当前工作文件夹 |
| 2 | chmod() | 修改文件的访问权限 |
| 3 | getcwd() | 返回表示当前工作文件夹的字符串 |
| 4 | getenv() | 返回系统变量的值,如os.getenv('path') |
| 5 | listdir() | 返回path文件夹中的文件和子文件夹名字组成的列表 |
| 6 | mkdir() | 创建文件夹,windows平台设置mode无效 |
| 7 | rmdir() | 删除path指定的文件夹,要求其中不能有文件或子文件夹 |
| 8 | remove() | 删除指定的文件,要求用户拥有删除文件的权限,文件没有只读或其他特殊属性 |
| 9 | rename() | 重命名文件或文件夹 |
| 10 | scandir() | 返回包含给定路径path中每个对象的迭代器对象,每个对象对应于一个DirEntry对象 |
| 11 | startfile() | 使用关联的应用程序打开指定文件或启动应用程序,如果filepath是url,则打开网址 |
| 12 | stat() | 查看文件属性,包括创建时间、最后访问时间、最后修改时间、大小等 |
| 13 | walk() | 目录树生成器,生成一个元组(dirpath,dirnames,filenames) |
6、标准库os.path中部分函数功能
| 序号 | 函数 | 功能说明 |
|---|---|---|
| 1 | abspath(path) | 返回给定路径的绝对路径 |
| 2 | basename(p) | 返回给定路径的最后一个路径分隔符后面的部分 |
| 3 | dirname(p) | 返回给定路径的最后一个路径分隔符前面的部分 |
| 4 | exists(path) | 判断指定的路径是否存在 |
| 5 | getatime(filename) | 返回表示文件最后访问时间的纪元秒数 |
| 6 | getctime(filename) | 返回表示文件创建时间或元数据最后的修改时间 |
| 7 | getmtime(filename) | 返回表示文件最后修改时间的纪元秒数 |
| 8 | getsize(filename) | 返回文件大小,单位为字节 |
| 9 | isdir(s) | 判断指定路径是否为文件夹 |
| 10 | isfile(path) | 判断指定路径是否为文件 |
7、标准库shutil中部分函数功能
| 序号 | 函数 | 功能说明 |
|---|---|---|
| 1 | copy | 复制文件,包括文件属性,如果目标文件已存在则异常 |
| 2 | copy2 | 复制文件和元数据(mode,atime) |
| 3 | copyfile | 复制文件,不复制文件属性,如果目标文件存在则覆盖 |
| 4 | copytree | 递归复制目录树,返回目标文件夹 |
| 5 | disk_usage | 查看磁盘使用情况 |
| 6 | move | 移动文件或递归移动文件夹,可以用来给文件或文件夹重命名 |
| 7 | rmtree | 删除整个文件夹包括子文件夹 |
| 8 | make_archive | 创建tar或zip格式压缩文件 |
| 9 | unpack_archive | 解压缩 |
8、数据类型总结
- 浅拷贝: 只会拷贝第一层. 第二层的内容不会拷贝. 所以被称为浅拷贝
- 深度拷贝:把元素内部的元素完全进行拷贝复制. 不会产生一个改变另一个跟着改变的问题
- python中的列表和字典在循环的时候. 不能删除自身中的元素. 列表虽然不报错. 但是删不干净. 对于字典, 直接报错. 不让删. 解决方案都一样, 把要删除的内容保存在一个新列表中, 循环新列表, 删除老列表.
9、文件操作
- rb. 读取出来的数据是bytes类型, 在rb模式下. 不能选择encoding字符集.
f = open(文件, mode="模式" encoding="编码")
模式:
r: 只读
w: 只写
a: 追加写
+: 扩展
b: 字节(非文本文件)
读取文件最好的方案
with open() as f:
for line in f:
xxxxx
10、format函数
# 字符串
print(format('test', '<20')) # 左对齐
print(format('test', '>20')) # 右对齐
print(format('test', '^20')) # 居中
# 数值
print(format(3, 'b')) # 二进制
print(format(97, 'c')) # 转换成unicode字符
print(format(11, 'd')) # 十进制
print(format(11, 'o')) # 八进制
print(format(11, 'x')) # 十六进制(小写字母)
print(format(11, 'X')) # 十六进制(大写字母)
print(format(11, 'n')) # 和d一样
print(format(11)) # 和d一样
# 浮点数
print(format(123456789, 'e')) # 科学计数法. 默认保留6位小数
print(format(123456789, '0.2e')) # 科学计数法. 保留2位小数(小写)
print(format(123456789, '0.2E')) # 科学计数法. 保留2位小数(大写)
print(format(1.23456789, 'f')) # 小数点计数法. 保留6位小数
print(format(1.23456789, '0.2f')) # 小数点计数法. 保留2位小数
print(format(1.23456789, '0.10f')) # 小数点计数法. 保留10位小数
print(format(1.23456789e+10000, 'F')) # 小数点计数法.
# 其他
bytes() # 把字符串转化成bytes类型
bytearray() # 返回一个新字节数组. 这个数字里的元素是可变的, 并且每个元素的值得范围是[0,256), 这个没用
memoryview() # 查看bytes在内存中的情况
ord() # 输入字符找带字符编码的位置
chr() # 输入位置数字找出对应的字符
ascii() # 是ascii码中的返回该值 不是就返回\u...
repr() # 返回一个对象的官方表示形式
11、内置模块
# 1.time模块
time.sleep()
time.time()
# 2.datetime模块:
strftime # 时间格式化
strptime # 字符串转换成时间
# 3.random模块
random.random() # 随机数
random.uniform(10, 20) # 随机小数
random.randint(1, 10) # 随机整数
random.choice(lst) # 从列表中随机选1个
random.sample(lst, 3) # 从列表中随机选n个
random.shuffle(lst) # 打乱一个列表
# 4.pickle模块
bs = pickle.dumps(lst) # 把一个对象(数据)转化成字节
lst = pickle.loads(bs) # 把一个文件中的二进制字节转化回我们的数据
pickle.dump(lst, open("lst.dat", mode="wb")) # 把一个数据转化成字节, 写入到文件
lst = pickle.load(open("lst.dat", mode="rb")) # 把一个文件中的二进制字节转化回我们的数据
# 5.hashlib模块
obj = hashlib.md5()
obj.update("jolin".encode("utf-8")) # 加密的必须是字节
miwen = obj.hexdigest()
# 6.shutil模块
shutil.copyfileobj(fsrc, fdst, 1024*10) # 拷贝文件对象
shutil.copyfile("dir/a.txt", "dir/d.txt") # 拷贝文件, 直接给出路径就可以了
shutil.copymode(".", "dir/e.txt") # 把访问权限拷贝
shutil.copystat(".", "dir/d.txt") # 把权限, 访问时间, 修改时间等信息拷贝
shutil.copy("dir/a.txt", "dir/f.txt") # copyfile() + copymode()
shutil.copy2("dir/a.txt", "dir/f.txt") # copyfile() + copystat()
shutil.copytree("./dir", "./baby") # 拷贝文件夹
shutil.rmtree("dir") # 删除文件夹
shutil.move(src, dst) # 移动文件, 如果dst文件目录不存在. 则重命名src文件
# 7.logging模块
file_handler = logging.FileHandler('l1.log', 'a', encoding='utf-8')
file_handler.setFormatter(logging.Formatter(fmt="%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s"))
logger1 = logging.Logger('s1', level=logging.ERROR)
logger1.addHandler(file_handler)
# 8.traceback模块
try:
print(1/0)
except:
print("出错了")
print(traceback.format_exc()) # 错误信息就能看到了
# 9.zipfile模块
f.extractall("zip_dir/abc") # 全部解压缩到文件夹
f.extract(name, "zip_dir/abc")
# 10.re模块
# 1).基本元字符
. 匹配除换行符以外的任意字符
\w 匹配字母或数字或下划线
\s 匹配任意的空白符
\d 匹配数字
\n 匹配一个换行符
\t 匹配一个制表符
^ 匹配字符串的开始
$ 匹配字符串的结尾
\W 匹配非字母或数字或下划线
\D 匹配非数字
\S 匹配非空白符
a|b 匹配字符a或字符
b () 匹配括号内的表达式,也表示一个组
[...] 匹配字符组中的字符
[^...] 匹配除了字符组中字符的所有字符
# 2).量词
* 重复零次或更多次
+ 重复一次或更多次
? 重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次
# 3).分组
身份证号 15位, 18位
^[1-9]\d{13,16}[0-9x]$
^[1-9]\d{14}(\d{2}[0-9x])?$
^([1-9]\d{16}[0-9x]|[1-9]\d{14})$
re.findall # 查找所有. 返回list
re.search # 会进行匹配. 如果匹配到了第一个结果. 就会返回这个结果. 如果匹配不上search返回的则是None
re.match # 只能从字符串的开头进行匹配
re.finditer # 和findall差不多. 只不过这时返回的是迭代器
re.split('[ab]', 'qwerafjbcd') # 先按'a'分割得到'qwer'和'fjbcd',在对'qwer'和'fjbcd'分别按'b'分割
re.sub(r"\d+", "_sb_", "jolin250tory250tony250kevin38") # 把字符串中的数字换成__sb__
re.subn(r"\d+", "_sb_", "jolin250tory250tony250kevin38") # 将数字替换成'__sb__',返回元组(替换的结果,替换了多少次)
re.compile(r'\d{3}') # 将正则表达式编译成为一个 正则表达式对象, 规则要匹配的是3个数字
obj = re.compile(r'(?P<id>\d+)(?P<name>e+)') # 从正则表达式匹配的内容每个组起名字
print(ret.group("id")) # 结果: 123 # 获取id组的内容
print(ret.group("name")) # 结果: eeee # 获取name组的内容
# 11.os模块
os.makedirs('dirname1/dirname2') # 可生成多层递归目录
os.removedirs('dirname1') # 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
os.mkdir('dirname') # 生成单级目录;相当于shell中mkdir dirname
os.rmdir('dirname') # 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
os.listdir('dirname') # 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
os.remove() # 删除一个文件
os.rename("oldname","newname") # 重命名文件/目录
os.system("bash command") # 运行shell命令,直接显示
os.popen("bash command").read() # 运行shell命令,获取执行结果
os.getcwd() # 获取当前工作目录,即当前python脚本工作的目录路径
os.chdir("dirname") # 改变当前脚本工作目录;相当于shell下cd
# os.path
os.path.abspath(path) # 返回path规范化的绝对路径
os.path.normpath(path) # 规范化指定的路径
os.path.realpath(path) # 通过消除路径中遇到的任何符号链接来获取指定文件名的规范路径
os.path.split(path) # 将path分割成目录和文件名二元组返回
os.path.dirname(path) # 返回path的目录。其实就是os.path.split(path)的第一个元素
os.path.basename(path) # 返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素
os.path.exists(path) # 如果path存在,返回True;如果path不存在,返回False
os.path.isabs(path) # 如果path是绝对路径,返回True
os.path.isfile(path) # 如果path是一个存在的文件,返回True。否则返回False
os.path.isdir(path) # 如果path是一个存在的目录,则返回True。否则返回False
os.path.join(path1[, path2[, ...]]) # 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
os.path.getatime(path) # 返回path所指向的文件或者目录的最后访问时间
os.path.getmtime(path) # 返回path所指向的文件或者目录的最后修改时间
os.path.getsize(path) # 返回path的大小
# 特殊属性:
os.sep # 输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
os.linesep # 输出当前平台使用的行终止符,win下为"\r\n",Linux下为"\n"
os.pathsep # 输出用于分割文件路径的字符串 win下为;,Linux下为:
os.name # 输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
# 12.sys模块
sys.argv # 命令行参数List,第一个元素是程序本身路径
sys.exit(n) # 退出程序,正常退出时exit(0),错误退出sys.exit(1)
sys.version # 获取Python解释程序的版本信息
sys.path # 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.platform # 返回操作系统平台名称
# 此时, 只有该模块被右键run执行的时候. 才会执行下面的代码
if __name__ == '__main__':
eat()
12、并发编程
-
multiprocessing模块 创建多进程
start() 启动进程要用start() 可不能用run(). run是方法的调用. 还是串行的.
join() 让主进程等待子进程执行结束
-
threading模块 创建多线程

浙公网安备 33010602011771号