Python 的 51 个秘密曝光,Github 获 20000 star

Pandas入门教程(二十二):股票数据分析实战——yfinance 获取数据、技术指标与收益率分析 把 Pandas 用在真实场景,才能体会它的价值。本文以茅台股票为例,用 yfinance 获取历史行情,完成缺失值处理与列筛选,绘制收盘价曲线,计算 SMA 移动平均线与 RSI 相对强弱指数,并通过日收益率、累计收益率和波动率完成完整的量化分析流程。 阅读详情

python, 是一个设计优美的解释型高级语言, 它提供了很多能让程序员感到舒适的功能特性. 但有的时候, Python 的一些输出结果对于初学者来说似乎并不是那么一目了然.

一个解析51项堪称是"秘密"的Python特性项目,在GitHub上彻底火了。

英文原版已经拿到了近15000星,中文翻译版也获得了7600+星。

Python 的 51 个秘密曝光,Github 获 20000 star

 

Python 的 51 个秘密曝光,Github 获 20000 star

 

这个有趣的项目意在收集 Python 中那些难以理解和反人类直觉的例子以及鲜为人知的功能特性, 并尝试讨论这些现象背后真正的原理!

Python 的 51 个秘密曝光,Github 获 20000 star

 

虽然下面的有些例子并不一定会让你觉得 WTFs, 但它们依然有可能会告诉你一些你所不知道的 Python 有趣特性. 我觉得这是一种学习编程语言内部原理的好办法, 而且我相信你也会从中获得乐趣!

如果您是一位经验比较丰富的 Python 程序员, 你可以尝试挑战看是否能一次就找到例子的正确答案. 你可能对其中的一些例子已经比较熟悉了, 那这也许能唤起你当年踩这些坑时的甜蜜回忆

这个项目的中文版全文大约2万字,干货多的快要溢出来了,大家可以先看一下目录。

Python 的 51 个秘密曝光,Github 获 20000 star

 

示例结构

所有示例的结构都如下所示:

Python 的 51 个秘密曝光,Github 获 20000 star

 

我个人建议, 最好依次阅读下面的示例, 并对每个示例:

  • 仔细阅读设置例子最开始的代码. 如果您是一位经验丰富的 Python 程序员, 那么大多数时候您都能成功预期到后面的结果.
  • 阅读输出结果,
    • 如果不知道, 深呼吸然后阅读说明 (如果你还是看不明白, 别沉默! 可以在这提个 issue).
    • 如果知道, 给自己点奖励, 然后去看下一个例子.
    • 确认结果是否如你所料.
    • 确认你是否知道这背后的原理.

PS: 你也可以在命令行阅读 WTFpython. 我们有 pypi 包 和 npm 包(支持代码高亮).(译: 这两个都是英文版的)

示例

Strings can be tricky sometimes/微妙的字符串

1、

>>> a = "some_string"

>>> id(a)

140420665652016

>>> id( "some" + "_" + "string" ) # 注意两个的id值是相同的.

140420665652016

2、

>>> a = "wtf"

>>> b = "wtf"

>>> a is b

True

>>> a = "wtf!"

>>> b = "wtf!"

>>> a is b

False

>>> a, b = "wtf!" , "wtf!"

>>> a is b # 仅适用于3.7版本以下, 3.7以后的返回结果为False.

True

3、

>>> 'a' * 20 is 'aaaaaaaaaaaaaaaaaaaa'

True

>>> 'a' * 21 is 'aaaaaaaaaaaaaaaaaaaaa'

False

