Python知识点总结

目录

1、全局变量的使用

2、类的方法按照如下顺序组织

3、危险函数或命令

4、特殊方法功能描述

5、标准库os中部分函数功能

6、标准库os.path中部分函数功能

7、标准库shutil中部分函数功能

8、数据类型总结

9、文件操作

10、format函数

11、内置模块

12、并发编程

1、全局变量的使用

  1. 禁止使用global关键字声明不存在的外部变量;
  2. 尽量避免在函数中修改外部变量的值;
  3. 对于仅需要读的场景,不要用global关键字。
  4. 尽量避免使用全局变量,因为全局变量会增加各函数之间的隐式耦合;
  5. 如果确实要用,以_开头,声明为模块内部变量,排除在__all__之外;
  6. 鼓励使用模块级常量。

2、类的方法按照如下顺序组织

  1. __new__静态方法
  2. _init__构造方法
  3. ___post_init__方法
  4. 其他魔法函数
  5. @property修饰对象属性
  6. @staticmethod修饰静态方法:不需要访问实例成员,也不需要访问类成员
  7. @classmethod修饰类方法:不需要访问实例成员,但需要访问类成员
  8. 普通方法
  9. 保护方法或私有方法

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、数据类型总结

  1. 浅拷贝: 只会拷贝第一层. 第二层的内容不会拷贝. 所以被称为浅拷贝
  2. 深度拷贝:把元素内部的元素完全进行拷贝复制. 不会产生一个改变另一个跟着改变的问题
  3. python中的列表和字典在循环的时候. 不能删除自身中的元素. 列表虽然不报错. 但是删不干净. 对于字典, 直接报错. 不让删. 解决方案都一样, 把要删除的内容保存在一个新列表中, 循环新列表, 删除老列表.

9、文件操作

  1. 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、并发编程

  1. multiprocessing模块 创建多进程

    start() 启动进程要用start() 可不能用run(). run是方法的调用. 还是串行的.

    join() 让主进程等待子进程执行结束

  2. threading模块 创建多线程

posted @ 2021-12-30 22:35  舍得先森  阅读(346)  评论(0)    收藏  举报