python基础

⦁ 一 基本元素 数字、字符串、变量
⦁ 官网编码规范:https://www.python.org/dev/peps/pep-0008/
⦁ 1 类似js 不用提前声明类型,使用type(变量) 获得真正的类型,数字只有int和float 没有double;
⦁ (1)字符串一般单引号,可字符串*整数复制字符串 ‘zsx’*3
⦁ 2. 变量名只能:大小写、数字和下划线,数字不可开头 ,一般用下划线,只有类名是驼峰:
⦁ module_name, package_name, ClassName, method_name, ExceptionName, function_name, GLOBAL_CONSTANT_NAME, global_var_name, instance_var_name, function_parameter_name, local_var_name

⦁ 3.四则运算
⦁ (1) / 执行浮点除法 //执行整数除法(余数截去同java),/若执行整数除法,则会得到浮点数 补.0
⦁ (2)所有的运算和赋值都可以简写成 /= *= … 同java,但是没有++ --这些
⦁ (3)百分号% 取模
⦁ 4. 进制表示 0b或者0B 表示2进制 0o或者0O表示八进制 0x表示十六进制,默认print会打印这些数字的十进制
⦁ eg: 0b01 -->1 0xff ->255
⦁ 5 类型转换
⦁ (1) flout转int,string转int 可使用int() 函数, bolean类型分别为True 1和False 0,其他转化规则与java相同
⦁ (2) python3中没有long类型,int类型可以存储任意大小整数,不存在溢出
⦁ (3)float()函数转化浮点数 str–>float
⦁ (4)str() 数值转字符,不同类型不可运算,字符和数值也不可,与java不同,需要转化,不会自动转化
⦁ (5) 整型和浮点型如果大小一样,则说相等的,都是数值,但是字符串不行
⦁ (6)在布尔判断时,0 ,0.00,‘’ 为False,其他为True 类似js
⦁ eg:>>> 78 == 78.0 True >>> 78 =='78' False
⦁ (7)未知类型则是None 比如打印没有返回值的函数,类似java中的null
⦁ 6. #是 注释
⦁ 二、控制流
⦁ 1. 布尔操作符 and not or
⦁ 2. 代码块
⦁ (1)表示一组代码行
⦁ (2)缩进增加,代码块开始,缩进减少到外围代码块的缩进时,代码块结束
⦁ ()采用: 冒号而非大括号 不同于java
⦁ 3. 循环
while与java相同, for 则使用 for i in range() range为迭代函数 range(0, 5, 2) [0,5) 步长2 range(5) [0,5) 步长默认1
4 导入模块
import 关键字, 多个 模块用逗号隔开
⦁ 三、函数
⦁ 1.def 不用写返回类型等 ,返回值直接用return
⦁ 2.print()函数 有可选的end和sep参数,end表示结束符默认是换行,sep是打印多个字符串的分隔符
⦁ 3.相同变量名在全局和局部都可共存,互不影响,但应该避免
⦁ 4. 在代码块中定义全局变量 使用global 关键字
⦁ 5. 异常处理 try 和 except
⦁ (1)内建异常体系:
⦁ https://blog.csdn.net/gavin_john/article/details/50738323
⦁ (2)异常捕获与java类似,父类异常可以捕获子类异常
⦁ 四 集合
⦁ 1. spam = [‘cat’, ‘bat’, 12, ‘elephant’] 内部不分类型, 数值 和字符串都可,下标从0开始,负数下标表示倒数第几个, -1表示最后一个, -2表示倒数第二个 …
⦁ 2. 切片spam[0:2] 前闭后开取 0和1 , len()求长,+连接,*复制,del spam[1] 删除
⦁ eg: name=‘zsx’ spam=spam+[name]
3. 迭代 for i in range(len(some_list)) 带下标i 或者 for item in list 不带下标
4 in 和 not in关键字 判断是否存在
5 解构赋值 v1,v2 ,v3,v4,v5 = spam 变量数目可列表数目长度严格相等
6 集合常用方法
(1) index(v) 返回下标 没有则报异常ValueError,重复则返回首次;
(2)append(v)追加 insert(index,v) 在index之前插入,
(3)del spam[index] 按照下标删除 spam.remove(v) 按照值删除,不存在则抛 ValueError
(4)sort()方法排序,不能对有字母和数字进行排序,否则TypeError,对字母的排序按照ascii码顺序
7 字符串可以看成是单个字符的集合,集合的很多操作都可以用在字符串上: index() 切片 for迭代 len() in/not in
eg: name = ‘qwer’ 切片 name[0:2]
8. 集合为可变类型 字符串则为不可变类型,所以字符串只能append和切片 ,构造新的字符串
9. 元组
(1)使用()代替集合的[] 来表示一个不可变的集合,如果只有一个值,则值后面需要输入逗号,表示元组,否则只表示普通括号+值
(2) list() 和tuple()进行类型转化,可变<–>不可变
10.引用,对于列表和对象是内存地址的赋值拷贝,而不可变 如字符串和基础类型则是值本身拷贝 同java
11. copy模块提供了 copy() 和deepCopy() 浅拷贝和深拷贝,
五 字典
1.myCat = {‘size’: ‘fat’, ‘color’: ‘gray’, ‘disposition’: ‘loud’}
2. 访问: myCat[‘color’] key不存在时抛异常 KeyError, keys() values() items() 三个方法访问所有的键、值 以及键值对,对items()方法 遍历可使用 k,v in itmes() ;get(key,backUp) 类似于getOrdefault方法,有则返回,否则取默认值
3. in 和not in 判断建或者值是否存在 ‘key’ in spam.keys()/values() 如果是键的话可简写 ‘key’ in spam
4. 不存在时添加key-value setdefault(key,value) 如果不存在key,则设置该对,否则返回key对应的值,什么都不干,确保键存在
5 pprint.pprint() 模块打印
六、字符串
1.字符串里面如果有单引号,则外围使用"" 或者\转义字符
2.字符串前面加r,表示为原始字符串,忽略所有转义字符串
3. """ """ / ''' ''' 多行注释
4.字符串方法
upper() lower() isupper() islower(), isX方法:isalpha()判断是否纯字母 isalnum()是否只包含字母和数字,isdecimal() 只包含数字字符; isspace()只包含空格 制表符和换行; istitle()大写字母开头,后面都是小写字母的单词;startswith(),endswith()起始结束;join()连接字符串;split(‘’)分隔同java;rjust(number,[padding]),右对齐,总 为number,以padding字符填充,默认填充空格,如果number小于字符总长,则结果为字符本身不变;ljust() 左对齐;center()居中对齐;“str”.strip(char)删除左右两边的空白字符(空格制表符和换行)或者传入的字符集,参数字符的顺序无所谓,找到就删;“str”.rstrip();“str”.lstrip()
5.pyperclip模块拷贝字符到剪切板
(1)需要安装 pip isntall pyperclip
(2) 复制粘贴命令 pyperclip.copy(‘Hello world!’); pyperclip.paste();past()会返回当前剪切板的内容
6 window上运行py文件,文件头应该加#! python3
7. sys.argv是获取的命令行参数集合,0位始终是文件位置,输入参数从1开始
六、正则

  1. re模块 compile search group
    eg:基本使用:
reg =   re.compile(r'(\d\d\d)-(\d\d\d)-(\d\d\d\d)'); r表示原始字符,不转义
g = reg.search('124-782-4358 343-444-4454')
print(g.group(3))
print(g.groups())
  1. findall()方法 匹配所有符合的字符串 并返回列表或者元组
    如果匹配有分组,则返回元组,如果没有分组,则返回字符串列表
    eg
    :
    有分组
reg = re.compile(r'(\d\d\d)-(\d\d\d)-(\d\d\d\d)')
ee = reg.findall('Cell: 415-555-9999 Work: 212-555-0000')
print(ee) [('415', '555', '9999'), ('212', '555', '0000')]
没有分组
reg = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d')
ee = reg.findall('Cell: 415-555-9999 Work: 212-555-0000')
print(ee)

3.忽略大小写

re.compile(r'robocop', re.I)
4.匹配并替换sub()
eg: 以*替换中间数字
reg = re.compile(r'(?<=-)\d{3}(?=-)') 
ee = reg.sub('***','Cell: 415-555-9999 Work: 212-555-0000')
print(ee) # 415-***-9999 Work: 212-***-0000
  1. 复杂的正则表达式可以使用 re.VERBOSE 从而对表达式进行注释和说明,使用三个单引号多行输入
    eg:
re.compile(r'''(
(\d{3}|\(\d{3}\))? # area code
(\s|-|\.)? # separator
\d{3} # first 3 digits
(\s*(ext|x|ext.)\s*\d{2,5})? # extension
)''', re.VERBOSE)

6.混合使用各种compile的参数
someRegexValue = re.compile(‘foo’, re.IGNORECASE | re.DOTALL) # 使用DOTALL标志,就可以让句号.匹配所有字符,不再排除换行符了

七、文件读写

 1. os.path.join()拼接文件路径,屏蔽os差异
2.os.getcwd() 获得当前的工作目录
3. os.makedirs('path') 创建文件夹

4.路径相关函数

print(os.getcwd())
print("相对转绝对:"+ os.path.abspath('..'))
print("判断是否是绝对路径:"+str(os.path.isabs('.')))
print("os.path.relpath(path, start): 从start到path的相对路径,没有提供则默认为当前工作路径"+os.path.relpath('D:\Program Files (x86)\py','D:/git/personal/pydemo/study'))
print("返回path最后一个斜杠之前的目录内容:"+os.path.dirname('D:\Program Files (x86)\py'))
print("返回path最后一个斜杠之后的基本内容:"+os.path.basename('D:\Program Files (x86)\py'))
print('同时返回目录内容和基本内容:'+str(os.path.split('D:\Program Files (x86)\py')))#返回一个元组
print('文件字节大小:'+str(os.path.getsize('D:\Program Files (x86)\py\python.exe')))
print('目录中文件列表:'+str(os.listdir('D:\Program Files (x86)\py')))
print('路径是否存在:'+ str(os.path.exists('D:\Program Files (x86)\py1')))
print('路径是文件:'+str(os.path.isfile('D:\Program Files (x86)\py')))
print('路径是目录:'+str(os.path.isdir('D:\Program Files (x86)\py')))

5.读写文件
(1)四个方法; open(path,w/r模式) read write close
eg:

   #如果没有参数,则读整个文件,占内存
  #  print('读字符串:'+file.read())
    #readlines()方法读取整个文件所有行,保存在一个列表(list)变量中,每行作为一个元素,但读取大文件会比较占内
  #  print('读列表:'+str(file.readlines()))
    #一行一行读
    line = file.readline()
    while line :
        line = file.readline()
        print('读一行:'+line)
    file.close()
#w覆盖,a以追加的形式写出
file = open(mypath, 'w', encoding='UTF-8')
file.write('second line')
file.close()
file = open(folder+'\zsx_'+str(i)+'.txt','w')
file.close()
⦁	       创建空文件

(2)shelve模块可以保存对象,可以把shelve文件本身当成字典使用
eg:

shelfFile = shelve.open('mydata')
>>> cats = ['Zophie', 'Pooka', 'Simon']
>>> shelfFile['cats'] = cats
shelfFile.keys() 列出所有字典的key
>>> shelfFile.close()

(3)使用pprint.pformat()保存可以导入的py代码,即在程序中可以创建py脚本

eg:cats=['cat','dog','pig']
file = open('mypathon.py','w')
file.write('animals='+pprint.pformat(cats)+'\n')
file.close()
然后会创建 mypathon.py 可以 import使用

八、组织文件
shutil模块复制移动改名删除文件

1.复制移动常见操作
 shutil.copy('C:\\spam.txt', 'C:\\delicious')#拷贝到新文件夹, 返回新文件的地址
 shutil.copy('C:\\spam.txt', 'C:\\delicious\s1.txt')#拷贝到新文件中, 
#复制整个文件夹
path = shutil.copytree(r'D:\Program Files (x86)\py\Doc',r'D:\Program Files (x86)\py\Doc1')
shutil.move('C:\\bacon.txt', 'C:\\eggs') #移动,destination中若有则抛异常
2.删除文件操作
#删除文件
os.unlink(os.path.join(path,'test2.txt'))
#删除文件夹 空
os.rmdir(os.path.join(path,'zsx'))
#删除非空文件夹时报错
os.rmdir(os.path.join(path,'zsx1'))
#删除文件夹以及内部所有
shutil.rmtree(os.path.join(path,'zsx1'))
3.第三方模块send2trash 可以将文件放回收站,但需要安装
4.遍历文件夹及其子目录所有文件 os.walk(path)

