day21:Python常用模块之time、datetime、random、os、sys

【参考链接】:https://www.cnblogs.com/linhaifeng/articles/6384466.html

1.time模块

import time

1.1 时间戳

时间戳(timestamp):时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。

import time

time_stamp = time.time()
print(f'时间戳:{time_stamp}', f'==>类型为{type(time_stamp)}')
#输出:时间戳:1725410334.5460565 ==>类型为<class 'float'>

1.2 格式化时间

格式化的时间字符串(formatstring):格式化时间表示的是普通的字符串格式的时间。

format_time = time.strftime("%Y-%m-%d %H:%M:%S")   # 输出:2024-09-04 08:43:45
format_time1 = time.strftime("%Y-%m-%d %H:%M:%s")  # 输出:2024-09-04 08:43:1725410625
format_time2 = time.strftime("%Y-%m-%d %X")        # 输出:2024-09-04 08:43:45

1.3 结构化时间

结构化的时间(struct time):struct_time元组共有9个元素共九个元素,分别为(年,月,日,时,分,秒,一年中第几周,一年中第几天,夏令时)

'''本地时间,中国为东八区时间'''
print('本地时区的struct_time:\n{}'.format(time.localtime()))

'''世界标准时间,0时区'''
print('UTC时区的struct_time:\n{}'.format(time.gmtime()))

#注意:从输出结果来看,东八区的时间比0时区的时间晚8小时(见:tm_hour)
本地时区的struct_time:
time.struct_time(tm_year=2024, tm_mon=9, tm_mday=4, tm_hour=8, tm_min=47, tm_sec=49, tm_wday=2, tm_yday=248, tm_isdst=0)

UTC时区的struct_time:
time.struct_time(tm_year=2024, tm_mon=9, tm_mday=4, tm_hour=0, tm_min=47, tm_sec=49, tm_wday=2, tm_yday=248, tm_isdst=0)

1.3.1 结构化时间的基准时间

print(time.localtime(0))

输出:time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=8, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)

1.3.2 结构化时间的基准时间上增加一年时间

print(time.localtime(365*24*3600))

