《Python程序设计教程》读书笔记

第一章 程序设计概述


1.1 程序设计基础知识
算法+数据结构=程序
程序设计四步骤:1分析问题,确定数学模型或方法2设计算法,画出流程图3选择编程工具,按算法编写程序4调试程序,分析输出结果
算法的特性:1有穷性2确定性3有效性4要有数据输入5要有结果输出
算法评价标准:1正确性2可读性3通用性4高效率
算法效率的度量:时间复杂度(简单操作的次数多少,主要为阶数)、空间复杂度(执行过程中临时占用的存储空间)
算法的描述:流程图、N-S图、伪代码
结构化定理,任何程序由3中基本结构(顺序、选择、循环)组成
结构化程序设计(自顶向下,逐步求精,模块化)、面向对象程序设计

1.2 Python语言的发展与特点
Python是一种开源的面向对象的脚本语言,从高级数学语言ABC汲取语法,从系统编程语言Modula-3借鉴了错误处理机制,结合了Unix shell和C的习惯
有Python2.x和Python3.x
Python语言的特点:1.简单易学 2.程序可读性好 3.丰富的数据结构 4.可移植性好 5.解释性的语言 6.既支持面向过程程序设计也支持面向对象程序设计 
本书基于Windows操作系统,使用Python Shell
安装Python安装包并配置环境变量
Python有命令行解释器>>>和图形用户界面解释器>>>
Python程序的运行方式:
命令方式
1.启动Python解释器后,在命令行的>>>后输入程序语句 
2.图像用户界面IDLE GUI,在>>>后输入程序语句 
程序方式
1. GUI File-Save文件 Run-Run Module
2.>>> import hello或者
import imp
imp.reload(hello)
3.python hello.py

 

第2章 程序的数据描述

2.1数据的基本形式
常量,变量(变量名、变量值、变量地址)
python变量
静态类型语言C、Java、FORTRAN:编译期间确定数据类型
动态类型语言Python:给变量赋值时确定数据类型并且再进行赋值可以改变数据类型,所以Python变量不需要定义数据类型
Python的变量赋值是创建数据并让变量指向这个数据,是一种引用。再赋值时,变量又指向另一存储空间。
垃圾回收(未被变量引用的数据)
del 对象引用
id()函数返回对象的内存地址(赋值为同一简单对象的变量地址可能相同)
标识符:字母、数字和下划线组成,不能以数字开头,字母区分大小写
单下划线开头的标识符:不能直接访问的类属性,需要通过类提供的接口进行访问,不能用from xxx import x
双下划线开头的标识符:类的私有成员
双下划线开头和结尾的标识符:Python中特殊方法专用的标识
单独下划线:特殊变量,表示上一次运算的结果
Python关键字

2.2 Python数据类型
整型数据:4种进制 十进制 0b/0B 0o/0O 0x/0X 长度不固定
浮点型数据:小数形式和指数形式(科学记数法e) 默认17位有效数字的精度
复数型数据:a+bJ

字符串:' '' ''' '''''' 后2个可以多行
转义字符:\n \012     字符串前加r表示原始字符串无转义字符
eval():字符串作语句执行 len():字符串字符个数

布尔类型:True Fasle

复合数据类型(元素类型都可以不同,元素类型一般可以为复合数据类型,[]可作下标):
列表list:[x,y] 元素可修改 有序
元组tuple:(x,y) 不能修改,只读 有序
字典dictionary:{x:a,y:b} 键值对,关键字不同且为不可变类型(列表和含可变类型的元祖不行) 无序
集合set:元素不重复 无序

2.3常用模块函数
有2种导入模块的方式
import math:调用函数时需用 math.sqrt(2)
from math import * 调用函数时需用 sqrt(2)
math,random,time,calendar
还有内置函数,不需要导入,Python解释器启动时就读进内存

2.4 基本运算与表达式
预算量或操作数
运算符或操作符
算术运算符、位运算符、关系运算符、逻辑运算符、成员运算符、身份运算符
+ - * / //(整除) % **(乘方)
& | ^(异或) ~(按位取反) << >>

浮点数计算误差
数据类型转换 int() float() complex() str()

 

第3章 顺序结构程序设计