说明:

  • 这些行为是由于 Cpython 在编译优化时, 某些情况下会尝试使用已经存在的不可变对象而不是每次都创建一个新对象. (这种行为被称作字符串的驻留[string interning])
  • 发生驻留之后, 许多变量可能指向内存中的相同字符串对象. (从而节省内存)
  • 在上面的代码中, 字符串是隐式驻留的. 何时发生隐式驻留则取决于具体的实现. 这里有一些方法可以用来猜测字符串是否会被驻留:
    • 所有长度为 0 和长度为 1 的字符串都被驻留.
    • 字符串在编译时被实现 ( 'wtf' 将被驻留, 但是 ''.join(['w', 't', 'f'] 将不会被驻留)
    • 字符串中只包含字母,数字或下划线时将会驻留. 所以 'wtf!' 由于包含 ! 而未被驻留. 可以在这里找到 CPython 对此规则的实现.

Python 的 51 个秘密曝光,Github 获 20000 star

 

  • 当在同一行将 a 和 b 的值设置为 "wtf!" 的时候, Python 解释器会创建一个新对象, 然后同时引用第二个变量(译: 仅适用于3.7以下, 详细情况请看这里). 如果你在不同的行上进行赋值操作, 它就不会“知道”已经有一个 wtf! 对象 (因为 "wtf!" 不是按照上面提到的方式被隐式驻留的). 它是一种编译器优化, 特别适用于交互式环境.
  • 常量折叠(constant folding) 是 Python 中的一种 窥孔优化(peephole optimization) 技术. 这意味着在编译时表达式 'a'*20 会被替换为 'aaaaaaaaaaaaaaaaaaaa' 以减少运行时的时钟周期. 只有长度小于 20 的字符串才会发生常量折叠. (为啥? 想象一下由于表达式 'a'*10**10 而生成的 .pyc 文件的大小). 相关的源码实现

https://github.com/python/cpython/blob/3.6/Python/peephole.c#L288

Time for some hash brownies!/是时候来点蛋糕了!

  • hash brownie指一种含有大麻成分的蛋糕, 所以这里是句双关

1、

some_dict = {}

some_dict[ 5.5 ] = "Ruby"

some_dict[ 5.0 ] = "JavaScript"

some_dict[ 5

] =

"Python"

Output:

>>> some_dict[ 5.5 ]

"Ruby"

>>> some_dict[ 5.0 ]

"Python"

>>> some_dict[ 5 ]

"Python"

"Python" 消除了 "JavaScript" 的存在?

说明:

  • Python 字典通过检查键值是否相等和比较哈希值来确定两个键是否相同.
  • 具有相同值的不可变对象在Python中始终具有相同的哈希值.

>>> 5 == 5.0

True

>>> hash( 5 ) == hash( 5.0 )

True

  • 注意: 具有不同值的对象也可能具有相同的哈希值(哈希冲突).
  • 当执行 some_dict[5] = "Python" 语句时, 因为Python将 5 和 5.0 识别为 some_dict 的同一个键, 所以已有值 "JavaScript" 就被 "Python" 覆盖了.
  • 这个 StackOverflow的 回答 漂亮的解释了这背后的基本原理.

https://stackoverflow.com/questions/32209155/why-can-a-floating-point-dictionary-key-overwrite-an-integer-key-with-the-same-v

Return return everywhere!/到处返回!

def some_func () :

try :

return 'from_try'

finally :

return

'from_finally'

Output:

>>> some_func()

'from_finally'

说明:

  • 当在 "try...finally" 语句的 try 中执行 return , break 或 continue 后, finally 子句依然会执行.
  • 函数的返回值由最后执行的 return 语句决定. 由于 finally 子句一定会执行, 所以 finally子句中的 return 将始终是最后执行的语句.

Deep down, we're all the same./本质上,我们都一样.

class WTF :

pass

Output:

>>> WTF() == WTF() # 两个不同的对象应该不相等

False

>>> WTF() is WTF() # 也不相同

False

>>> hash(WTF()) == hash(WTF()) # 哈希值也应该不同

True

>>> id(WTF()) == id(WTF())

True

说明:

  • 当调用 id 函数时, Python 创建了一个 WTF 类的对象并传给 id 函数. 然后 id 函数获取其id值 (也就是内存地址), 然后丢弃该对象. 该对象就被销毁了.
  • 当我们连续两次进行这个操作时, Python会将相同的内存地址分配给第二个对象. 因为 (在CPython中) id 函数使用对象的内存地址作为对象的id值, 所以两个对象的id值是相同的.
  • 综上, 对象的id值仅仅在对象的生命周期内唯一. 在对象被销毁之后, 或被创建之前, 其他对象可以具有相同的id值.
  • 那为什么 is 操作的结果为 False 呢? 让我们看看这段代码.

class WTF(object) :

def __init__ (self) : print( "I" )

def __del__ (self) :

print(

"D"

)

Output:

>>> WTF() is WTF()

I

I

D

D

False

>>> id(WTF()) == id(WTF())

I

D

I

D

True

正如你所看到的, 对象销毁的顺序是造成所有不同之处的原因.

For what?/为什么?

some_string = "wtf"

some_dict = {}

for i, some_dict[i] in enumerate(some_string):

pass

Output:

>>> some_dict # 创建了索引字典.

{ 0 : 'w' , 1 : 't' , 2

:

'f'

}

说明:

  • Python 语法 中对 for 的定义是:for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite]其中 exprlist 指分配目标. 这意味着对可迭代对象中的 每一项都会执行 类似 {exprlist} = {next_value} 的操作.一个有趣的例子说明了这一点:for i in range(4): print(i) i = 10Output:你可曾觉得这个循环只会运行一次?说明:
    • 由于循环在Python中工作方式, 赋值语句 i = 10 并不会影响迭代循环, 在每次迭代开始之前, 迭代器(这里指 range(4) ) 生成的下一个元素就被解包并赋值给目标列表的变量(这里指 i )了.
  • 在每一次的迭代中, enumerate(some_string) 函数就生成一个新值 i (计数器增加) 并从 some_string 中获取一个字符. 然后将字典 some_dict 键 i (刚刚分配的) 的值设为该字符. 本例中循环的展开可以简化为:
  • >>> i, some_dict[i] = (0, 'w') >>> i, some_dict[i] = (1, 't') >>> i, some_dict[i] = (2, 'f') >>> some_dict

