【python】随笔 - 知识点小课堂 -1~13 Python程序设计基础全章节

前言

本文是前十三个章节关键内容的梳理

3.python可迭代对象

3.12 双层列表推导式

  • vec 为二维列表 [[1,2],[3,4]]
  • 表达式 [[row[i] for row in vec] for i in range(len(vec[0]))] 生成 vec 中所有行的指定列索引 i 的元素组成的列表。

3.13 集合比较

  • {1, 2, 3} < {3, 4, 5} 比较基于元素顺序,结果为 True

3.14 list.count()

  • [1, 2, 3].count(4) 返回 0,因为 4 不在列表中。

3.17 集合操作 keys()-

  • x.keys() - y 返回 {2},从字典 x 的键中移除 y 中存在的键。

3.18 dict.values() 不支持 - 操作

  • x.values() - y 会报错,因为 dict.values() 返回的是视图,不支持集合操作。

3.19 列表方法返回值

  • .pop().index() 返回非空值。

3.21 列表方法返回值

  • .insert().clear().extend() 返回 None.count() 返回整数。

3.22 列表方法与内存首地址

  • .sort().pop().index().reverse() 不影响列表的内存首地址。

3.25 列表方法返回 None

  • insert()remove()append() 返回 None

3.26 整数下标访问

  • 列表、元组和字符串支持整数下标访问。

3.27 下标运算

  • 列表、元组、字符串和字典(通过键)支持下标运算。

3.28 随机整数统计

  • 使用列表统计 random 生成的随机整数出现次数。

3.29 列表切片

  • 使用切片获取用户指定下标范围内的子列表。

3.30 字典操作

  • 检查用户输入的键是否存在于字典中,并相应输出值或提示信息。

3.31 列表排序

  • 生成随机数列表,并对列表的不同部分进行升序和降序排序。

3.32 列表操作性能

  • 尾部进行元素增加与删除操作比头部或中间更高效。

4.程序控制结构

4.2 zip()enumerate()

  • zip((1,2,3), [4,5]) 结合两个序列为一个迭代器,产出元组 (1, 4)(2, 5)
  • enumerate(...) 为迭代器中的每个元素添加索引,形成 (index, (f, s))
  • for 循环遍历,print(f, end=',') 打印 f 值,用逗号作分隔。

4.4 寻找素数

  • 使用 range(100, 1, -1) 从100递减至2。
  • 内层 for 循环检查 n 是否能被从2到 n-1 的任何数整除。
  • 使用 elsebreak 结合,找到素数 97

4.6 布尔上下文中的等价性

  • 3+5{3}-3 在布尔上下文中等价于 True
  • [] 为空集合,在布尔上下文中等价于 False

4.10 逻辑运算符 or 的短路求值特性

  • or 从左至右评估表达式。
  • 遇到第一个 True 表达式即停止求值。
  • 可用于避免错误和提高效率。

4.11 判断闰年

  • 输入年份,检查是否能被400整除,或被4整除且不被100整除。

4.12 删除列表中的所有奇数

  • 生成随机整数列表,从末尾开始向前遍历,移除奇数。

4.13 对列表中偶数下标元素降序排列

  • 生成随机整数列表,降序排列偶数下标元素。

4.14 因式分解

  • 输入小于1880的整数,找出所有因数并输出乘积形式。

4.15 计算180以内所有奇数的和

  • 方法一:直接迭代求和。
  • 方法二:使用数学公式 n/2 * (first_odd + last_odd)
  • 方法三:列表推导式生成奇数列表,用 sum() 求和。

4.16 输出由1、2、3、4组成的所有素数

  • 生成排列组合,检查每个排列是否为素数。

5.函数

5.2 函数返回值

  • 如果函数中没有return语句或return不带值,返回值默认为None

5.7 列表参数修改

  • 在函数中修改列表参数会直接影响原列表。

5.8 参数默认值

  • 参数默认值在函数定义时确定,之后不会改变。

5.11 mapoperator模块

  • map函数将给定函数应用于序列的每个元素。
  • operator.eq用于比较两个值是否相等。

5.14 生成器函数

  • 使用yield关键字定义生成器函数。
  • 生成器函数在遇到yield时产生值并挂起,直到下一次迭代。