12种复合赋值运算符
+=,-=,*=,/=,//=,%=,**=,<<=,>>=,&=,|=,^=

链式赋值
a=b=c=2

同步赋值(同步赋值要么是常数,要么是之前已经有值的变量,不会用同步赋值过程中的值)
x,x=2,-50
a,b=b,a

input()
eval(input())
print(10,20,sep='/',end='*')

格式化输出
1.字符串格式化运算符%
print('The value is $%.2f'%1.5)
'%(name)s:%(score)06.1f'%{'score':9.5,'name':'Lucy'}
%*.*f

2.format()内置函数
print(format(1.5,'.2f'))
print(format(15,'X'),format(65,'c'),format(3.145,'f'))
<表示左对齐,>表示右对齐,^表示居中对齐,=表示填充字符位于符号和数字之间,符号(+表示正号,-表示负号)

3.字符串的format()方法
1的字符串格式化运算符%不建议使用,应该多用这里的format()方法
print('The value is ${0:.2f}'.format(1.5))
print('Hi,{nm}',format(nm='Brenden'))
{1:.3}小数点外输出位数是3位
{1:.3f}小数点后输出位数是3位
{0:*^15}

 

第4章 选择结构程序设计

关系运算符
<,<=,>,>=,==,!=
逻辑运算符
and,or,not
短路特性
True,False
成员运算符in(not in):字符串,列表,元组
身份测试符is:是否指向同一个对象

选择结构
if 条件表达式:
    语句块
else:
    语句块

单条语句
if 条件表达式:语句块

if 条件表达式1:
    语句块1
elif 条件表达式2:
    语句块2
elif 条件表达式3:
    语句块3
[else:
    语句块n]

if的嵌套通过if和else对齐来配对

条件运算,三元运算
表达式1 if 条件表达式 else 表达式2


第5章 循环结构程序设计

while 条件表达式:
    语句块

单条语句
while 条件表达式:语句

while 条件表达式:
    语句块
else:
    语句块

for 赋值目标 in 序列对象(字符串,列表,元组和其他内置可迭代对象):
    语句块

for中语句块修改目标变量,in又重新赋值,直至最后一次语句块修改目标变量

range([m,]n[,t])

循环控制语句
break,continue,pass(因为循环体的语句不能为空而设置)

第6章 字符串处理

6.1字符串编码
unicode和utf-8(不同的编码方式而已,都是对一些字符进行编码)
unicode定长(2个字节,但是可扩展)
utf-8变长(多字节,加入一些识别位)
字符串默认编码unicode
ord() chr()

6.2字符串的索引与分片
s[0]
s[i:j:k](0 - n-1,-n - -1) (i省略从0或-1开始,j省略到最后一个字符结束,k省略步长为1)
索引值可以超过字符串的长度

6.3字符串的操作
6.3.1 字符串连接操作
1.基本连接操作
+
是新建的字符串

2.重复连接操作
*
s*n

3.连接操作的其他实现
+效率低,这里的只申请一次内存,效率高
'{:s}{:s}{:s}'.format('Python',' ','Program')
''.join(['Python',' ','Program'])

6.3.2字符串逻辑操作
1.关系操作
> <
2.成员关系操作
in  not in

6.3.3字符串的常用方法
1.字母大小写转换
s.upper()
s.lower()
s.swapcase()
s.capitalize()
s.title()

2.字符串对齐处理
s.ljust(width,[fillchar])
s.rjust(width,[fillchar])
s.center(width,[fillchar])
s.zfill(width)

3.字符串搜索
s.find(substr,[start,[end]])
s.index(substr,[start,[end]])
s.rfind(substr,[end])
s.rindex(substr,[start,[end]])
s.count(substr,[start,[end]])
s.startswith(prefix[,start[,end]])
s.endswith(suffix[,start[,end]])

4.字符串替换
s.replace(oldstr,newstr,[count])
s.strip([chars])
s.lstrip([chars])
s.rstrip([chars])
s.expandtabs([tabsize])

5.字符串的拆分和组合
s.split([sep,[maxsplit]])
s.rsplit([sep,[maxsplit]])
s.splitlines([keepends])
s.partition(sub)
s.rpartition(sub)
s.join(seq)