Evaluation time discrepancy/执行时机差异

1、

array = [ 1 , 8 , 15 ]

g = (x for x in array if array.count(x) > 0 )

array = [ 2 , 8

,

22

]

Output:

>>> print(list(g))

[

8

]

2、

array_1 = [ 1 , 2 , 3 , 4 ]

g1 = (x for x in array_1)

array_1 = [ 1 , 2 , 3 , 4 , 5 ]

array_2 = [ 1 , 2 , 3 , 4 ]

g2 = (x for x in array_2)

array_2[:] = [ 1 , 2 , 3 , 4

,

5

]

Output:

>>> print(list(g1))

[ 1 , 2 , 3 , 4 ]

>>> print(list(g2))

[ 1 , 2 , 3 , 4

,

5

]

说明:

  • 在生成器表达式中, in 子句在声明时执行, 而条件子句则是在运行时执行.
  • 所以在运行前, array 已经被重新赋值为 [2, 8, 22] , 因此对于之前的 1 , 8 和 15 , 只有 count(8) 的结果是大于 0 的, 所以生成器只会生成 8 .
  • 第二部分中 g1 和 g2 的输出差异则是由于变量 array_1 和 array_2 被重新赋值的方式导致的.
  • 在第一种情况下, array_1 被绑定到新对象 [1,2,3,4,5] , 因为 in 子句是在声明时被执行的, 所以它仍然引用旧对象 [1,2,3,4] (并没有被销毁).
  • 在第二种情况下, 对 array_2 的切片赋值将相同的旧对象 [1,2,3,4] 原地更新为 [1,2,3,4,5] . 因此 g2 和 array_2 仍然引用同一个对象(这个对象现在已经更新为 [1,2,3,4,5] ).

本文内容来自中文版项目,项目全文2万多字,以及海量代码。

因为篇幅原因,本文就只为大家展示这6个案例了,更多案例大家可以在项目中查看。

英文版项目名称:wtfpython

链接: https://github.com/satwikkansal/wtfpython

中文项目名称:wtfpython-cn

链接: https://github.com/leisurelicht/wtfpython-cn