输出:time.struct_time(tm_year=1971, tm_mon=1, tm_mday=1, tm_hour=8, tm_min=0, tm_sec=0, tm_wday=4, tm_yday=1, tm_isdst=0

1.4 不同格式时间的转换


如上图所示,我们总能通过某些方法在结构化时间-格式化时间-时间戳三者之间进行转换,下面我们将用代码展示如何通过这些方法转换时间格式

'''案例1:结构化时间==>时间戳和格式化时间'''

#结构化时间
now_time = time.localtime()
print(now_time)  # time.struct_time(tm_year=2024, tm_mon=9, tm_mday=4, tm_hour=9, tm_min=5, tm_sec=1, tm_wday=2, tm_yday=248, tm_isdst=0)

#把结构化时间转换为时间戳格式
time_stamp = time.mktime(now_time)
print(time_stamp)  # 1725411982.0

#把结构化时间转换为格式化时间
#%Y年-%m月-%d天 %X时分秒=%H时:%M分:%S秒
time_strf = time.strftime("%Y-%m-%d %X", now_time)
print(time_strf)  # 2024-09-04 09:08:26
'''案例2:
        1.1 将格式化时间转为结构化时间
        1.2 将格式化时间转为"‘sun Jun 20 23:21:05 1993"这种形式的时间格式
'''

# 把格式化时间转化为结构化时间,和strftime()是逆操作
print(time.strptime(time_strf, "%Y-%m-%d %X"))   # time.struct_time(tm_year=2024, tm_mon=9, tm_mday=4, tm_hour=9, tm_min=16, tm_sec=0, tm_wday=2, tm_yday=248, tm_isdst=-1)
print(type(time.strptime(time_strf, "%Y-%m-%d %X"))) # <class 'time.struct_time'>

# 把结构化时间表示为这种形式:'sun Jun 20 23:21:05 1993'
print(f'::::time.asctime():::::==>{time.asctime()}')  # Wed Sep  4 09:19:20 2024

# 如果参数没给或为None时,将会默认time.time()为参数。它的作用相当于time.asctime(time.localtime(secs))
print(f':::::::time.ctime()::::==>{time.ctime()}')
print(f'time.ctime(time.time())==>{time.ctime(time.time())}')
1 # 其他用法
2 # sleep(secs)
3 # 线程推迟指定的时间运行,单位为秒。

2.datetime

import datetime
import time

#1.返回当前时间
print(datetime.datetime.now())
#2.将时间戳直接转化成日期格式
print(datetime.date.fromtimestamp(time.time()))
#3.当前时间基础上加10天
print(datetime.datetime.now()+datetime.timedelta(10))
#4.当前时间基础上减3天
print(datetime.datetime.now()+datetime.timedelta(-3))
#5.当前时间基础上加1小时
print(datetime.datetime.now()+datetime.timedelta(hours=1))
#6.当前时间基础上加30分钟
print(datetime.datetime.now()+datetime.timedelta(minutes=30))

print('='*50)
#7.将时间的某一年(或月、日、时、分、秒等)进行替换
c_time =datetime.datetime.now()
print(c_time)
print(c_time.replace(year=2018))

>输出结果:
2024-09-06 09:32:24.676974
2024-09-06
2024-09-16 09:32:24.676998
2024-09-03 09:32:24.677003
2024-09-06 10:32:24.677007
2024-09-06 10:02:24.677012
==================================================
2024-09-06 09:32:24.677017
2018-09-06 09:32:24.677017

3.random模块

import random

print(random.random())        #随机生成大于0且小于1之间的小数  <class 'float'>

print(random.randint(1,3))   # random.randint(a, b)函数用于生成一个在 a 和 b 之间的随机整数,包括 a 和 b。

print(random.randrange(1,3)) # 随机生成 大于等于1且小于3之间的整数

print(random.choice([11, 'aaa', [666, 888]])) # 随机输出 11或'aaa'或'[666,88]'

print(random.sample([11, 22, 'aaa','bbb', [666,888]],2))  #列表元素任意2个组合
print(random.sample([11, 22, 'aaa','bbb', [666,888]],3))  #列表元素任意3个组合
print(random.sample([11, 22, 'aaa','bbb', [666,888]],4))  #列表元素任意4个组合

print(random.uniform(1,6)) # 随机生成:大于1小于3的小数,如3.4509038976731077

# 打乱item的顺序,相当于"洗牌"
item = [1,2,3,4,5,6]
res = random.shuffle(item)
print(res)  # 打印:None
print(item) # 打印乱序的item列表,如 [2, 3, 4, 1, 5, 6]

案例:生成随机验证码

# ASCLL码:65~90代表26个大写英文字幕,97~122代表26个小写字幕
# chr() 是一个内置函数,它用于将一个整数转换为对应的 Unicode

import random

def make_code(n):
    res = ''
    for i in range(n):
        s1 = chr(random.randint(65, 90))
        s2 = str(random.randint(0, 9))
        s3 = chr(random.randint(97,122))
        res += random.choice([s1, s2, s3])
    return res

print(make_code(6)) # 随机生成6位数的验证码,在26个大写字母、26个小写字母、0-9中随机组合

4.os模块

os模块:是与操作系统交互的一个接口

常用部分:

print("当前 Python 脚本的目录是:", os.path.dirname(__file__))

# 推荐用这种::
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
import os

1、os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
2、os.chdir("dirname")  改变当前脚本工作目录;相当于shell下cd
3、os.curdir  返回当前目录: ('.')
4、os.pardir  获取当前目录的父目录字符串名:('..')
5、os.makedirs('dirname1/dirname2')    可生成多层递归目录
6、os.removedirs('dirname1')    若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
7、os.mkdir('dirname')    生成单级目录;相当于shell中mkdir dirname
8、os.rmdir('dirname')    删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
9、os.listdir('dirname')    列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
10、os.remove()  删除一个文件
11、os.rename("oldname","newname")  重命名文件/目录
12、os.stat('path/filename')  获取文件/目录信息
13、os.sep    输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
14、os.linesep    输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"
15、os.pathsep    输出用于分割文件路径的字符串 win下为;,Linux下为:
16、os.name    输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
17、os.system("bash command")  运行shell命令,直接显示
18、os.environ  获取系统环境变量
19、os.path.abspath(path)  返回path规范化的绝对路径
20、os.path.split(path)  将path分割成目录和文件名二元组返回
21、os.path.dirname(path)  返回path的目录。其实就是os.path.split(path)的第一个元素
22、os.path.basename(path)  返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素
23、os.path.exists(path)  如果path存在,返回True;如果path不存在,返回False
24、os.path.isabs(path)  如果path是绝对路径,返回True
25、os.path.isfile(path)  如果path是一个存在的文件,返回True。否则返回False
26、os.path.isdir(path)  如果path是一个存在的目录,则返回True。否则返回False
27、os.path.join(path1[, path2[, ...]])  将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
28、os.path.getatime(path)  返回path所指向的文件或者目录的最后存取时间
29、os.path.getmtime(path)  返回path所指向的文件或者目录的最后修改时间
30、os.path.getsize(path) 返回path的大小
'''案例1:os.getcwd() 获取当前工作目录'''
print(os.getcwd())  # D:\my_python_project\day22

'''案例2:  os.chdir()改变工作目录'''
# 改变当前工作目录,随后在新目录下创建一个文件夹aaa
os.chdir(r'D:\my_python_project\tests\temp')
os.mkdir('aaa')  # 在D:\my_python_project\tests\temp目录下创建了一个文件夹aaa

'''案例3:os.curdir返回当前目录'''
# 打印当前工作目录
print("当前工作目录:", os.getcwd()) # 当前工作目录: D:\my_python_project\tests\day22
# 切换到当前目录的子目录
os.chdir(os.curdir + r'/a1')
# 再次打印当前工作目录
print("当前工作目录:", os.getcwd())  # 当前工作目录: D:\my_python_project\tests\day22\a1

'''案例4:os.pardir获取当前目录的父目录字符串名('..')'''
# 打印当前工作目录
print("当前工作目录:", os.getcwd())  # D:\my_python_project\tests\day22
# 切换到当前目录的父目录
os.chdir(os.pardir)
# 再次打印当前工作目录
print("当前工作目录:", os.getcwd()) # D:\my_python_project\tests

'''案例5:可生成多层递归目录'''
# 创建一个目录
os.makedirs(r'D:\my_python_project\test\day22\subdirectory')
# 再次创建同一个目录,但设置 exist_ok=True
os.makedirs(r'D:\my_python_project\test\day22\subdirectory', exist_ok=True)

'''案例6:os.removedirs() 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推'''
os.removedirs(r'D:\my_python_project\tests\day22\a1\a2\a3') # 如果a3、a2、a1目录均为空,直接删除a1目录
                                                            # 如果a2目录不为空,仅删除a3目录
                                                                
'''案例7:os.mkdir('dirname') 生成单级目录'''
os.mkdir(r'D:\my_python_project\tests\day22\a1')  # day22下创建a1目录

'''案例8:os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错'''
os.removedirs(r'D:\my_python_project\tests\day22\a1\a2\a3')  # 仅删除a3目录

'''案例9:os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印'''
#前置条件:目录为'D:\my_python_project\tests\day22\a1\a2\a3,且a1、a2、a3均为空文件夹
res = os.listdir(r'D:\my_python_project\tests\day22')
print(res, type(res))   # ['a1', 'os模块.py'] <class 'list'>

'''案例10: 删除一个文件,删除1.py'''
os.remove(r'D:\my_python_project\tests\day22\1.py')

'''案例11:os.rename("oldname","newname")  重命名文件/目录'''
os.rename(r'D:\tests\day22\a1', r'D:\tests\day22\a111') # 将未使用的a1目录名更改为a111名

'''案例12:os.stat('path/filename')  获取文件/目录信息'''
print(os.stat(r'D:\my_python_project\test\os_test.py'))
#打印:os.stat_result(st_mode=33206, st_ino=5348024557513797, st_dev=4036880606, st_nlink=1, st_uid=0, st_gid=0, st_size=319, st_atime=1725698699, st_mtime=1725698696, st_ctime=1725698407)

'''案例13:os.sep 输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"'''
print(os.sep) # \

'''案例14:os.linesep  输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"'''
# 打印当前操作系统的换行符
print("当前操作系统的换行符是:", os.linesep)   #windows python10运行无输出结果?why??
# 写入文件时使用换行符
with open("example.txt", "w") as file:
    file.write("第一行" + os.linesep + "第二行")  

'''案例15:os.pathsep 输出用于分割文件路径的字符串 win下为;,Linux下为:'''
print("当前操作系统的路径分隔符是:", os.pathsep)
# 分割路径字符串
paths = "path1" + os.pathsep + "path2" + os.pathsep + "path3"
print("分割后的路径列表:", paths.split(os.pathsep))

'''案例16:os.name  输出字符串指示当前使用平台。win->'nt'; Linux->'posix''''
# 打印当前操作系统的名称
print("当前操作系统的名称是:", os.name)
# 根据操作系统执行不同的操作
if os.name == 'nt':
    print("这是一个 Windows 系统")
elif os.name == 'posix':
    print("这是一个 Unix 或 Linux 系统")

'''案例17:os.system("bash command")  运行shell命令,直接显示''''
os.system("ls -l")

'''案例18:os.environ 获取系统环境变量,get()获取某个环境变量,os.environ['xx']设置某个环境变量 ''''
print(os.environ)
# 获取环境变量的值
home_dir = os.environ.get('HOME')
print("HOME 环境变量的值是:", home_dir)
#设置环境变量的值
os.environ['MY_VAR'] = 'my_value'
print("MY_VAR 环境变量的值是:", os.environ['MY_VAR'])

'''案例19:os.path.abspath(path)  返回path规范化的绝对路径''''
# 获取一个相对路径的绝对路径
relative_path = "example.txt"
absolute_path = os.path.abspath(relative_path)
print("相对路径的绝对路径是:", absolute_path)

'''案例20:os.path.split(path)  将path分割成目录和文件名二元组返回'''
path = "/home/user/example.txt"
directory, filename = os.path.split(path)
print("目录是:", directory)   # 打印:/home/user
print("文件名是:", filename)  # 打印:example.txt

'''案例21:os.path.dirname(path)  返回path的目录。其实就是os.path.split(path)的第一个元素'''
# 获取一个文件的目录
path = "/home/user/example.txt"
directory = os.path.dirname(path)
print("文件的目录是:", directory)  # /home/user
# 获取一个目录的父目录
path = "/home/user"
directory = os.path.dirname(path)
print("目录的父目录是:", directory) #  /home

'''案例22:os.path.basename(path) 如果 path 是一个文件名,os.path.basename(path) 会返回该文件名;如果 path 是一个目录名,os.path.basename(path) 会返回该目录的最后一部分。'''
# 获取一个文件的文件名
path = "/home/user/example.txt"
filename = os.path.basename(path)
print("文件的文件名是:", filename)
# 获取一个目录的最后一部分
path = "/home/user"
filename = os.path.basename(path)
print("目录的最后一部分是:", filename)

'''案例23:它用于检查 path 参数指定的文件或目录是否存在。如果 path 存在,os.path.exists(path) 会返回 True;如果 path 不存在,os.path.exists(path) 会返回 False。'''
# 检查一个文件是否存在
path = "/home/user/example.txt"
if os.path.exists(path):
    print("文件存在")
else:
    print("文件不存在")
# 检查一个目录是否存在
path = "/home/user"
if os.path.exists(path):
    print("目录存在")
else:
    print("目录不存在")

'''案例24:os.path.isabs(path)  如果path是绝对路径,返回True'''
# 检查一个路径是否是绝对路径
print("path1 是绝对路径:", os.path.isabs( "/home/user/example.txt")) # True
print("path2 是绝对路径:", os.path.isabs("example.txt"))             # False

'''案例25:os.path.isfile(path)  如果path是一个存在的文件,返回True。否则返回False'''
# 检查一个路径是否是一个存在的文件
path1 = "/home/user/example.txt"
path2 = "/home/user"
print("path1 是一个存在的文件:", os.path.isfile(path1))
print("path2 是一个存在的文件:", os.path.isfile(path2))

'''案例26:如果 path 是一个存在的目录,os.path.isdir(path) 会返回 True;如果 path 不是一个存在的目录,os.path.isdir(path) 会返回 False'''
# 检查一个路径是否是一个存在的目录
path1 = "/home/user"
path2 = "/home/user/example.txt"
print("path1 是一个存在的目录:", os.path.isdir(path1))
print("path2 是一个存在的目录:", os.path.isdir(path2))

'''案例27:os.path.join(path1[, path2[, ...]]),它用于将多个路径组合成一个完整的路径。os.path.join() 函数会根据操作系统的规则来处理路径分隔符'''
# 组合多个路径
path = os.path.join("/home", "user", "example.txt")
print("组合后的路径是:", path)

'''案例28:它用于返回 path 参数所指向的文件或目录的最后访问时间。返回值是一个浮点数,表示从纪元(1970年1月1日00:00:00)到指定时间的秒数。'''
# 获取一个文件的最后访问时间
print(os.path.getatime(r'D:\my_python_project\tests\day20\xx.py'))
# 获取一个文件夹的最后访问时间
print(os.path.getatime(r'D:\my_python_project\tests\day20'))

'''案例29:它用于返回 path 参数所指向的文件或目录的最后修改时间。返回值是一个浮点数,表示从纪元(1970年1月1日00:00:00)到指定时间的秒数。'''
os.path.getmtime(r'/home/user/example.txt')
os.path.getmtime(r'/home/user)

'''案例30:os.path.getsize(path) 只能获取文件的大小'''
print(os.path.getsize(r"/home/user/temp.txt"))

5.sys模块

1、sys.argv        命令行参数List,第一个元素是程序本身路径
2、sys.exit(n)     退出程序,正常退出时exit(0);n 是一个可选的整数参数,如果省略 n,则默认为 0
3、sys.version     获取Python解释程序的版本信息
4、sys.maxsize     它表示Python整型能表示的最大值
5、sys.path        返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
6、sys.platform    返回操作系统平台名称
'''案例1:sys.argv的用法'''
sys.argv 的详细解释:
sys.argv[0]:脚本的名称。
sys.argv[1]:第一个命令行参数。
sys.argv[2]:第二个命令行参数。
以此类推...

例如,如果你有一个名为 script.py 的 Python 脚本,并且你通过命令行运行它,如下所示
>python script.py arg1 arg2 arg3
那么在 script.py 中,sys.argv 将包含以下内容:
>['script.py', 'arg1', 'arg2', 'arg3']==>即sys.argv[0]=script.py

#sys模块.py文件代码如下,在终端运行:python .\sys模块.py aaaaa bbbbbb
print(sys.argv)    # 得到一个列表:['D:\\my_python_project\\sys模块.py']
print("sys.argv[0]:",sys.argv[0]) # 取索引为0的值
print("sys.argv[0]:",sys.argv[1])
print("sys.argv[1]:",sys.argv[2])
>>输出如下:
['.\\sys模块.py', 'aaaaa', 'bbbbbb']
sys.argv[0]: .\sys模块.py
sys.argv[0]: aaaaa
sys.argv[1]: bbbbbb

'''案例2:ssys.exit(n)的用法'''
# 正常退出
sys.exit(0)
# 非正常退出,状态码为 1
sys.exit(1)

# sys.exit(n) 会引发 SystemExit 异常,如果你在程序中捕获了这个异常,可以执行一些清理工作,
但程序最终还是会退出。如果你没有捕获这个异常,程序会立即退出,并且不会执行后续的代码。
try:
    sys.exit(1)
except SystemExit as e:
    print(f"Program exited with status {e.code}")

'''案例3:sys.version用于获取当前 Python 解释器的版本信息'''
print(sys.version)
    
'''案例4:sys.maxsize表示 Python 整型能表示的最大值'''
print(sys.maxsize)

'''案例5:sys.path 是一个列表,用于存储模块的搜索路径。
   当你尝试导入一个模块时,Python 解释器会在 sys.path 列表中的路径下查找这个模块'''
print(sys.path)  # 打印sys.path的当前内容,通常包括当前目录、Python 安装目录以及一些环境变量指定的目录

# 添加一个新的路径
sys.path.append('/my/new/path')
# 现在导入模块时,Python 也会在'/my/new/path'这个路径下查找
import my_module

'''案例6:'''
print(sys.platform)
# Windows系统可能是'win32'或'win-amd64'(对于64位系统)等。
# inux系统,通常是'linux'。
# macOS系统,通常是'darwin'。

补充:enumerate

功能说明:用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,
      同时列出数据和数据下标,一般用在 for 循环当中。
      
enumerate() 函数的基本语法如下: enumerate(iterable, start=0)
'''案例'''

fruits = ['apple', 'banana', 'mango']

# 使用 enumerate() 函数
for i, fruit in enumerate(fruits):
    print(f"Index: {i}, Fruit: {fruit}")

#输出:
Index: 0, Fruit: apple
Index: 1, Fruit: banana
Index: 2, Fruit: mango

打印进度条

'''进度条的效果
[#             ]
[##            ]
[###           ]
[####          ]
'''

import sys
import time

'''知识储备'''
# %-15s:表示一个左对齐,最小宽度为15个字符
# #  %15s:表示一个右对齐,最小宽度为15个字符
print('[%15s]' %'#')     # 输出:[              #]
print('[%-15s]' %'#')    # 输出:[#              ]

#打印%
# %s 是一个占位符,表示一个字符串。在这个例子中,它将被替换为 100。
# %% 是一个特殊的占位符,表示一个字面的 % 字符。因为在格式化字符串中,% 是一个特殊的字符,用于引入占位符,所以如果你想在结果字符串中包含一个字面的 %,你需要使用 %%。
print('%s%%' %(100)) #第二个%号代表取消第一个%的特殊意义


'''案例1:模拟出进度条'''
for i in range(50):
    time.sleep(0.1)
    percent = (i+1) / 50
    res = int(50*percent) * '#'
    if percent >= 100:
        percent = 100
    #在Python中,\r是一个特殊的转义字符,表示回车(CarriageReturn)
    #需要注意的是,\r只会影响到光标的位置,它不会删除或替换光标后面的字符。如果你想在打印时覆盖整行,你需要在字符串的末尾添加 \r,然后立即打印新的内容。例如:
    print('\r[%-50s] %d%%' %(res,int(100*percent)), end='') # end='' 表示输出内容的末尾添加一个空字符串


'''案例2:打印下载时的进度条,将进度条封装成函数'''
def progress(percent, width=50):
    if percent >= 1:
        percent = 1
    time.sleep(0.1)
    res = int(width*percent)*'#'
    print('\r[%-50s] %d%%' %(res,int(100*percent)), end='')

date_size = 102222
recv_size = 0

while recv_size < date_size:
    time.sleep(0.01)
    recv_size += 1024
    percent = recv_size / date_size
    progress(percent, width=50)

'''3、疑点:如何将上述打印中的width -50 写活???'''
import time
import sys

def process(width):
    for i in range(width):
        time.sleep(0.1)
        percent = (i+1) / width
        res = int(width * percent) * '#'
        if percent >= 1:
            percent = 1
     # 关键写法如下,width不变=已打印的进度##  +  未打印的空部分''
        print('\r[%s%s] %d%%' % ('=' * int(width * percent), ' ' * (width - int(width * percent)), int(percent * 100)), end='')

process(50)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值