# 会递归遍历所有的子目录,及其中的文件,而非只有最外围
for folder_name , subfolder,file_name in os.walk(path):
    print(str(folder_name))
    print(str(file_name))
  #  print(str(subfolder))

zipfile模块处理zip文件
os.chdir(‘C:\’) # 改变工作目录到c ,这样后续操作就直接写文件名,不用带路径了
import zipfile
example = zipfile.ZipFile(‘zipfilepath’) #创建一个zipfile对象
example.namelist() #列出zip文件内的所有文件
info= example.getinfo(‘spm.txt’) #获得zip文件内某文件的信息
print(info.file_size)
#解压所有到传入的文件夹中,无参的话则是解压到当前文件夹
zf.extractall(r"D:\Program Files (x86)\py\test")
zf.extract(‘NEWS.txt’) #解压其中一个文件
zf.close() #流要关闭
#压缩文件
os.chdir(“D:\Program Files (x86)\py”)
zf = zipfile.ZipFile(‘zsx.zip’,‘a’)#与open类似 w是写覆盖 a是写追加
zf.write(r’py.zip’,compress_type=zipfile.ZIP_DEFLATED) #将制定路径的文件压缩,可以默认总是使用该压缩类型

九、调试异常
1.异常体系

BaseException ±- SystemExit ±- KeyboardInterrupt ±-
GeneratorExit ±- Exception
±- StopIteration
±- StandardError
| ±- BufferError
| ±- ArithmeticError
| | ±- FloatingPointError
| | ±- OverflowError
| | ±- ZeroDivisionError
| ±- AssertionError
| ±- AttributeError
| ±- EnvironmentError
| | ±- IOError
| | ±- OSError
| | ±- WindowsError (Windows)
| | ±- VMSError (VMS)
| ±- EOFError
| ±- ImportError
| ±- LookupError
| | ±- IndexError
| | ±- KeyError
| ±- MemoryError
| ±- NameError
| | ±- UnboundLocalError
| ±- ReferenceError
| ±- RuntimeError
| | ±- NotImplementedError
| ±- SyntaxError
| | ±- IndentationError
| | ±- TabError
| ±- SystemError
| ±- TypeError
| ±- ValueError
| ±- UnicodeError
| ±- UnicodeDecodeError
| ±- UnicodeEncodeError
| ±- UnicodeTranslateError
±- Warning
±- DeprecationWarning
±- PendingDeprecationWarning
±- RuntimeWarning
±- SyntaxWarning
±- UserWarning
±- FutureWarning
±- ImportWarning
±- UnicodeWarning
±- BytesWarning
2.raise手动抛异常 try:
raise Exception('zsx— ') except Exception as zsx: 异常信息存在变量 print(zsx) # zsx—
3. 获得调用栈信息字符串 import traceback

print(traceback.format_exc())
十、web抓取信息
1.webbrowser,打开浏览器获取指定页面

  1. request模块 第三方模块,用于从web下载
    下载并保存:
def  download():
    res = requests.get('https://www.cnblogs.com/xinz-study/p/9294452.html')
    #检查错误,如果下载异常则抛出
    res.raise_for_status()
    print('type:'+str(type(res)))
    length = 'length:' + str(len(res.text))
    print(length)
    print('saving.....')
    file = open(r'D:\Program Files (x86)\py\test\download.txt','wb')
    for  text in  res.iter_content(10000):
        file.write(text)
    print('saved')
    file.close()
  1. python三方模块换源
 pip  config set global.index-url  https://mirrors.aliyun.com/pypi/simple/

4.beautifulsoup 解析html

import bs4
eg:
res = requests.get('https://www.cnblogs.com/lizhuming/')
res.raise_for_status()
bs = bs4.BeautifulSoup(res.text,features="html.parser")
# 列出选择的所有标签
list = bs.select('a.postTitle2.vertical-middle') #使用css选择器选择class为post..的a
for i in range(min(5,len(list))):
    tag = list[i]
    print('open web :'+ tag.getText())#获取内容
    webbrowser.open(tag.attrs['href'])#打开标签页