如何处理动态语言(Python / JS)的“隐形”调用链? 本文揭示动态语言(Python/JS)中静态AST解析导致调用链“断链”的核心问题,提出通过运行时追踪补全图谱的解决方案。基于Code-Graph-RAG的cgr trace机制,分别利用pytest插件与V8 Profiler捕获真实调用路径,将动态边合并至静态图谱,并在权重体系中提升动态边优先级。实践表明,该方法可显著提升图谱覆盖率,实现“结构+行为”双视角理解代码,为MCP与Rerank系统提供可靠支持。 阅读详情

相关推荐

【汇编】TSR内存驻留程序实现与删除及热键设置——以实现时钟为例

【汇编】TSR内存驻留程序实现与删除及热键设置——以实现时钟为例 最近完成了一个关于时钟中断驻留的汇编大作业,对于TSR很是感兴趣,查阅了不少资料,发现现在很少相关的内容资料。尤其是TSR删除这一块几乎找不到在低的水平完全正确的做法,下面我对于TSR的删除我会介绍一种几乎小程序可以完成的方法。当然,标题中的TSR实现,热键设置我也会一一介绍。

cly116的博客 3971

c++有趣的代码_Github开源python有趣的小例子一网打尽

简介python-small-examples 项目将Python有趣的小例子一网打尽。包括Python基础、Python坑点、Python字符串和正则、Python绘图、Python日期和文件、Web开发、数据科学、机器学习、深度学习、TensorFlow、Pytorch,一切都是简单易懂的小例子。告别枯燥,60秒学会一个小例子,系统学习Python,从入门到大师。总之,在这个Python小例子...

weixin_39875675的博客 467

【项目案例】前后端分离项目 【Web图书管理系统 】SpringBoot + Vue + Element UI + Mysql

Web图书管理系统

激流丶的博客 5397

Python-常见面试题

什么是Python Python是一种解释型语言,也就是说,它和C语言以及C的衍生语言不通,Python代码在运行之前不需要编译 Python是一种动态类型语言,指的是,你在声明变量时不需要指定变量的类型 Python让困难的事变的容易,因此程序员可以专注于算法和数据结构的设计,而不用处理底层的细节 Python用途非常广泛–网络应用,自动化,科学建模,大数据应用等等,它也常被用作“胶水语言”,...

奔跑的豆子的专栏 1079

Qt思岚激光雷达

Qt关于思岚激光雷达研究示例,本示例采用qt界面开发,可以串口也可以tcp进行设备连接。接收数据进行相关的数据进行绘图, 这种雷达可以用于大屏触摸场景,会场互动触摸场景开发。 #ifndef MAINWIDGET_H #define MAINWIDGET_H #include <QTimer> #include <QWidget> #include "lidarmgr.h" namespace Ui { class MainWidget; } class MainWidget.

cqltbe131421的博客 1598

鱼眼双目测距实战:从OpenCV标定到SGBM匹配的完整流程解析

本文详细解析了鱼眼双目测距的完整流程,从OpenCV标定到SGBM匹配,涵盖标定、校正、匹配和测距四个关键阶段。通过实战经验分享,帮助开发者解决鱼眼镜头强畸变带来的测距挑战,提升测距精度至5%以内。特别适合机器人导航、自动驾驶和VR领域的开发者参考。

weixin_27298377的博客 124

【Python】用 __all__ 暴露接口

Python 可以在模块级别暴露接口: __all__ = ["foo", "bar"] 很多时候这么做还是很有好处的…… 提供了哪些是公开接口的约定 不像 Ruby 或者 Java,Python 没有语言原生的可见性控制,而是靠一套需要大家自觉遵守的”约定“下工作。比如下划线开头的应该对外部不可见。同样,__all__ 也是对于模块公开接口的一种约定,比起下划线,_

维~小~尼 4935

Simulink+Simscape多体仿真:六自由度Stewart平台动力学建模全流程

本文详细介绍了使用Simulink和Simscape Multibody进行六自由度Stewart平台动力学建模的全流程,涵盖从CAD模型导入、运动学逆解计算到实时控制系统的设计。通过MATLAB/Simulink与Simscape的协同工作,实现高保真度的并联机器人仿真,适用于飞行模拟器、精密加工等高精度领域。

r2s3t4的博客 486