5.16 拉姆达表达式

  • 一行代码定义函数,适用于简短或一次性函数实现。

5.17 functools.reduceoperator.or_

  • reduce函数将二元函数累积应用于序列,得到单一结果。
  • or_函数用于集合的合并。

5.18 functools.reduceoperator.and_

  • 使用and_函数进行集合交集操作。

5.19 可变参数

  • 使用*p收集多余位置参数到元组。

5.22 类型注解

  • 类型注解不会影响Python运行时行为,主要用于IDE提示和静态类型检查。

5.23 全局变量

  • 使用global关键字声明函数内部的全局变量。

5.25 函数定义

  • 函数定义可以用deflambda或类定义。

5.26 函数参数

  • 参数按值传递,可变对象的修改会影响原对象。

5.27 变量作用域

  • 在函数内声明局部变量会遮蔽外部全局变量。

5.28 生成器函数

  • 生成器函数的调用结果是一个生成器对象,用于迭代产生值。

5.29 关键字参数

  • 使用关键字参数调用函数时,不需要记住参数顺序。

5.35 lambda匿名函数

  • 通过变量名引用lambda创建的匿名函数。

5.39 自定义sum函数

  • 使用maxsum实现自定义求和和最大值函数。

5.40 自定义sorted函数

  • 模拟内置sorted函数,返回排序后的列表。

5.41 自定义reversed函数

  • 模拟内置reversed函数,返回逆序列表的迭代器。

5.42 切片操作

  • 使用切片[::-1]实现序列的逆序。

6.面向对象程序设计

1. 面向对象三要素

  • 封装:隐藏对象的内部状态和实现细节。
  • 继承:允许新创建的类继承现有类的属性和方法。
  • 多态:允许不同类的对象对同一消息做出响应,但具体行为会有所不同。

2. Python中的双星号(**)和单星号(*)用法

2.1 解包操作

2.1.1 双星号(**)
  • 字典解包:将字典转换为关键字参数。

    my_func(**my_dict)
    
  • 关键字参数解包:将关键字参数转换为字典。

    print_kwargs(**kwargs)
    
2.1.2 单星号(*)
  • 序列解包:将序列转换为位置参数。

    func(*args)
    