十一、处理Excel

  1. openpyxl模块处理excel
eg:常用的一些方法:
   os.chdir('D:\Program Files (x86)\py')
   wb = openpyxl.load_workbook(r'顺丰分拣线设备编号和组件ID表模板 V1.0.xlsx')
   #所有sheet的表名
   sheets = wb.sheetnames
   print('sheets'+str(sheets))
   #获取单个sheet
   za_sheet = wb['ZA']
#   current_sheet = wb.active
   print('sheet的名字:'+za_sheet.title)
   #cell表示一个格子,行从1开始,列从A开始,Z列之后用AA,AB,AC等表示
   cell = za_sheet['A1'] #
  # print(za_sheet.cell(1,'A'))
   #取值,第一行和第一列是1开始,而非0
   print('行:'+str(cell.row)+'  列:'+ str(cell.column)+'  值:'+str(cell.value))
   print('列出一个对象所有属性和方法:'+str(dir(za_sheet)))
   print('max_row:'+str(za_sheet.max_row))
   print('max_column:'+str(za_sheet.max_column))
   print('-------------------')
   #步长为2
   for i in range(1,za_sheet.max_row,2):
       print(i)
       print(za_sheet['A'+str(i)].value)
       #需要导包 from openpyxl.utils import get_column_letter, column_index_from_string
   print('数字转字母:'+ get_column_letter(28))
   print('字母转数字:'+ str(column_index_from_string('A')))
   #获取某个区域所有的行组成的一个元组
   rowstuple = za_sheet['A1':'F9']
   #遍历行元组,获取每个行元组中的cell元组,类似[][]
   for celltuple in rowstuple:
       for cell in celltuple:
           print('行:' + str(cell.row) + '  列:' + str(cell.column) + '  值:' + str(cell.value))

2.创建并保存excel文档,创建删除工作表

#创建新的excel
excel  = openpyxl.Workbook()
active_sheet = excel.active
#直接修改sheet名
active_sheet.title = 'zsx'
#创建sheet
excel.create_chartsheet('zsx1',1)
excel.create_chartsheet('zsx2',2)
print(excel.sheetnames)
#写值,类似字典一样的方式
excel['zsx']['A1']='zsxtest'
#如果是更新某个excel,则一般重新命名保存,防止覆盖原始的
excel.save('test2.xlsx')

3.openpyxl还支持处理图表
ps: dir查看某个类的属性和方法:print(dir(za_sheet))
十二、处理json

#json串的键值对使用双引号
json_str= '{"name": "Zophie", "isCat": true, "miceCaught": 0}'
#import  json,将json串加载转为字典
dic = json.loads(json_str)
print(dic['name'])
#将字典写成json字符串
dump_str = json.dumps(dic)
print(dump_str)

十三、时间函数