Python中令人迷惑的4个引用

第一个:执行时机的差异 1. array = [1, 8, 15] g = (x for x in array if array.count(x) > 0) array = [2, 8, 22] Output: >>> print(list(g)) [8] 2. array_1 = [1,2,3,4] g1 = (x for x in array_1)...

轻松学python的博客 287

openpi 入门教程(二)droid libero 训练、推理

OpenPI是由物理智能团队发布的机器人领域开源模型与软件平台,提供基于流扩散式(π₀)和自回归式(π₀-FAST)两类视觉-语言-动作模型。平台支持在DROID、ALOHA、UR5等多种机器人系统上部署,包含预训练检查点(1万+小时数据)和微调示例。文档详细说明了各平台部署流程:DROID需启动策略服务器并配置摄像头;ALOHA提供真实机器人任务(取吐司、叠毛巾等)的检查点和场景设置建议;UR5示例展示自定义数据转换方法。实验性验证显示π₀-FAST在LIBERO基准测试中平均得分85.5。平台强调模型适

2506_90492529的博客 1023

在 SAP S/4HANA 里把 OData Client Proxy 用顺手,借助 Service Consumption Model 2.0 提前打通远程 OData 调用

摘要:本文探讨了在SAP S/4HANA集成开发中调用外部OData服务的解决方案。传统ABAP代码直接调用方式存在诸多不便,而OData Client Proxy提供了更稳定的途径。文章详细介绍了如何通过Service Consumption Model 2.0在SAP BTP生成模型类,并将其移植到SAP S/4HANA进行适配改造,最终注册为可用的OData Proxy Client。该方法适用于较新版本的SAP S/4HANA系统,通过源码替换实现模型转换,为系统集成提供了高效的类型安全调用方案。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1092

51c大模型~合集111

OpenAI 的某发言人表示:「为了提高清晰度和安全性,我们增加了一个额外的后处理步骤,其中模型会审查原始的思维链,删除任何不安全的内容,然后简化某些复杂的思维。可以看到,虽然 ChatGPT 确实完成了任务并展示了总结版的思维链,但似乎并未如 OpenAI 发言人说的那样给出与提示词语言同样语言的总结版。北大-灵初联合实验室表示,Align-DS-V的多模态强推理能力是VLA模型大脑端的核心,接下来的研究训练计划,是利用多模态推理模型的跨模态穿透能力,实现action穿透,最终实现真正高效的VLA模型。

whaosoft~aiotの开发板商城 2317

60、拓扑码:从理论到应用

本博客深入探讨了拓扑码的基本理论、构造方法及其在量子计算中的应用。重点介绍了颜色码的拓扑起源、编码量子比特的计算方法、弦算子的构造与性质、边界条件的影响、同调描述以及与统计模型相关的错误阈值分析。同时,还涵盖了拓扑码的历史发展、与其他拓扑码的关系、与凝聚态系统的联系,以及其在激发态和高维中的表现。博客展示了拓扑码在容错量子计算和未来量子信息领域的广阔前景。

o1p2q3r的博客 129

【Reading Notes】(7)Favorite Articles from 2024

我可以毫不犹豫地告诉你们,你们所做的每一个决定、每一项努力、每一次招聘、取得的每一个成就,以及你们所塑造的公司文化,都将在接下来的30天内决定公司的命运——是充满活力、持续成功,还是走向破产。这种需要,具体而言,就是客户在模型上的选择,毕竟“没有一个模型可以一统天下”,每个模型都有自己所擅长的领域。这次,OpenAI着重介绍了Sora的几项功能:Remix(重混)、Re-cut(重新剪辑)、Storyboard(故事板)、Loop(循环)、Blend(混合)以及Style presets(风格预设)。

bryant_meng 9855

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

WTF python 中的执行时机差异

array = [1, 8, 15] g = (x for x in array if array.count(x) &gt; 0) array = [2, 8, 22] 以上代码输出[8] 首先明确 .count()表示的是子串在字符串中出现的次数 其次要知道,在生成器表达式中, in 子句在声明时执行, 而条件子句则是在运行时执行. 所以,只有当x = 8时, 才在[2,8,22]中...