6.字符串类型测试
s.isalnum()
s.isalpha()
s.isdigit()
s.isspace()
s.isslower()
s.isupper()
s.istitle()

6.4bytes对象
不是字符串,是字符串经过各种编码(如utf-8,gb18030,big5)后生成的0-255之间的字符组成的序列。
bytearray对象可修改


第7章 列表与元组

序列型数据类型:字符串,列表,元组

7.1 序列的通用操作

7.1.1 序列的索引与分片

1.序列的索引
[] 0 - n-1  -1 - -n

2.序列的分片
序列[起始索引:终止索引:步长]
步长负数反向排序
x[:]是不同对象 x=y是相同对象

7.1.2序列的计算
+(相同类型序列) *n <> in
none占位符

7.1.3序列处理函数
1.len() max() min()
2.sum() reduce()
3.enumerate() zip()
4.sorted() reversed()
5.all() any()
6.list() tuple()

7.1.4 序列拆分赋值
a,*b,c=[1,2,3,4]

7.2 列表的专有操作
7.2.1 列表的基本操作
1.列表元素赋值
2.删除元素 del
3.分片赋值 分片步长大于1时,值列表长度应等于分片长度
4.列表解析
[i for i in range(8)]
[(x,y) for x in range(5) if x%2==0 for y in range(5) if y%2==1] 嵌套

7.2.2 列表的方法
1.适用于序列的方法
s.count(x)
s.index(x)
2.只适用于列表的方法
s.append(x)
s.extend(s1)
s.sort()
sorted()
s.reverse()
s.pop([i])
s.insert(i,x)
s.remove(x)

7.3 元组与列表的区别及转换
1.元组与列表的区别
2.元组元素的可变性
元组套列表
3.元组与列表的转换
list() tuple()

7.4 序列的应用
7.4.1 数据排序
简单交换排序法
选择排序法
冒泡排序法

7.4.2 数据检索
顺序检索,二分检索

7.4.3 矩阵运算
列表表示多维矩阵

第8章 字典与集合

8.1 字典的特点
键值对
hash()

8.2 字典的操作
1.创建字典
2.dict()函数
参数为列表、元组或关键字=值

8.2.2 字典的基本操作
1.访问字典的值
(1)关键字索引
(2)字典嵌套字典
(3)字典嵌套列表
(4)字典嵌套元组

2.更新字典的值
字典名[关键字]=值

3.删除字典元素
del 字典名[关键字]
del 字典名

4.检查字典关键字是否存在
in   not in

5.字典的长度和运算
len() max() min() sum() sorted()
== !=
list()

8.2.3 字典对象的常用方法
1.fromkeys()
d.fromkeys(序列[,值])
2.keys()、values()、items()
d.keys() d.values() d.items()
3.字典复制与删除的方法
d.copy() d.clear() d.pop(key) d.popitem()
4.get()方法和pop()方法
d.get(key[,value]) d.pop(key[,value])
5.setdefault()方法和update()方法
d.setdefault(key,[value]) d2.update(d1)
6.has_key()方法


8.2.4 字典的遍历
1.遍历字典的关键字
for key in d.keys()
2.遍历字典的值
for value in d.values()
3.遍历字典的元素
for iten in d.items()

8.3 集合的操作
8.3.1 集合的创建
set()
8.3.2 可变集合的方法
s.add(x)
s.update(s1,s2,...,sn)
s.intersection_update(s1,s2,...,sn)  #更新到s
s.difference_update(s1,s2,...,sn)
s.symmetric_difference_update(s1)
s.remove(x)
s.discard(x)
s.pop()

8.3.3 集合的运算
1.集合运算
s1|s2|s3
s1&s2&s3
s1-s2-s3
s1^s2
2.集合的比较运算
s1==s2
s1!=s2
s1<s2
s1<=s2
s1>s2
s1>=s2
3.集合对象的方法
s1.issubset(s2)
s1.issuperset(s2)
s1.isdisjoint(s2)
s1.union(s2,...,sn)                 #不更新到s1
s1.intersection(s2,...,sn)
s1.difference(s2,...,sn)
s1.symmetric_difference(s2)
 

第9章 函数

9.1 程序的模块化结构

9.2 函数的定义与调用

9.2.1 函数的定义与调用
def 函数名([形式参数表]):
    函数体
