• python 基础语法和基本概念


    目录

    注释

    标识符

    变量

    字面量

    数据类型转化

    运算符

    控制流

    数据结构

    列表操作

    元组操作

    集合操作

    字典操作

    字符串操作


    本文只记录python的基础语法,方便查阅。

    注释

    单行注释

    使用#符号来注释单行代码。在#之后的所有内容都会被解释器忽略。

    # 这是一个单行注释
    

    多行注释

    使用三重引号(""")或三个单引号(''')来注释多行代码。这种注释通常用于函数、类或模块级别的说明。 

    1. """
    2. 这是一个多行注释的示例。
    3. 这里可以写更多的内容来解释代码。
    4. """

    函数注释

    在函数定义的行上方使用文档字符串来描述函数的目的、参数和返回值。文档字符串是多行注释的一种特殊形式。

    1. def add_numbers(a, b):
    2. """
    3. 这个函数用于将两个数字相加。
    4. 参数:
    5. - a: 第一个数字
    6. - b: 第二个数字
    7. 返回值:
    8. 两个数字的和
    9. """
    10. return a + b

    类注释

    在类定义的行上方使用文档字符串来描述类的目的、属性和方法。文档字符串也是多行注释的一种形式。

    1. class Person:
    2. """
    3. 这个类表示一个人的属性和行为。
    4. 属性:
    5. - name: 姓名
    6. - age: 年龄
    7. 方法:
    8. - greet(): 打招呼
    9. """
    10. def __init__(self, name, age):
    11. self.name = name
    12. self.age = age
    13. def greet(self):
    14. print(f"你好,我是{self.name},今年{self.age}岁。")

    标识符

    在Python中,标识符是用于命名变量、函数、类、模块以及其他对象的名称。标识符有一些规则和约定,这些规则和约定包括:

    1. 标识符由字母、数字和下划线(_)组成。
    2. 标识符必须以字母(a-z、A-Z)或下划线(_)开头,不能以数字开头。
    3. 标识符区分大小写,这意味着myvariablemyVariable是不同的标识符。
    4. Python关键字(保留字)不能用作标识符,因为它们具有特殊的含义。一些常见的关键字包括ifelseforwhileclass等。

    以下是一些有效的Python标识符示例:

    1. my_variable
    2. myVariable
    3. count_1
    4. PI
    5. AnimalClass

    以下是一些无效的Python标识符示例:

    1. 2variable # 以数字开头
    2. my-variable # 包含连字符
    3. for # 关键字不能用作标识符
    4. class # 关键字不能用作标识符

    除了这些基本规则,还有一些命名约定,用于提高代码的可读性。例如,变量名通常使用小写字母,用下划线分隔单词,而类名通常使用大写字母开头的单词,采用驼峰命名法。这些约定不是强制性的,但它们有助于编写更清晰和易于理解的代码。

    变量

    在Python中,变量是用于存储数据的名称。变量是程序中的标识符,用于引用内存中的数据对象。当您将数据赋给变量时,Python会自动分配内存以存储该数据,并将变量与该内存位置关联。

    以下是创建和使用变量的基本规则:

    1. 变量的命名:变量的命名需要遵循标识符规则,如前面所述。变量名应具有描述性,以便易于理解变量所存储的数据。

    2. 变量赋值:要将数据分配给变量,使用等号(=)运算符。例如,x = 10 表示将整数值 10 分配给变量 x

    3. 动态类型:Python是一种动态类型语言,这意味着您不需要显式指定变量的数据类型。Python会根据分配给变量的值自动确定其数据类型。

    1. # 创建一个整数变量
    2. x = 10
    3. # 创建一个字符串变量
    4. name = "Alice"
    5. # 创建一个列表变量
    6. my_list = [1, 2, 3]
    7. # 变量可以随时重新赋值不同类型的数据
    8. x = "Hello"
    1. 变量引用:在代码中使用变量时,只需使用变量名即可。例如,print(x) 会输出变量 x 的值。

    2. 变量的作用域:变量的作用域指的是变量在代码中可见的范围。在函数内部定义的变量只能在该函数内部访问,而在函数外部定义的变量则具有全局作用域,可以在整个程序中访问。

    示例:

    1. # 全局作用域
    2. global_var = 100
    3. def my_function():
    4. # 局部作用域
    5. local_var = 50
    6. print(local_var)
    7. my_function()
    8. print(global_var) # 可以访问全局变量

    字面量

    在Python中,字面量是一种表示数据值的语法表达方式,它们表示不同数据类型的常量值。以下是一些常见的Python字面量:

    1. 整数字面量:表示整数值的字面量。可以是十进制、八进制(以0o或0O开头)、十六进制(以0x或0X开头)或二进制(以0b或0B开头)。例如:

      1. x = 42 # 十进制
      2. y = 0o52 # 八进制,等于十进制的42
      3. z = 0x2A # 十六进制,等于十进制的42
      4. binary = 0b101010 # 二进制,等于十进制的42
    2. 浮点数字面量:表示浮点数值的字面量,可以包含小数点。例如:

      1. a = 3.14
      2. b = 2.0
    3. 字符串字面量:表示文本字符串的字面量,可以使用单引号、双引号或三引号(用于多行字符串)。例如:

      1. s1 = 'Hello, World!'
      2. s2 = "Python is great!"
      3. s3 = """This is a
      4. multi-line string."""
    4. 布尔字面量:表示布尔值的字面量,只有两个值:TrueFalse

      1. is_true = True
      2. is_false = False
    5. None 字面量:表示空值的字面量,用于表示缺少值或占位符。

      empty_value = None
      
    6. 列表字面量:表示列表数据结构的字面量,使用方括号 [] 包围元素。

      my_list = [1, 2, 3]
      
    7. 字典字面量:表示字典数据结构的字面量,使用花括号 {} 包围键-值对。

      my_dict = {"name": "Alice", "age": 30}
      
    8. 集合字面量:表示集合数据结构的字面量,使用花括号 {} 包围元素,但没有键-值对。

      my_set = {1, 2, 3}
      

    数据类型转化

    在Python中,您可以进行不同数据类型之间的转换,以满足特定的需求。以下是一些常见的数据类型转换方法:

    1. 隐式类型转换:在某些情况下,Python会自动进行隐式类型转换,以使表达式成立。例如,在整数和浮点数之间的运算会将整数转换为浮点数。

      1. x = 5
      2. y = 2.0
      3. z = x + y # x会隐式转换为浮点数,z的值为 7.0

    2. 显式类型转换:您可以使用内置函数来执行显式的类型转换。以下是一些常见的类型转换函数:

      • int():将一个值转换为整数类型。

        x = 3.7 y = int(x) # y的值为 3
      • float():将一个值转换为浮点数类型。

        1. x = 5
        2. y = float(x) # y的值为 5.0
      • str():将一个值转换为字符串类型。

        1. x = 42
        2. y = str(x) # y的值为 "42"
      • list():将一个可迭代对象(如元组、字符串或集合)转换为列表。

        1. tpl = (1, 2, 3)
        2. lst = list(tpl) # lst的值为 [1, 2, 3]
      • tuple():将一个可迭代对象转换为元组。

        lst = [1, 2, 3] tpl = tuple(lst) # tpl的值为 (1, 2, 3)
      • set():将一个可迭代对象转换为集合。

        lst = [1, 2, 2, 3, 3] st = set(lst) # st的值为 {1, 2, 3}
      • dict():将可迭代对象中的键-值对转换为字典。

        pairs = [("a", 1), ("b", 2)] d = dict(pairs) # d的值为 {'a': 1, 'b': 2}
    3. 请注意,进行显式类型转换时,确保数据能够合理地转换为目标类型,否则可能会引发异常。例如,将无法将非整数字符串转换为整数。类型转换通常用于确保正确的数据处理和运算。

    运算符

    在Python中,运算符是用于执行各种数学和逻辑操作的特殊符号或关键词。Python支持多种不同类型的运算符,包括算术运算符、比较运算符、逻辑运算符、赋值运算符等。以下是常见的运算符及其用法:

    1. 算术运算符

      • +:加法
      • -:减法
      • *:乘法
      • /:除法
      • %:取余(模运算)
      • //:整数除法
      • **:幂运算
        1. a = 10
        2. b = 3
        3. c = a + b # 13
        4. d = a / b # 3.3333
        5. e = a % b # 1
        6. f = a // b # 3
        7. g = a ** b # 1000
    2. 比较运算符

      • ==:等于
      • !=:不等于
      • <:小于
      • >:大于
      • <=:小于等于
      • >=:大于等于

      比较运算符返回布尔值(TrueFalse):

      1. x = 5
      2. y = 10
      3. result1 = x == y # False
      4. result2 = x < y # True
    3. 逻辑运算符

      • and:逻辑与
      • or:逻辑或
      • not:逻辑非

      逻辑运算符通常用于组合布尔表达式:

      1. a = True
      2. b = False
      3. result1 = a and b # False
      4. result2 = a or b # True
      5. result3 = not a # False
    4. 赋值运算符

      • =:赋值
      • +=:加法赋值
      • -=:减法赋值
      • *=:乘法赋值
      • /=:除法赋值
      • %=:取余赋值
      • //=:整数除法赋值
      • **=:幂赋值

      赋值运算符用于将右侧表达式的值赋给左侧的变量:

      1. x = 5
      2. x += 2 # 等同于 x = x + 2,x的值变为7

    5. 成员运算符

      • in:用于检查某个元素是否存在于序列(如列表、字符串、元组等)中。
      • not in:用于检查某个元素是否不存在于序列中。
      1. my_list = [1, 2, 3, 4, 5]
      2. result1 = 3 in my_list # True
      3. result2 = 6 not in my_list # True
    6. 身份运算符

      • is:用于检查两个对象是否是同一个对象。
      • is not:用于检查两个对象是否不是同一个对象。
      1. a = [1, 2, 3]
      2. b = a
      3. result1 = a is b # True
      4. result2 = a is not b # False

    控制流

    Python的控制流是一组结构和语句,用于管理程序的执行流程。控制流可以分为以下几个主要方面:

    1. 条件语句(if、elif、else)

      条件语句允许根据条件的真假来执行不同的代码块。以下是条件语句的基本结构:

      1. if condition:
      2. # 如果条件为真,执行这里的代码
      3. elif another_condition:
      4. # 如果另一个条件为真,执行这里的代码
      5. else:
      6. # 如果以上条件都不为真,执行这里的代码
      7. x = 10
      8. if x > 5:
      9. print("x 大于 5")
      10. elif x == 5:
      11. print("x 等于 5")
      12. else:
      13. print("x 小于 5")
    2. 循环语句(for、while)

      循环语句允许多次执行一组代码块。以下是两种主要类型的循环:

      • for循环:用于遍历可迭代对象(如列表、元组、字符串等)中的元素。

        1. if condition:
        2. # 如果条件为真,执行这里的代码
        3. elif another_condition:
        4. # 如果另一个条件为真,执行这里的代码
        5. else:
        6. # 如果以上条件都不为真,执行这里的代码
        7. x = 10
        8. if x > 5:
        9. print("x 大于 5")
        10. elif x == 5:
        11. print("x 等于 5")
        12. else:
        13. print("x 小于 5")

      • while循环:根据条件的真假来执行一组代码块,直到条件变为假。

        1. while condition:
        2. # 只要条件为真,就执行这里的代码
        3. count = 0
        4. while count < 5:
        5. print(count)
        6. count += 1

    3. 控制循环

      • break:用于退出当前循环。
      • continue:用于跳过当前循环迭代,继续下一次迭代。
      1. for i in range(1, 10):
      2. if i % 2 == 0:
      3. continue # 跳过偶数
      4. print(i)
      5. if i == 5:
      6. break # 退出循环
    4. 异常处理(try、except)

      异常处理允许您捕获和处理运行时错误,以避免程序崩溃。以下是异常处理的基本结构:

      1. try:
      2. # 尝试执行可能引发异常的代码
      3. except ExceptionType as e:
      4. # 处理异常的代码
      5. else:
      6. # 如果没有发生异常,执行这里的代码
      7. finally:
      8. # 无论是否发生异常,都执行这里的代码
      9. try:
      10. result = 10 / 0
      11. except ZeroDivisionError as e:
      12. print("除以零错误:", e)
      13. else:
      14. print("结果:", result)
      15. finally:
      16. print("异常处理完成")

    数据结构

    在Python中,数据结构用于存储和组织数据,使其易于访问和操作。Python提供了多种内置的数据结构,包括以下一些常见的:

    1. 列表(List):列表是有序的可变序列,用于存储多个元素。列表使用方括号 [] 表示,元素之间用逗号分隔。

    2. 元组(Tuple):元组是有序的不可变序列,用于存储多个元素。元组使用圆括号 () 表示,元素之间用逗号分隔。

    3. 集合(Set):集合是无序的独立元素的集合,用于存储唯一的元素。集合使用花括号 {} 表示,元素之间用逗号分隔。

    4. 字典(Dictionary):字典是键-值对的集合,用于存储映射关系。字典使用花括号 {} 表示,键和值之间使用冒号 : 分隔,键-值对之间用逗号分隔。

    5. 字符串(String):字符串是字符序列,用于存储文本数据。字符串可以用单引号 ''、双引号 "" 或三引号 ''' 表示。

    6. 栈(Stack):栈是一种后进先出(LIFO)的数据结构,通常用于管理函数调用、表达式求值等。

    7. 队列(Queue):队列是一种先进先出(FIFO)的数据结构,通常用于任务调度等。

    8. 堆(Heap):堆是一种用于优先级队列和堆排序的数据结构。

    9. 链表(Linked List):链表是一种动态数据结构,通常用于构建其他数据结构。

    10. 树(Tree):树是一种层次结构,包括二叉树、二叉搜索树、堆、树等。

    11. 图(Graph):图是一种用于表示各种关系的数据结构,包括有向图和无向图。

    12. 其他:Python还支持自定义数据结构,如命名元组、命名空间、枚举等。

    列表操作

    在Python中,列表(List)是一种有序的可变数据结构,用于存储一组元素。您可以执行各种操作来创建、访问、修改和处理列表。以下是一些常见的列表操作:

    1. 创建列表

      您可以使用方括号 [] 来创建一个列表,并在其中包含元素。例如:

      my_list = [1, 2, 3, 4, 5]
      
    2. 访问列表元素

      您可以使用索引来访问列表中的元素,索引从0开始。例如,my_list[0] 访问第一个元素,my_list[1] 访问第二个元素,以此类推。

    3. 列表切片

      使用切片操作可以访问列表的一部分。语法为 list[start:end],其中 start 是起始索引,end 是结束索引(不包括)。例如:

      sub_list = my_list[1:4] # 获取索引1到3的元素,结果为 [2, 3, 4]

    4. 修改列表元素

      列表是可变的,可以通过索引赋值来修改元素的值。例如:

      my_list[2] = 100 # 将第三个元素修改为100
    5. 添加元素

      使用 append() 方法可以在列表末尾添加元素。例如:

      my_list.append(6) # 添加元素6到列表末尾
    6. 插入元素

      使用 insert() 方法可以在指定位置插入元素。例如:

      my_list.insert(2, 7) # 在索引2处插入元素7
    7. 删除元素

      使用 remove() 方法可以删除指定值的元素,使用 pop() 方法可以删除指定索引的元素,或者使用 del 语句删除指定索引的元素。例如:

      1. my_list.remove(4) # 删除值为4的元素
      2. my_list.pop(2) # 删除索引为2的元素
      3. del my_list[0] # 删除第一个元素
    8. 查找元素

      使用 index() 方法可以查找元素的索引,使用 in 运算符可以检查元素是否在列表中。例如:

      1. index = my_list.index(3) # 查找元素3的索引
      2. is_present = 4 in my_list # 检查元素4是否在列表中
    9. 列表长度

      使用 len() 函数可以获取列表的长度(元素个数)。例如:

      length = len(my_list) # 获取列表长度
    10. 列表操作

      列表支持多种操作,如连接两个列表、重复列表、排序、反转等。例如:

      1. new_list = my_list + [6, 7] # 连接两个列表
      2. repeated_list = my_list * 2 # 重复列表
      3. my_list.sort() # 排序列表
      4. my_list.reverse() # 反转列表

    元组操作

    元组(Tuple)是Python中的有序不可变数据结构,它类似于列表,但不支持修改元素。以下是一些常见的元组操作:

    1. 创建元组

      您可以使用圆括号 () 来创建一个元组,并在其中包含元素。例如:

      my_tuple = (1, 2, 3, 4, 5)

      或者,如果元组只包含一个元素,需要在元素后面添加逗号,以区分它和普通的括号:

      single_element_tuple = (42,)
    2. 访问元组元素

      您可以使用索引来访问元组中的元素,索引仍然从0开始。例如,my_tuple[0] 访问第一个元素,my_tuple[1] 访问第二个元素,以此类推。

    3. 元组切片

      使用切片操作可以访问元组的一部分,语法为 tuple[start:end],其中 start 是起始索引,end 是结束索引(不包括)。例如:

      sub_tuple = my_tuple[1:4] # 获取索引1到3的元素,结果为 (2, 3, 4)
    4. 元组拆包

      您可以将元组中的元素赋值给多个变量,以便分别访问各个元素。这被称为元组拆包。例如:

      a, b, c = my_tuple # 将元组的元素分配给变量a、b和c
    5. 元组合并

      使用 + 运算符可以将两个元组合并为一个新元组。例如:

      new_tuple = my_tuple + (6, 7) # 合并两个元组
    6. 元组重复

      使用 * 运算符可以重复元组中的元素多次。例如:

      repeated_tuple = my_tuple * 2 # 重复元组
    7. 查找元组元素

      使用 index() 方法可以查找元素的索引,使用 in 运算符可以检查元素是否在元组中。例如:

      1. index = my_tuple.index(3) # 查找元素3的索引
      2. is_present = 4 in my_tuple # 检查元素4是否在元组中
    8. 元组长度

      使用 len() 函数可以获取元组的长度(元素个数)。例如:

      length = len(my_tuple) # 获取元组长度

    集合操作

    在Python中,集合(Set)是一种无序且具有唯一性的数据结构,用于存储不重复的元素。集合提供了多种操作,以便处理和操作集合中的数据。以下是一些常见的集合操作:

    1. 创建集合

      您可以使用花括号 {}set() 构造函数来创建一个集合。例如:

      my_set = {1, 2, 3, 4, 5}

    2. 添加元素

      使用 add() 方法可以向集合中添加元素。元素必须是唯一的,如果添加已存在的元素,它将被忽略。例如:

      my_set.add(6) # 添加元素6到集合

    3. 删除元素

      使用 remove() 方法可以从集合中删除指定元素,如果元素不存在,将引发KeyError异常。使用 discard() 方法可以删除元素,但如果元素不存在,不会引发异常。例如:

      1. my_set.remove(4) # 删除元素4
      2. my_set.discard(7) # 删除元素7(如果存在)

    4. 清空集合

      使用 clear() 方法可以清空集合中的所有元素。例如:

      my_set.clear() # 清空集合

    5. 集合操作

      集合支持各种操作,如并集、交集、差集等,可以使用相关方法来执行这些操作。例如:

      • 并集:union()
      • 交集:intersection()
      • 差集:difference()
      • 对称差集:symmetric_difference()

      示例:

      1. set1 = {1, 2, 3}
      2. set2 = {3, 4, 5}
      3. union_set = set1.union(set2) # 并集
      4. intersection_set = set1.intersection(set2) # 交集
      5. difference_set = set1.difference(set2) # 差集
      6. symmetric_difference_set = set1.symmetric_difference(set2) # 对称差集

    6. 子集和超集检查

      使用 issubset()issuperset() 方法可以检查一个集合是否是另一个集合的子集或超集。例如:

      1. subset_check = set1.issubset(set2) # 检查set1是否是set2的子集
      2. superset_check = set1.issuperset(set2) # 检查set1是否是set2的超集

    7. 集合长度

      使用 len() 函数可以获取集合的长度(元素个数)。例如:

      length = len(my_set) # 获取集合长度

    8. 转换为列表

      使用 list() 函数可以将集合转换为列表。例如:

      my_list = list(my_set) # 将集合转换为列表

    字典操作

    字典(Dictionary)是Python中的一种数据结构,用于存储键-值对的集合,键是唯一的,用于快速查找值。以下是一些常见的字典操作:

    1. 创建字典

      您可以使用花括号 {} 来创建一个字典,其中包含键-值对。例如:

      my_dict = {'name': 'Alice', 'age': 30, 'city': 'New York'}

    2. 访问字典值

      您可以使用键来访问字典中的值。例如,my_dict['name'] 返回键 'name' 对应的值 'Alice'

    3. 添加或修改键值对

      使用赋值语句可以添加或修改字典中的键值对。例如:

      1. my_dict['gender'] = 'Female' # 添加新的键值对
      2. my_dict['age'] = 31 # 修改年龄的值

    4. 删除键值对

      使用 del 语句可以删除字典中的键值对。例如:

      del my_dict['city'] # 删除'city'键值对

    5. 检查键是否存在

      使用 in 运算符可以检查键是否存在于字典中。例如:

      if 'name' in my_dict: print("Name is in the dictionary.")

    6. 获取所有键、所有值和键值对

      使用 keys() 方法可以获取字典中的所有键,使用 values() 方法可以获取所有值,使用 items() 方法可以获取所有键值对。例如:

      1. keys = my_dict.keys() # 获取所有键
      2. values = my_dict.values() # 获取所有值
      3. items = my_dict.items() # 获取所有键值对

    7. 遍历字典

      使用 for 循环可以遍历字典中的键,然后使用键来获取相应的值。例如:

      for key in my_dict: value = my_dict[key] print(key, value)

      或者,使用 items() 方法可以遍历键值对:

      for key, value in my_dict.items(): print(key, value)

    8. 复制字典

      使用 copy() 方法可以复制一个字典,创建一个新的字典。例如:

      new_dict = my_dict.copy() # 复制字典

    9. 清空字典

      使用 clear() 方法可以清空字典中的所有键值对。例如:

      my_dict.clear() # 清空字典

    字符串操作

    在Python中,字符串(String)是一种常见的数据类型,用于存储文本数据。Python提供了许多字符串操作方法,以便处理和操作字符串数据。以下是一些常见的字符串操作:

    1. 创建字符串

      您可以使用单引号 ''、双引号 "" 或三引号 ''' 来创建字符串。例如:

      my_string = "Hello, World!"

    2. 字符串连接

      使用 + 运算符可以将两个字符串连接在一起。例如:

      string1 = "Hello" string2 = "World" combined_string = string1 + ", " + string2 # 连接两个字符串

    3. 字符串重复

      使用 * 运算符可以重复一个字符串多次。例如:

      repeated_string = "ABC" * 3 # 重复字符串3次

    4. 字符串长度

      使用 len() 函数可以获取字符串的长度(字符数)。例如:

      length = len(my_string) # 获取字符串长度

    5. 字符串索引和切片

      您可以使用索引来访问字符串中的单个字符,索引从0开始。还可以使用切片操作来访问字符串的一部分。例如:

      1. first_char = my_string[0] # 获取字符串的第一个字符
      2. sub_string = my_string[7:12] # 获取索引7到11的子字符串

    6. 字符串查找

      使用 find() 方法可以查找子字符串在主字符串中的位置,或者使用 in 运算符来检查子字符串是否存在。例如:

      1. index = my_string.find("World") # 查找子字符串的位置
      2. is_present = "Hello" in my_string # 检查子字符串是否存在

    7. 字符串替换

      使用 replace() 方法可以替换字符串中的子字符串。例如:

      new_string = my_string.replace("World", "Python") # 替换子字符串

    8. 字符串分割

      使用 split() 方法可以将字符串拆分成子字符串列表,根据指定的分隔符。例如:

      words = my_string.split(", ") # 使用逗号和空格分割字符串

    9. 字符串格式化

      使用字符串的 format() 方法或f-strings可以将变量的值插入到字符串中,以创建格式化字符串。例如:

      1. name = "Alice"
      2. age = 30
      3. formatted_string = "My name is {} and I am {} years old.".format(name, age)

      或使用f-strings:

      formatted_string = f"My name is {name} and I am {age} years old."

    10. 字符串大小写转换

      使用 upper() 方法可以将字符串转为大写,使用 lower() 方法可以将字符串转为小写。例如:

      1. uppercase_string = my_string.upper() # 转为大写
      2. lowercase_string = my_string.lower() # 转为小写

  • 相关阅读:
    RabbitMQ之延迟队列
    XCTF-reverse-signin
    设备树的引进与体验_使用设备树时的驱动编程
    MongoDB 简介
    设计模式——8. 代理模式
    解决vite+vue3页面不会热更新的问题
    【CSS】H9_CSS变形transform、过渡transition、CSS3动画 animation
    深入浅出Spring Cloud Netflix - Ribbon
    JAVA计算机毕业设计电子病历系统Mybatis+系统+数据库+调试部署
    MQ---第六篇
  • 原文地址:https://blog.csdn.net/qq_45799465/article/details/131792770