hzz1993的博客 234

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

你不知道的Python(2)

今天我们来看看Python的另一个隐藏特性。 首先,我们先来看看如下一段代码: 在上面一段代码中,我们先声明一个list对象,名叫array,然后用一个生成器表达式赋值给g,最后将array重新赋值,那么如果我们把g的内容打印出来会是什么样的呢? 在打印g之前我们可以分析一下这个生成器表达式是要做什么:首先x for x in array是将array中的元素全都取出来,然后if arr...

HiIverson的博客 319

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

GitHub标星3.9K!223个Python小例子,一次让你吃个够!

大家好,我是程序员G哥,都说拳不离手,曲不离口,学习编程其实就跟练武一样,每个小白成长为大侠都需要经过不断的磨练,打怪升级,不断的增长经验值。而GitHub就是一个大的宝库,里面有各种武...

cainiao_python的博客 864

AI全栈实战 | 3.9-01 爬虫入门:requests 加 BeautifulSoup 三分钟跑通,但 90% 的人栽在这 4 个“礼貌“问题上

⚠️:本文内容仅用于。请遵守目标站点的服务条款与相关法律法规,不得对目标服务造成负担,不得采集、传播个人隐私数据。技术是中性的,边界在你手里。爬虫的入门技术(requests 发请求 + BeautifulSoup 解析)三分钟就能学会。真正区分"会用爬虫"和"会做爬虫的人"的,是这篇我们跑通"请求→解析→存储"的最小闭环,然后重点把"合规与礼貌"这根弦给你绷上。

源码获取 | 运行部署 | 定制二开修改,如果回复不及时请耐心等待,请见谅。 411

从一段视频到可漫游的 4D 有声场景:思路拆解与最小复现手记

只需一段手机视频,你就能生成可"走进去"的 4D 有声场景:转头时狗叫声方向随之变化,走近时声音更清晰。本文拆解 Video-to-4DAVScene 的核心思路,手把手带你用几十行 Python 搭出最小管线,把视频中的运动物体变成带空间位置的声源,并附上三个真实踩坑的排障经验,代码可直接跑。🎧

helloagent的博客 235

【每天一个 Python 小案例30】Python 基础知识综合小项目:我的工具盒

作为系列收官,本篇把前 29 篇的知识点合成一个能直接用的命令行工具"我的工具盒":计算器(用 ast 解析表达式,不碰 eval)、单位换算与温度转换(一张换算表 + 特例分支)、记账与分类统计(Decimal + JSON 持久化)、以及用"字典当命令表"把菜单和业务逻辑解耦的主循环。文中对比了 eval 的安全隐患与 ast 白名单的做法,解释了 lambda 闭包在字典里的写法与晚绑定陷阱,并在最后给出整个系列的知识地图,把变量、数据结构、控制流、函数、类、异常、文件、标准库八块内容对应到具体篇目。

xinjiyaya的博客 427

详解Python条件语句

在 Python 中,if...else 是一种条件语句,可以根据给定的条件执行不同的操作。这个语句通常用于控制程序的流程。

2601_96798737的博客 208

Python3 协程:异步编程的核心机制与实战

协程是解决I/O密集型任务等待瓶颈的高效机制,相比线程更轻量、无锁开销。从yield到async/await的演进,使异步编程语义清晰、易于理解。通过async/await可实现并发执行多个任务(如gather、create_task),显著提升网络请求、爬虫等场景性能。关键在于使用异步库(如aiohttp)替代同步库,避免阻塞事件循环。合理控制超时与并发数,才能发挥协程最大优势。

Lxn2zh的博客 159

二进制木马免杀-Python 分离免杀与 Web 挂马

二进制木马免杀-Python 分离免杀与 Web 挂马

2503_94637398的博客 268
上一篇: 必须收藏!23个Python爬虫开源项目代码:微信、淘宝、等
下一篇: TIOBE 12 月榜单:Java 重回第二,Python 有望四连冠年度语言
python588
博客等级 码龄7年 338粉丝 132原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值