1.函数首部
2.函数体 return 表达式
不带return或者return没有参数,返回none,返回多个值时返回一个元组
3.空函数 pass

9.2.2 函数的调用

9.3 函数的参数传递

9.3.1 参数传递方式
变量之间的赋值地址一样,列表或字典的子对象修改不改变地址
(1)通过引用将实参复制到局部作用域的函数中,意味着形参与传递给函数的实参无关。例如在子函数把传进去的列表参数指向另一个列表,主函数的列表不变
(2)可以在适当位置修改可变对象(主要是列表和字典)。对于可变对象,局部可修改。如子函数列表参数某个值变了,主函数也变了。
(1)(2)其实与python这种的变量特性是一致的,新变量重新分配一个地址,函数参数传的也是这个地址,即某个类型对象的地址。

9.3.2 参数的类型
1.位置参数:参数位置匹配
2.关键字参数:形参名=实参值
3.默认参数:形参列表中赋值
4.可变长度参数:*元组变长参数,**字典可变长参数

9.4 函数的嵌套调用与递归调用
9.4.1 函数的嵌套调用:2函数多重互相调用
9.4.2 函数的递归调用:1函数自己多次调用自己

9.5 变量的作用域
9.5.1 局部变量
函数体或语句块内的变量,同名局部变量作用范围内全局变量不起作用
9.5.2 全局变量
函数定义之外定义的变量
global 
nonlocal

9.6 匿名函数
lambda [参数1,参数2,...]:表达式

9.7 Python模块
9.7.1 模块的创建与使用
每个Python程序文件就是一个模块
import 模块1,模块2
from 模块名 import 名称1

9.7.2 Python程序结构
顶层文件/主程序/启动文件+各模块文件/子程序/函数库

9.7.3 模块的有条件执行
__name__:被其他模块导入,是模块的名称,主动执行时时字符串__main__
def test():
    print(__name__)
#if__name__=='__main__'
test()
这是m.py文件,有import和直接执行2中结果

9.7.4 标准库模块
标准链接库,包括操作系统功能,网络和Internet编程,GUI建构
help()
modules
math
quit
dir()


第10章 文件操作

10.1 文件的基本概念
1.文件格式
操作系统吧输入/输出设备当作文件来管理,称为标准输入/输出文件
Python把文件看作流,而不是记录
Python文件分为ASCII文件和二进制文件,ASCII文件又称文本文件。
二进制文件节省外存空间和转换时间,中间结果数据暂时保存到外存再读入内存的常用二进制文件保存。
2.文件的操作
缓冲文件系统的输入/输出称为标准I/O
非缓冲文件系统的输入/输出称为系统I/O
内存开辟缓冲区,输入缓冲,输出缓冲
输入输出相对于内存,读写相对于磁盘

10.2文件的打开和关闭
10.2.1
打开文件
文件对象=open(文件说明符[,打开方式][,缓冲区])
文件说明符就是路径,记得是双斜杠
r w a rb wb ab
r+ w+ a+ rb+ wb+ ab+
读写增
文件对象属性:closed mode name
文件对象方法:close() flush() read([count]) readline() readlines() seek(offset[,where]) tell() truncate([size]) write(string) writelines(list) next()

10.3 文本文件的操作
10.3.1 文本文件的读取
1.read()
变量=文件对象.read()
变量=文件对象.read(count)
2.readline()
变量=文件对象.readline()
3.readlines()
注意print(:-1)

10.3.2文本文件的写入
1.write()
2.writelines()

10.4 二进制文件的操作
文本文件和二进制文件2种读取方式差别为二进制将'\n'变为'\r\n'
顺序文件,随机文件
10.4.1 文件的定位
1.tell()
2.seek()
文本文件用seek()有限制(python3.*)
10.4.2 二进制文件的读写
文本文件存放编码字符,二进制文件存储字节编码
1.read() write()
字符串必须编码后,即不能以unicode,而必须以utf-8等编码写入而二进制文件
2.struct模块
pack() unpack()
这种是针对整型数据或浮点数据打包成二进制字符串,然后写入而二进制文件
pack格式串
3.pickle模块
dump() load()
将列表、字典等(包括内置类型和自定义类型)直接写入文件和读取文件