常用函数
#当前时间的时间戳
#返回自1970年的秒数
start = time.time()
print('时间戳浮点数:'+str(start))
time.sleep(3)
print('浮点数转为整数:'+str(round(start)))
datetime
# datatime模块类似于Calendar
print(datetime.datetime.now())
#传入特定时刻
dt = datetime.datetime(2021, 9, 1, 23, 23, 23, 234)
print('拿到具体的年月日:'+ str(dt.year+dt.month))
print('datetime可以相互比较大小(迟早):'+str(datetime.datetime.now()>dt))
#timedelta表示一段时间,可以和datetime进行相加减
td = datetime.timedelta(days=10,minutes=20)
future = datetime.datetime.now()+td
print('运算之后还是个datetime:'+ str(future))
print('返回时间戳对应的datetime对象:'+str(datetime.datetime.fromtimestamp(time.time())))
print('--------------字符串和时间转化------------------------')
print('时间转字符串:'+datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
parser = datetime.datetime.strptime('2021-09-02 14:07:09', '%Y-%m-%d %H:%M:%S')
print('字符串转时间:'+str(parser>datetime.datetime.now()))

在这里插入图片描述

image
十四、线程并发

def target_fun(arg1,arg2,arg3):
    print(arg1+arg2+arg3)
    print('time:'+str(datetime.datetime.now()))
    print('current_thread;'+threading.current_thread().name)
def thread_test():
    #执行线程,传入方法的参数,target是被执行方法,start线程开启
    threading.Thread(target=target_fun,args=('zhangsan','lisi','wangwu')).start()
    print('end----main thread:'+threading.current_thread().name)
加锁
count_no = 0
def  record_sum():
    global count_no
    lock.acquire() #竞争锁
    count_no+=1
    lock.release() #释放锁
    return  count_no

十五、其他

  1. 退出
 sys.exit() 在单线程下有用
 os._exit(1) 多线程下可用这个来强制结束程序
  1. 关于decode和code
  #使用这种方式能解决text乱码的问题,content是直接取的二进制字节
        # 如果设置为ignore,则会忽略非法字符;
        # 如果设置为replace,则会用?取代非法字符;
        # 如果设置为xmlcharrefreplace,则使用XML的字符引用。
      txt=res.content.decode('gbk','ignore')

3.python执行shell命令

"""
    #shell=True,如果不指定,则只能执行简单的不带参数的命令
    一般直接使用subprocess的call或者check_output即可
"""
if __name__ == '__main__':
    print('--------------------python执行shell命令一般有以下几种方式----------------')
    result = os.system("ps -ef|grep mccserver|grep -v grep | awk '{print $2}'")
    print('os.system用于获得命令的执行状态0表示无误 其他数字表示未成功,可被subprocess替代:'+str(result))
    read = os.popen('ls')
    print('popen会返回执行后的结果,可被subprocess替代,'+str(read.read().split(os.linesep)))
    print('--允许你生成新的进程,连接到它们的 input/output/error 管道,'
          '并获取它们的返回(状态)码。这个模块的目的在于替换几个旧的模块和方法---')
    print('官网给的替换命令:直接执行shell命令:')
    '''
    如果返回码非零,它会引发一个CalledProcessError. 该 CalledProcessError对象将在returncode属性中具有返回代码
    属性中具有任何输出 output。相当于标准输出run(..., check=True, stdout=PIPE).stdout,捕获标准错误则需要指定 stderr=subprocess.STDOUT
    适合那些执行完后能立马返回结果的命令
    '''
    result = subprocess.check_output(['ps','-ef'],stderr=subprocess.PIPE)
    print('结果是字节数组,转字符串然后可拆分:'+str(result.decode('utf-8').split(os.linesep)))
    print('替换管道符命令:')
    re = subprocess.check_output("ps -ef|grep mccserver|grep -v grep | awk '{print $2}'",shell=True)
    print('结果是字节数组,转字符串然后可拆分:' + str(re.decode('utf-8').split(os.linesep)))

    print('替换os.sysytem令:')
    re1 = subprocess.call(['ps','-ef'],shell=True)
    print(re1)
    #对于tail等执行时间比较长的或者持续执行的命令可直接使用Popen,对于执行完后不能立马返回结果的,可以使用Popen
    sp = subprocess.Popen('tail -f ../mccserver/nohup.out', shell=True, stdout=subprocess.PIPE)
    '''
    Popen.poll()
    检查子进程是否已终止。设置和返回
    returncode属性。如果返回值 is None,则还在执行

    Popen.wait(超时=)
    等待子进程终止。设置和返回
    returncode属性。

    如果进程在timeout秒后没有终止,则引发
    TimeoutExpired异常。捕获此异常并重试等待是安全的。
    '''
    while sp.poll() == None:
        #如果标准输出没有了 则会在这里阻塞主
        print(sp.stdout.readline())
    print(sp.returncode)

4 python解构
https://blog.csdn.net/weixin_33365807/article/details/111352158
形参前使用**表示,表示可以接收多个关键字参数
收集的实参名称和值组成一个字典
kw(**kwargs) > kw(bootstrap_servers=“127.0.0.1:9092”,key_serializer=“key_serializer”,value_serializer=“value_serializer”)>kw(**config)
kw(kwargs)==>相当于传参为数组,不符合参数规范

__init__标识一个python包,if we want to use a funciton outside the package,we can import the target function into init.py then we can use it at package lelvel

无法下载包时 则换源为aliyun的 然后 --trusthost 否则无法找到源

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值