2.2 特殊方法名

  • __pow__:对应幂运算(使用双星号**)。
  • __floordiv__:对应地板除(使用//)。

3. 强行改变类的私有成员

通过名称改写访问或修改私有成员。

obj._ClassName__private_attr

4. 类的构造方法 __init__

  • Python 中构造方法名为 __init__
  • 创建类的新实例时自动调用。
  • 可以调用父类的构造方法以确保正确初始化。

5~10 特殊方法与运算符

特殊方法运算符英文含义
__contains__incontains
__mul__*multiply
__eq__==equal
__gt__>greater than
__ne__!=not equal
__ge__>=greater or equal

13 代码结果解释

展示了私有方法的名称改写和方法解析顺序。

15~17 重写特殊方法支持内置函数

实现特殊方法可以让类的对象支持内置函数。

18~20 实例成员方法、类方法和静态方法

  • 实例成员方法:依赖实例状态,通过 self 访问。
  • 类方法:操作类状态,通过 cls 访问,使用 @classmethod
  • 静态方法:完全独立,不涉及类或实例状态,使用 @staticmethod

21 __call__ 方法

允许类的实例像函数那样被调用。

22~24 私有成员和继承

  • 双下划线开头的成员名会进行名称改写,但仍然可以访问。
  • Python 不提供真正的私有成员访问控制。

25~26 构造方法继承

  • 派生类继承基类的构造方法,除非显式定义或调用。

27 实例方法的调用

实例方法的第一个参数 self 由 Python 在内部处理。

28 str.upper().upper()

两种方法调用 .upper() 的等价性。

29 生成器的 __next__ 方法

next() 函数等价,用于获取生成器的下一个值。

30 函数与方法的区别

方法与对象关联,通常接受 self 作为第一个参数;函数独立于类存在。

31 命名约定

  • 单下划线 _:保护变量,外部可访问但不应使用。
  • 双下划线 __:命名改编,减少名称冲突可能性。
  • 双下划线加下划线 ___:特殊方法,如 __init__

7.字符串

字符串操作习题整理

7.1 max() 函数与字符串比较

  • max(x) 在字符串列表中,根据字典顺序返回最大值。
  • 字符串数字比较基于字符编码而非数值。
  • 要比较数值,先转换字符串为数值类型。

7.2 max() 函数的 key 参数

  • key 参数指定一个函数,用于从元素中提取比较值。
  • max(x, key=len) 基于字符串长度确定最大值。

7.3 格式化字符串字面量

  • '{:c}'.format(65) 格式化整数为字符,输出 ‘A’。
  • str(65) 将整数转换为字符串,输出 ‘65’。

7.4 字符串 expandtabs() 方法

  • 将制表符转换为相应数量的空格。
  • 'abc\tdef'.expandtabs(8) 输出 'abc def'

7.5 字符串 ljust() 方法

  • 右侧填充空格至指定长度。
  • 'Hello world!'.ljust(20) 输出 'Hello world! '

7.6 字符串连接

  • 使用 + 连接字符串:'a' + 'b' 输出 'ab'

7.7 字符串编码长度

  • '字字字字字'.encode('utf-8') 长度为 15,每个中文字符占 3 个字节。

7.9 字符串连接与 len()

  • '::'.join(['a','b','c']) 输出 'a::b::c'
  • len('a::b::c') 的值为 7。

7.10 格式化字符串

  • '{:#<9d}'.format(666) 输出 666######

7.11 format() 方法

  • '{},{}'.format(3, 5) 输出 '3,5'

7.12 format() 方法的索引

  • '{1},{0}'.format(3, 5) 输出 '5,3'

7.13 index() 方法错误用法

  • 'Beautiful is better than ugly.'.index('beautiful') 会抛出 ValueError

7.14 split() 方法与空字符串

  • 'a,,b'.split(',') 输出 ['a', '', 'b']
  • len('a,,b'.split(',')) 的值为 3。

7.15 split() 方法默认分隔符

  • 'a\t\t\tb'.split() 输出 ['a', 'b']
  • len('a\t\t\tb'.split()) 的值为 2。

7.16 upper() 方法对数字

  • '1234'.upper() 输出 '1234'

7.17 rindex() 方法

  • 'ababababa'.rindex('aba') 返回最后一次出现的索引,值为 6。

7.18 count() 方法

  • 'ababababa'.count('aba') 计算非重叠出现次数,值为 2。

7.19 格式化字符串索引

  • '{:->5.4s}'.format('abcdefg')[0] 输出第一个字符 '-'

7.20 translate() 方法

  • table=.maketrans('abc','ABC') 将小写转换为大写。
  • 'dong fuguo'.translate(table) 的结果为 'dong fuguo'

9.文件内容操作

python-docx 库使用笔记

创建和编辑Word文档

python-docx 是一个Python库,它允许用户创建和编辑Word文档(.docx格式)。

安装

pip install python-docx

示例代码

from docx import Document
from docx.shared import Inches

# 创建Word文档
document = Document()

# 添加标题和段落
document.add_heading('Document Title', 0)
p = document.add_paragraph('A plain paragraph having some ')
p.add_run('bold').bold = True
p.add_run(' and some ')
p.add_run('italic.').italic = True

# 添加不同级别的标题
document.add_heading('Heading, level 1', level=1)
document.add_paragraph('Intense quote', style='Intense Quote')

# 添加列表
document.add_paragraph('first item in unordered list', style='List Bullet')
document.add_paragraph('first item in ordered list', style='List Number')

# 添加图片
document.add_picture('monty-truth.png', width=Inches(1.25))

# 添加表格
records = (
    (3, '101', 'Spam'),
    (7, '422', 'Eggs'),
    (4, '631', 'Spam, spam, eggs, and spam')
)
table = document.add_table(rows=1, cols=3)
hdr_cells = table.rows[0].cells
hdr_cells[0].text = 'Qty'
hdr_cells[1].text = 'Id'
hdr_cells[2].text = 'Desc'
for qty, id, desc in records:
    row_cells = table.add_row().cells
    row_cells[0].text = str(qty)
    row_cells[1].text = id
    row_cells[2].text = desc

# 添加分页符
document.add_page_break()

# 保存文档
document.save('demo.docx')

功能

  • 创建新的Word文档。
  • 向文档中添加标题、段落、列表、图片和表格。
  • 设置文本格式,如加粗和斜体。
  • 调整图片大小。
  • 创建表格并填充数据。
  • 插入分页符。
  • 保存文档到硬盘。

注意事项

  • python-docx 不依赖于Microsoft Word应用程序。
  • 可以对现有文档进行读取和修改,也可以创建全新的文档。

10 文件和文件夹操作

Python osos.path 模块笔记

文件和目录操作
  • `os.listdir(pa
  • th)`: 列出指定文件夹中的文件和子文件夹,返回名称列表。
  • os.mkdir(path): 创建一个新目录,如果已存在则抛出异常。
  • os.path.exists(path): 检查指定文件或目录是否存在。
  • os.path.isfile(path): 检查指定路径是否为文件。
  • os.path.isdir(path): 检查指定路径是否为目录。
  • os.path.splitext(path): 分割文件路径,返回(文件名,扩展名)元组。
路径操作
  • os.path.join(path, *paths): 连接多个路径组件,返回组合后的路径字符串。
  • os.path.abspath(path): 返回路径的绝对路径。
  • os.path.getsize(path): 返回指定文件的大小,单位为字节。
  • os.remove(path): 删除指定的文件,如果文件只读则抛出异常。
  • os.rmdir(path): 删除空目录,如果目录非空则抛出异常。
  • os.walk(top, topdown=True, onerror=None, followlinks=False): 遍历目录树,返回每个目录的路径、子目录列表和文件列表。
当前工作目录操作
  • os.chdir(path): 修改当前工作目录到指定路径。
  • os.getcwd(): 获取当前工作目录的完整路径。
文件重命名和移动
  • os.rename(src, dst): 重命名文件或目录,也可以在同一文件系统中移动文件。
高级文件操作
  • shutil.move(src, dst): 移动文件或目录,可以跨文件系统或磁盘分区。
环境变量
  • os.getenv(key, default=None): 获取环境变量的值,如果不存在则返回默认值。
用户目录
  • os.path.expanduser(~): 展开用户主目录的简写 ~ 为完整路径。
文件搜索
  • 用户可以输入文件夹路径和文件名,使用 os.walk() 搜索文件夹及其子文件夹中是否存在该文件。
注意事项
  • os.listdir() 返回的是文件和文件夹的名称列表,不是完整路径。
  • os.remove() 不能删除带有只读属性的文件,需要先更改权限。
  • os.mkdir() 如果尝试创建已存在的目录,会抛出 FileExistsError
  • os.startfile() 是 Windows 特有的,用于打开文件关联的应用程序。
  • os.walk() 可以遍历指定目录及其所有子目录,返回三元组 (dirpath, dirnames, filenames)
  • shutil.move() 可以先复制再删除以实现跨分区移动。

11.异常处理结构和单元测试

异常处理基础

1. 主动抛出异常
  • 使用 raise 语句可以主动抛出一个异常,通常在检测到错误条件时使用以中断程序流程。
    if some_condition:
        raise ValueError("An error occurred")
    
2. try...except 结构中的 else 子句
  • else 块仅在 try 块中没有抛出任何异常时执行。
    try:
        # 尝试执行的代码
    except:
        # 异常处理代码
    else:
        # 如果没有异常发生,执行这里的代码
    
3. try...except 结构中的 except 子句
  • except 子句用于捕获 try 块中可能出现的特定类型的异常。
    try:
        # 尝试执行的代码
    except SomeException:
        # 处理 SomeException 异常的代码
    
4. finally 子句
  • finally 块中的代码无论是否发生异常都会执行,常用于执行清理工作。
    try:
        # 尝试执行的代码
    except:
        # 异常处理代码
    finally:
        # 无论是否发生异常,都会执行这里的代码
    
5. 断言(assert
  • assert 用于设置检查点,确保某个条件为真。如果条件为假,则引发 AssertionError
    assert 3 == 3, "3 does not equal 3"
    

异常与错误的区别

错误(Error)
  • 指程序无法自行解决的问题,通常需要开发者介入。
    • 编译时错误:语法错误或违反编程语言规则导致。
    • 运行时错误:程序执行过程中发生,如非法索引、除以零等。
异常(Exception)
  • 程序运行时的特殊事件,代表非正常控制流条件。
    • 抛出(Raise):检测到异常条件时使用。
    • 捕获(Catch):通过 try...except 块处理。
    • 传播(Propagate):未被捕获的异常会向上传播。

常见异常类型

1. ZeroDivisionError
  • 尝试除以零时引发。
2. TypeError
  • 进行类型不兼容的操作时引发,如字符串与整数相加。
3. ValueError
  • 传入不合法的值给某些函数时引发,如 int('3.14')
4. FileNotFoundError
  • 尝试打开不存在的文件时引发。

特殊情况下的异常处理

1. 生成器异常处理
  • 使用 StopIteration 异常处理生成器中的异常情况。
2. 断言禁用
  • 通过 -O 选项或 dis 模块禁用断言。
3. 表达式错误
  • 3(4+5) 试图调用整数作为函数,引发 TypeError
4. 列表和元组操作
  • 列表和元组不支持相互加法操作,如 [1] + (2, 3) 会引发 TypeError
5. assert 断言
  • 如果条件为真,assert 语句后的内容继续执行;否则,引发 AssertionError

总结

  • 错误是阻止程序正常执行的问题,需要外部干预。
  • 异常是程序运行时可处理的错误,提供了一种结构化的错误处理机制。
  • 通过 try...except...else...finally 结构,可以灵活地处理程序中的异常情况。

13.数据分析、科学计算与可视化

第13章版本1

1. NumPy 数组的 sum() 和元素乘法

  • 表达式 sum(x*2) 计算数组 x 每个元素乘以 2 后的总和。
  • 示例中 x[1, 2, 3, 4, 5],乘以 2 后得到 [2, 4, 6, 8, 10],总和为 30。

2. NumPy 的 random.randn().shape

  • np.random.randn(3) 生成一个形状为 (3,) 的一维数组,即有三个元素的数组。
  • 扩展:np.random.randn(3, 4) 生成一个形状为 (3, 4) 的二维数组,即有三行四列的矩阵。

3. NumPy 的 argmax() 函数

  • np.argmax(x) 返回数组 x 中最大元素的索引。
  • 在多维数组中,可以指定 axis 参数来找出特定轴上的最大值索引。
  • 示例:对于数组 x = [3, 5, 1, 4, 2]np.argmax(x) 返回 1,因为元素 5 是最大值,其索引为 1。

4. Pandas 的 sort_values() 方法

  • 用于根据一个或多个列的值对 DataFrame 进行排序。
  • 支持升序或降序排序,可以通过 ascending 参数指定。
  • inplace=True 时,排序操作会原地修改原始 DataFrame。

5. Pandas 的 describe() 方法

  • 自动计算数值型列的计数、平均值、标准差、最小值和最大值。

6. Pandas 的 head() 方法

  • 查看 DataFrame 的前几行,默认为前 5 行。
  • 可以通过 n 参数指定显示的行数。

7. Pandas 的 fillna() 方法和 inplace 参数

  • 用于填充 DataFrame 中的缺失值。
  • inplace=True 时,填充操作会原地修改原始 DataFrame。

8. Pandas 的 groupby() 方法

  • 允许根据一个或多个键对 DataFrame 进行分组。
  • 分组后的对象支持多种聚合方法,如 sum()mean()max() 等。

9. Pandas 的 plot() 方法

  • 用于绘制不同类型的图表,如折线图、柱状图、直方图等。
  • kind 参数用于指定图表的类型。

补充说明

  • reshape()resize() 是 NumPy 数组的方法,用于改变数组的形状。
    • reshape() 不改变元素个数,仅改变形状。
    • resize() 可以改变数组的元素个数,用 np.nan 填充或截断数组。

第13章版本2

13.1 NumPy 数组操作

  • 执行 import numpy as npx = np.array([1, 2, 3, 4, 5])
  • 表达式 sum(x * 2) 的结果为 30
  • 计算过程:[1, 2, 3, 4, 5] * 2 = [2, 4, 6, 8, 10],求和得到 30

13.3 NumPy 矩阵形状

  • 表达式 np.random.randn(3).shape 的值为 (3,),表示一个一行三列的矩阵
  • 扩展:一个三行四列的矩阵形状为 (3, 4)

13.6 NumPy argmax 函数

  • np.argmax(x) 用于找出数组 x 中最大元素的索引位置
  • 在多维数组中,默认返回第一个最大元素的索引
  • 语法:np.argmax(array, axis=None, out=None)
    • array: 输入数组
    • axis: 指定查找最大值的轴
    • out: 可选,用于存储结果的数组

示例代码

import numpy as np

# 一维数组示例
x = np.array([3, 5, 1, 4, 2])
index_of_max_value = np.argmax(x)  # 返回 1

# 多维数组示例
x = np.array([[1, 2], [3, 4]])
index_of_max_value_along_axis = np.argmax(x, axis=1)  # 返回 [1, 1]

13.7 Pandas sort_values() 方法

  • sort_values() 用于对 DataFrame 进行排序
  • 支持一个或多个列的排序,可选择升序或降序

关键参数

  • by: 用于排序的列名或列名列表
  • axis: 指定排序的轴,默认为 0(按列排序)
  • ascending: 指定排序方向,可为布尔值或布尔值列表
  • inplace: 是否在原始 DataFrame 上进行修改
  • kind: 指定排序算法类型

示例代码

import pandas as pd

# 创建 DataFrame
df = pd.DataFrame({
    'Name': ['John', 'Anna', 'Peter', 'Linda'],
    'Age': [45, 22, 36, 28],
    'Salary': [70000, 35000, 48000, 59000]
})

# 升序排序
df_sorted_by_age = df.sort_values(by='Age')

# 降序排序 Salary,升序排序 Age
df_sorted_by_salary_and_age = df.sort_values(by=['Salary', 'Age'], ascending=[False, True])

# 原地排序
df.sort_values(by='Age', inplace=True)

13.8 Pandas describe() 方法

  • 自动计算数值型列的统计数据:计数、平均值、标准差、最小值和最大值
  • 非数值列不产生描述性统计

13.9 Pandas head() 方法

  • 查看 DataFrame 的前几行,默认显示前 5 行

示例代码

import pandas as pd

# 创建 DataFrame
df = pd.DataFrame({
    'Column1': [1, 2, 3, 4, 5, 6],
    'Column2': ['A', 'B', 'C', 'D', 'E', 'F']
})

# 查看前 5 行
print(df.head())

# 查看前 3 行
print(df.head(3))

13.18 Pandas fillna() 方法

  • 填充 DataFrame 中的缺失值
  • inplace 参数决定是否在原始 DataFrame 上修改

示例代码

import pandas as pd

# 创建包含缺失值的 DataFrame
df = pd.DataFrame({
    'A': [1, 2, None, 4],
    'B': [None, 2, 3, 4]
})

# 原地填充缺失值为 0
df.fillna(value=0, inplace=True)

13.11 Pandas groupby() 方法

  • DataFrame 进行分组操作
  • 分组后可执行聚合计算,如 sum()mean()

示例代码

import pandas as pd

# 创建 DataFrame
df = pd.DataFrame({
    'Employee': ['John', 'Anna', 'Peter', 'Linda'],
    'Department': ['A', 'A', 'B', 'B'],
    'Sales': [200, 380, 150, 210]
})

# 按部门分组计算平均销售额
grouped_by_department = df.groupby('Department')
average_sales_by_department = grouped_by_department['Sales'].mean()

# 执行多个聚合操作
agg_operations = grouped_by_department.agg({
    'Sales': ['mean', 'sum', 'max']
})

13.12 Pandas plot() 方法

  • 绘制图形进行可视化
  • kind 参数指定图形类型,如 'line''bar''hist'

示例代码

import pandas as pd

# 创建 DataFrame
df = pd.DataFrame({
    'Date': pd.date_range(start='2021-01-01', periods=5, freq='D'),
    'Sales': [230, 410, 350, 280, 390]
})

# 绘制折线图
df.plot(kind='line', x='Date', y='Sales')

# 绘制柱状图
df.plot(kind='bar', x='Date', y='Sales')

注意事项

  • 确保安装了 matplotlib 库以使用 plot() 方法
  • plot() 方法接受多个参数,如 xyfigsize
  • 通过 matplotlib 的 API 可以进一步定制图形

END

  • 38
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_千思_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值