10.5 文件处理
os是模块
1.文件重命名
os.rename('当前文件名','新文件名')
2.文件删除
os.remove('文件名')
3.Python中的目录操作
(1)mkdir()
(2)chdir()
(3)getcwd()
(4)redir()

10.6 文件应用举例
BMP图像文件由文件头、信息头、调色板和位图数据内容4部分组成。
BMP文件高度压缩一半,要调整对应字节。

 

第11章 面向对象程序设计

11.1 从面向过程到面向对象
小程序可用面向过程,大程序要用面向对象

11.2 类与对象
11.2.1 类的定义
class 类名:
    类体
引用和实例化

11.2.2 对象的创建和使用
对象名=类名(参数列表)
对象名.属性名
对象名.函数名()

11.3 属性和方法
11.3.1 属性和方法的访问控制
1.属性的访问控制
__标志私有属性和私有方法,只能在类中访问
2.方法的访问控制
def,须有self作为第一个参数

11.3.2 类属性和实例属性
1.类属性
可以在类定义结束后增加类属性
2.实例属性
在__init__构造函数中定义的,在其他函数中定义不提倡
实例对象引用类属性是同名的实例属性,不会影响到类属性
且实例属性会屏蔽类属性,除非删除实例属性

11.3.3 类的方法
1.类中内置的方法
构造方法__init__(self,...)
析构方法 __del__(self)
2.类方法、实例方法和静态方法
(1)类方法 @classmethod    cls作第一个参数
实例通过类方法修改类属性确实可以改变类属性
(2)实例方法 self作第一个参数,类对象不能调用实例方法
(3)静态方法 @staticmethod

11.4 继承和多态
11.4.1 继承
class 子类名(父类名):
    类体
11.4.2 多重继承
多个父类
Python 2.x 深度优先调用父类方法,先是第一个父类,然后是第一个父类的父类
Python 3.x 不会深度搜索而搜索后面的父类(似乎是广度优先),如果子类重新定义了构造方法,需要显式去调用父类的构造方法,调用哪个由程序决定。但是没有重新定义构造方法,只会执行第一个父类的构造方法。
构造方法的搜索规则和普通方法一样。

11.4.3 多态
变量类型的多态等

 

第12章 异常处理

12.1 异常处理概述
python的默认异常处理:回溯Traceback
错误信息:错误类型:错误说明

12.2 捕获和处理异常
12.2.1 Python中的异常类
内建异常类,放在内建命名空间中,不必导入exceptions模块即可使用异常

12.2.2 使用try-except语句
try:
    语句块
except:
    异常处理语句块

分类异常处理
try:
    语句块
except 异常类型1[as 错误描述]:
    异常处理语句块1   
...
except 异常类型n[as 错误描述]:
    异常处理语句块n
except:
    默认异常处理语句块
else:
    语句块
异常处理的嵌套:外层引发异常则直接运行相应except语句,内部try不会执行

12.2.3 使用try-finally语句
try
    语句块
finally
    语句块

12.3 断言处理
assert 逻辑表达式
assert 逻辑表达式,字符串表达式
true则不做,false抛出异常

12.4 主动引发异常与自定义异常类
12.4.1 主动引发异常
raise 异常类型[(提示参数)]
12.4.2 自定义异常类
继承Exception,用raise引发。
 

第13章 图形处理

13.1 Tkinter图形库概述
13.1.1 tkinter模块
_tkinter二进制扩展模块,tkinter主模块,tkinter.constants常量模块
13.1.2 创建主窗口
root=Tk()
13.2 画布
13.2.1 画布对象的操作
c=Canvas(窗口,属性=值,...)
c.pack()
坐标系,左上角为原点,水平向右x轴,垂直向下y轴

13.2.2 画布中的图形对象
1.标识号:整数
2.标签:tags 字符串
共性操作:gettags(),find_withtag(),delete(),move()

13.3 图形的绘制
13.3.1 绘制矩形
create_rectangle(x0,y0,x1,y1,属性设置...)
outline,width,fill,dash(a,b)(虚线,a画多少个像素,b跳过多少个像素),state(是否可见)、itemconfig(设置属性)
可用坐标元组作参数

13.3.2 绘制椭圆
create_oval(x0,y0,x1,y1,属性设置...)
属性、方法类似

13.3.3 绘制圆弧
create_arc(x0,y0,x1,y1,属性设置...)
start,extent定义开始和结束的角度
style:PIESLICE扇 ARC弧 CHORD弓

13.3.4 绘制线条
create_line(x0,y0,x1,y1,...,xn,yn,属性设置...)
arrow:FIRST LAST BOTH
arrowshape

13.3.5 绘制多边形
create_polygon(x0,y0,x1,y1,...,属性设置...)

13.3.6 显示文本
create_text(x,y,属性设置...)
anchor锚点(E,S,W,N,CENTER,SE,SW,NW,NE)
justify:多行文本对齐
width
font:字体名称,大小,字形名称

13.3.7 显示图像
图像对象=PhotoImage(file=图像文件名)
c.create_image(x,y,image=图像对象,属性设置...)

13.4 图形的事件处理
1.事件绑定
c.bind()
c.tag_bind()
2.事件处理函数
3.主窗口事件循环
root.mainloop()


第14章 图形用户界面设计

14.1 创建图形用户界面的步骤
Tkinter
1.创建主窗口 root=Tk()
2.添加各种控件并设置属性(不一一例举了)
控件对象属性
config()
字典修改属性
3.调整对象的位置和大小 pack(),grid(),place()
4.为控件定义事件处理程序
5.进入主事件循环

14.2 常见控件的用法
14.2.1 标签和消息框
Label 
标签框架LabelFrame是容器控件
Message
aspect属性

14.2.2 按钮
Button
width,height,fg,bg,bd,state,command

14.2.3 复选框与单选按钮
Checkbutton
command
variable与IntVar或StringVar变量v相关联
v.get() v.set()

Radiobutton
command
共享同一个控制变量,且用value设置不同值,实现单选

14.2.4 文本框与框架
1.单行文本框
entry
textvariable与StringVar相关联
v.get()
show='*'
2.多行文本框
text
get(),delete(),insert(),replace()
1.0表示第一行第一列
INSERT CURRENT END SEL_FIRST

框架
Frame

14.2.5 列表框与滚动条
Listbox
insert()  ACTIVE END
delete()
size()
get()

Scrollbar
command
set()
列表框与滚动条绑定
列表框yscrollcommand为滚动条的set()
滚动条的command为列表框的yview()

14.2.6 可选项与刻度条
OptionMenu
StringVar的v绑定

Scale
from_ to resolution

14.2.7 菜单与顶层窗口
Memu
各种方法

上下文菜单
def popup(event)
    m.post(event.x_root,event.y_root)
root.bind('<Button-3>',popup)

顶层窗口
Toplevel

14.3 对象的布局方式
pack:side,fill,expand,ipadx/ipady,padx/pady
密铺
grid:row,column,sticky,rowspan,columnspan
二维表格
place:anchor,relx,rely,width,height,relwidth,relheight
指定位置坐标

14.4 对话框
自定义对话框 用一个顶层窗口
标准对话框:messagebox filedialog colorchooser

14.5 事件处理
14.5.1 事件处理程序
1.事件的描述
<修饰符>-<类型符>-<细节符>
2.事件对象
很多属性
3.事件处理函数的一般形式
def 函数名(event):
    函数体

14.5.2 事件绑定
4种
对象绑定和窗口绑定
控件对象.bind(事件描述符,事件处理程序)

类绑定和应用程序绑定
控件对象.bind_class(控件类描述符,事件描述符,事件处理程序)
控件对象.bind_all(事件描述符,事件处理程序)

键盘事件和焦点
focus_set()

 

第15章 综合程序设计

15.1 设计步骤
1.分析问题及确定解决方案
2.详细设计
3.编写程序
4.上机前程序静态检查
5.上机调试程序:测试数据,阅读理解程序
6.完成设计报告:问题描述,系统设计,系统调试,参考文献,附录

15.2 线性方程组的求解
NumPy函数库

15.3 Graphics图形库的应用
graphics基于tkinter
graphics.GraphWin()
Point,Line,Circle,Oval,Rectangle,Polygon,Text
draw(),setFill(),setOutline(),undraw(),clone(),move()

交互式图形操作
getMouse()
Entry输入对象
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值